diff --git a/backend/Temp/alc_runtime.js b/backend/Temp/alc_runtime.js
index a16fd57..89ccba9 100644
--- a/backend/Temp/alc_runtime.js
+++ b/backend/Temp/alc_runtime.js
@@ -70,7 +70,7 @@ var Bn=Object.defineProperty;var Vn=(n,e,t)=>e in n?Bn(n,e,{enumerable:!0,config
* Bootstrap v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */const elementMap=new Map,Data={set(n,e,t){elementMap.has(n)||elementMap.set(n,new Map);const r=elementMap.get(n);if(!r.has(e)&&r.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(r.keys())[0]}.`);return}r.set(e,t)},get(n,e){return elementMap.has(n)&&elementMap.get(n).get(e)||null},remove(n,e){if(!elementMap.has(n))return;const t=elementMap.get(n);t.delete(e),t.size===0&&elementMap.delete(n)}},MAX_UID=1e6,MILLISECONDS_MULTIPLIER=1e3,TRANSITION_END="transitionend",parseSelector=n=>(n&&window.CSS&&window.CSS.escape&&(n=n.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),n),toType=n=>n==null?`${n}`:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),getUID=n=>{do n+=Math.floor(Math.random()*MAX_UID);while(document.getElementById(n));return n},getTransitionDurationFromElement=n=>{if(!n)return 0;let{transitionDuration:e,transitionDelay:t}=window.getComputedStyle(n);const r=Number.parseFloat(e),i=Number.parseFloat(t);return!r&&!i?0:(e=e.split(",")[0],t=t.split(",")[0],(Number.parseFloat(e)+Number.parseFloat(t))*MILLISECONDS_MULTIPLIER)},triggerTransitionEnd=n=>{n.dispatchEvent(new Event(TRANSITION_END))},isElement=n=>!n||typeof n!="object"?!1:(typeof n.jquery<"u"&&(n=n[0]),typeof n.nodeType<"u"),getElement=n=>isElement(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(parseSelector(n)):null,isVisible=n=>{if(!isElement(n)||n.getClientRects().length===0)return!1;const e=getComputedStyle(n).getPropertyValue("visibility")==="visible",t=n.closest("details:not([open])");if(!t)return e;if(t!==n){const r=n.closest("summary");if(r&&r.parentNode!==t||r===null)return!1}return e},isDisabled=n=>!n||n.nodeType!==Node.ELEMENT_NODE||n.classList.contains("disabled")?!0:typeof n.disabled<"u"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",findShadowRoot=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){const e=n.getRootNode();return e instanceof ShadowRoot?e:null}return n instanceof ShadowRoot?n:n.parentNode?findShadowRoot(n.parentNode):null},noop=()=>{},reflow=n=>{n.offsetHeight},getjQuery=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,DOMContentLoadedCallbacks=[],onDOMContentLoaded=n=>{document.readyState==="loading"?(DOMContentLoadedCallbacks.length||document.addEventListener("DOMContentLoaded",()=>{for(const e of DOMContentLoadedCallbacks)e()}),DOMContentLoadedCallbacks.push(n)):n()},isRTL=()=>document.documentElement.dir==="rtl",defineJQueryPlugin=n=>{onDOMContentLoaded(()=>{const e=getjQuery();if(e){const t=n.NAME,r=e.fn[t];e.fn[t]=n.jQueryInterface,e.fn[t].Constructor=n,e.fn[t].noConflict=()=>(e.fn[t]=r,n.jQueryInterface)}})},execute=(n,e=[],t=n)=>typeof n=="function"?n(...e):t,executeAfterTransition=(n,e,t=!0)=>{if(!t){execute(n);return}const r=5,i=getTransitionDurationFromElement(e)+r;let s=!1;const l=({target:u})=>{u===e&&(s=!0,e.removeEventListener(TRANSITION_END,l),execute(n))};e.addEventListener(TRANSITION_END,l),setTimeout(()=>{s||triggerTransitionEnd(e)},i)},getNextActiveElement=(n,e,t,r)=>{const i=n.length;let s=n.indexOf(e);return s===-1?!t&&r?n[i-1]:n[0]:(s+=t?1:-1,r&&(s=(s+i)%i),n[Math.max(0,Math.min(s,i-1))])},namespaceRegex=/[^.]*(?=\..*)\.|.*/,stripNameRegex=/\..*/,stripUidRegex=/::\d+$/,eventRegistry={};let uidEvent=1;const customEvents={mouseenter:"mouseover",mouseleave:"mouseout"},nativeEvents=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function makeEventUid(n,e){return e&&`${e}::${uidEvent++}`||n.uidEvent||uidEvent++}function getElementEvents(n){const e=makeEventUid(n);return n.uidEvent=e,eventRegistry[e]=eventRegistry[e]||{},eventRegistry[e]}function bootstrapHandler(n,e){return function t(r){return hydrateObj(r,{delegateTarget:n}),t.oneOff&&EventHandler.off(n,r.type,e),e.apply(n,[r])}}function bootstrapDelegationHandler(n,e,t){return function r(i){const s=n.querySelectorAll(e);for(let{target:l}=i;l&&l!==this;l=l.parentNode)for(const u of s)if(u===l)return hydrateObj(i,{delegateTarget:l}),r.oneOff&&EventHandler.off(n,i.type,e,t),t.apply(l,[i])}}function findHandler(n,e,t=null){return Object.values(n).find(r=>r.callable===e&&r.delegationSelector===t)}function normalizeParameters(n,e,t){const r=typeof e=="string",i=r?t:e||t;let s=getTypeEvent(n);return nativeEvents.has(s)||(s=n),[r,i,s]}function addHandler(n,e,t,r,i){if(typeof e!="string"||!n)return;let[s,l,u]=normalizeParameters(e,t,r);e in customEvents&&(l=(T=>function(w){if(!w.relatedTarget||w.relatedTarget!==w.delegateTarget&&!w.delegateTarget.contains(w.relatedTarget))return T.call(this,w)})(l));const h=getElementEvents(n),p=h[u]||(h[u]={}),E=findHandler(p,l,s?t:null);if(E){E.oneOff=E.oneOff&&i;return}const _=makeEventUid(l,e.replace(namespaceRegex,"")),S=s?bootstrapDelegationHandler(n,t,l):bootstrapHandler(n,l);S.delegationSelector=s?t:null,S.callable=l,S.oneOff=i,S.uidEvent=_,p[_]=S,n.addEventListener(u,S,s)}function removeHandler(n,e,t,r,i){const s=findHandler(e[t],r,i);s&&(n.removeEventListener(t,s,!!i),delete e[t][s.uidEvent])}function removeNamespacedHandlers(n,e,t,r){const i=e[t]||{};for(const[s,l]of Object.entries(i))s.includes(r)&&removeHandler(n,e,t,l.callable,l.delegationSelector)}function getTypeEvent(n){return n=n.replace(stripNameRegex,""),customEvents[n]||n}const EventHandler={on(n,e,t,r){addHandler(n,e,t,r,!1)},one(n,e,t,r){addHandler(n,e,t,r,!0)},off(n,e,t,r){if(typeof e!="string"||!n)return;const[i,s,l]=normalizeParameters(e,t,r),u=l!==e,h=getElementEvents(n),p=h[l]||{},E=e.startsWith(".");if(typeof s<"u"){if(!Object.keys(p).length)return;removeHandler(n,h,l,s,i?t:null);return}if(E)for(const _ of Object.keys(h))removeNamespacedHandlers(n,h,_,e.slice(1));for(const[_,S]of Object.entries(p)){const N=_.replace(stripUidRegex,"");(!u||e.includes(N))&&removeHandler(n,h,l,S.callable,S.delegationSelector)}},trigger(n,e,t){if(typeof e!="string"||!n)return null;const r=getjQuery(),i=getTypeEvent(e),s=e!==i;let l=null,u=!0,h=!0,p=!1;s&&r&&(l=r.Event(e,t),r(n).trigger(l),u=!l.isPropagationStopped(),h=!l.isImmediatePropagationStopped(),p=l.isDefaultPrevented());const E=hydrateObj(new Event(e,{bubbles:u,cancelable:!0}),t);return p&&E.preventDefault(),h&&n.dispatchEvent(E),E.defaultPrevented&&l&&l.preventDefault(),E}};function hydrateObj(n,e={}){for(const[t,r]of Object.entries(e))try{n[t]=r}catch{Object.defineProperty(n,t,{configurable:!0,get(){return r}})}return n}function normalizeData(n){if(n==="true")return!0;if(n==="false")return!1;if(n===Number(n).toString())return Number(n);if(n===""||n==="null")return null;if(typeof n!="string")return n;try{return JSON.parse(decodeURIComponent(n))}catch{return n}}function normalizeDataKey(n){return n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}const Manipulator={setDataAttribute(n,e,t){n.setAttribute(`data-bs-${normalizeDataKey(e)}`,t)},removeDataAttribute(n,e){n.removeAttribute(`data-bs-${normalizeDataKey(e)}`)},getDataAttributes(n){if(!n)return{};const e={},t=Object.keys(n.dataset).filter(r=>r.startsWith("bs")&&!r.startsWith("bsConfig"));for(const r of t){let i=r.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=normalizeData(n.dataset[r])}return e},getDataAttribute(n,e){return normalizeData(n.getAttribute(`data-bs-${normalizeDataKey(e)}`))}};class Config{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){const r=isElement(t)?Manipulator.getDataAttribute(t,"config"):{};return{...this.constructor.Default,...typeof r=="object"?r:{},...isElement(t)?Manipulator.getDataAttributes(t):{},...typeof e=="object"?e:{}}}_typeCheckConfig(e,t=this.constructor.DefaultType){for(const[r,i]of Object.entries(t)){const s=e[r],l=isElement(s)?"element":toType(s);if(!new RegExp(i).test(l))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${r}" provided type "${l}" but expected type "${i}".`)}}}const VERSION="5.3.3";class BaseComponent extends Config{constructor(e,t){super(),e=getElement(e),e&&(this._element=e,this._config=this._getConfig(t),Data.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Data.remove(this._element,this.constructor.DATA_KEY),EventHandler.off(this._element,this.constructor.EVENT_KEY);for(const e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,r=!0){executeAfterTransition(e,t,r)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return Data.get(getElement(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return VERSION}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}}const getSelector=n=>{let e=n.getAttribute("data-bs-target");if(!e||e==="#"){let t=n.getAttribute("href");if(!t||!t.includes("#")&&!t.startsWith("."))return null;t.includes("#")&&!t.startsWith("#")&&(t=`#${t.split("#")[1]}`),e=t&&t!=="#"?t.trim():null}return e?e.split(",").map(t=>parseSelector(t)).join(","):null},SelectorEngine={find(n,e=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(e,n))},findOne(n,e=document.documentElement){return Element.prototype.querySelector.call(e,n)},children(n,e){return[].concat(...n.children).filter(t=>t.matches(e))},parents(n,e){const t=[];let r=n.parentNode.closest(e);for(;r;)t.push(r),r=r.parentNode.closest(e);return t},prev(n,e){let t=n.previousElementSibling;for(;t;){if(t.matches(e))return[t];t=t.previousElementSibling}return[]},next(n,e){let t=n.nextElementSibling;for(;t;){if(t.matches(e))return[t];t=t.nextElementSibling}return[]},focusableChildren(n){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,n).filter(t=>!isDisabled(t)&&isVisible(t))},getSelectorFromElement(n){const e=getSelector(n);return e&&SelectorEngine.findOne(e)?e:null},getElementFromSelector(n){const e=getSelector(n);return e?SelectorEngine.findOne(e):null},getMultipleElementsFromSelector(n){const e=getSelector(n);return e?SelectorEngine.find(e):[]}},enableDismissTrigger=(n,e="hide")=>{const t=`click.dismiss${n.EVENT_KEY}`,r=n.NAME;EventHandler.on(document,t,`[data-bs-dismiss="${r}"]`,function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),isDisabled(this))return;const s=SelectorEngine.getElementFromSelector(this)||this.closest(`.${r}`);n.getOrCreateInstance(s)[e]()})},NAME$f="alert",DATA_KEY$a="bs.alert",EVENT_KEY$b=`.${DATA_KEY$a}`,EVENT_CLOSE=`close${EVENT_KEY$b}`,EVENT_CLOSED=`closed${EVENT_KEY$b}`,CLASS_NAME_FADE$5="fade",CLASS_NAME_SHOW$8="show";class Alert extends BaseComponent{static get NAME(){return NAME$f}close(){if(EventHandler.trigger(this._element,EVENT_CLOSE).defaultPrevented)return;this._element.classList.remove(CLASS_NAME_SHOW$8);const t=this._element.classList.contains(CLASS_NAME_FADE$5);this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),EventHandler.trigger(this._element,EVENT_CLOSED),this.dispose()}static jQueryInterface(e){return this.each(function(){const t=Alert.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}enableDismissTrigger(Alert,"close");defineJQueryPlugin(Alert);const NAME$e="button",DATA_KEY$9="bs.button",EVENT_KEY$a=`.${DATA_KEY$9}`,DATA_API_KEY$6=".data-api",CLASS_NAME_ACTIVE$3="active",SELECTOR_DATA_TOGGLE$5='[data-bs-toggle="button"]',EVENT_CLICK_DATA_API$6=`click${EVENT_KEY$a}${DATA_API_KEY$6}`;class Button extends BaseComponent{static get NAME(){return NAME$e}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(CLASS_NAME_ACTIVE$3))}static jQueryInterface(e){return this.each(function(){const t=Button.getOrCreateInstance(this);e==="toggle"&&t[e]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API$6,SELECTOR_DATA_TOGGLE$5,n=>{n.preventDefault();const e=n.target.closest(SELECTOR_DATA_TOGGLE$5);Button.getOrCreateInstance(e).toggle()});defineJQueryPlugin(Button);const NAME$d="swipe",EVENT_KEY$9=".bs.swipe",EVENT_TOUCHSTART=`touchstart${EVENT_KEY$9}`,EVENT_TOUCHMOVE=`touchmove${EVENT_KEY$9}`,EVENT_TOUCHEND=`touchend${EVENT_KEY$9}`,EVENT_POINTERDOWN=`pointerdown${EVENT_KEY$9}`,EVENT_POINTERUP=`pointerup${EVENT_KEY$9}`,POINTER_TYPE_TOUCH="touch",POINTER_TYPE_PEN="pen",CLASS_NAME_POINTER_EVENT="pointer-event",SWIPE_THRESHOLD=40,Default$c={endCallback:null,leftCallback:null,rightCallback:null},DefaultType$c={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Swipe extends Config{constructor(e,t){super(),this._element=e,!(!e||!Swipe.isSupported())&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return Default$c}static get DefaultType(){return DefaultType$c}static get NAME(){return NAME$d}dispose(){EventHandler.off(this._element,EVENT_KEY$9)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),execute(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){const e=Math.abs(this._deltaX);if(e<=SWIPE_THRESHOLD)return;const t=e/this._deltaX;this._deltaX=0,t&&execute(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(EventHandler.on(this._element,EVENT_POINTERDOWN,e=>this._start(e)),EventHandler.on(this._element,EVENT_POINTERUP,e=>this._end(e)),this._element.classList.add(CLASS_NAME_POINTER_EVENT)):(EventHandler.on(this._element,EVENT_TOUCHSTART,e=>this._start(e)),EventHandler.on(this._element,EVENT_TOUCHMOVE,e=>this._move(e)),EventHandler.on(this._element,EVENT_TOUCHEND,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===POINTER_TYPE_PEN||e.pointerType===POINTER_TYPE_TOUCH)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const NAME$c="carousel",DATA_KEY$8="bs.carousel",EVENT_KEY$8=`.${DATA_KEY$8}`,DATA_API_KEY$5=".data-api",ARROW_LEFT_KEY$1="ArrowLeft",ARROW_RIGHT_KEY$1="ArrowRight",TOUCHEVENT_COMPAT_WAIT=500,ORDER_NEXT="next",ORDER_PREV="prev",DIRECTION_LEFT="left",DIRECTION_RIGHT="right",EVENT_SLIDE=`slide${EVENT_KEY$8}`,EVENT_SLID=`slid${EVENT_KEY$8}`,EVENT_KEYDOWN$1=`keydown${EVENT_KEY$8}`,EVENT_MOUSEENTER$1=`mouseenter${EVENT_KEY$8}`,EVENT_MOUSELEAVE$1=`mouseleave${EVENT_KEY$8}`,EVENT_DRAG_START=`dragstart${EVENT_KEY$8}`,EVENT_LOAD_DATA_API$3=`load${EVENT_KEY$8}${DATA_API_KEY$5}`,EVENT_CLICK_DATA_API$5=`click${EVENT_KEY$8}${DATA_API_KEY$5}`,CLASS_NAME_CAROUSEL="carousel",CLASS_NAME_ACTIVE$2="active",CLASS_NAME_SLIDE="slide",CLASS_NAME_END="carousel-item-end",CLASS_NAME_START="carousel-item-start",CLASS_NAME_NEXT="carousel-item-next",CLASS_NAME_PREV="carousel-item-prev",SELECTOR_ACTIVE=".active",SELECTOR_ITEM=".carousel-item",SELECTOR_ACTIVE_ITEM=SELECTOR_ACTIVE+SELECTOR_ITEM,SELECTOR_ITEM_IMG=".carousel-item img",SELECTOR_INDICATORS=".carousel-indicators",SELECTOR_DATA_SLIDE="[data-bs-slide], [data-bs-slide-to]",SELECTOR_DATA_RIDE='[data-bs-ride="carousel"]',KEY_TO_DIRECTION={[ARROW_LEFT_KEY$1]:DIRECTION_RIGHT,[ARROW_RIGHT_KEY$1]:DIRECTION_LEFT},Default$b={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},DefaultType$b={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Carousel extends BaseComponent{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=SelectorEngine.findOne(SELECTOR_INDICATORS,this._element),this._addEventListeners(),this._config.ride===CLASS_NAME_CAROUSEL&&this.cycle()}static get Default(){return Default$b}static get DefaultType(){return DefaultType$b}static get NAME(){return NAME$c}next(){this._slide(ORDER_NEXT)}nextWhenVisible(){!document.hidden&&isVisible(this._element)&&this.next()}prev(){this._slide(ORDER_PREV)}pause(){this._isSliding&&triggerTransitionEnd(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.cycle());return}this.cycle()}}to(e){const t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.to(e));return}const r=this._getItemIndex(this._getActive());if(r===e)return;const i=e>r?ORDER_NEXT:ORDER_PREV;this._slide(i,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&EventHandler.on(this._element,EVENT_KEYDOWN$1,e=>this._keydown(e)),this._config.pause==="hover"&&(EventHandler.on(this._element,EVENT_MOUSEENTER$1,()=>this.pause()),EventHandler.on(this._element,EVENT_MOUSELEAVE$1,()=>this._maybeEnableCycle())),this._config.touch&&Swipe.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const r of SelectorEngine.find(SELECTOR_ITEM_IMG,this._element))EventHandler.on(r,EVENT_DRAG_START,i=>i.preventDefault());const t={leftCallback:()=>this._slide(this._directionToOrder(DIRECTION_LEFT)),rightCallback:()=>this._slide(this._directionToOrder(DIRECTION_RIGHT)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),TOUCHEVENT_COMPAT_WAIT+this._config.interval))}};this._swipeHelper=new Swipe(this._element,t)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=KEY_TO_DIRECTION[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;const t=SelectorEngine.findOne(SELECTOR_ACTIVE,this._indicatorsElement);t.classList.remove(CLASS_NAME_ACTIVE$2),t.removeAttribute("aria-current");const r=SelectorEngine.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);r&&(r.classList.add(CLASS_NAME_ACTIVE$2),r.setAttribute("aria-current","true"))}_updateInterval(){const e=this._activeElement||this._getActive();if(!e)return;const t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;const r=this._getActive(),i=e===ORDER_NEXT,s=t||getNextActiveElement(this._getItems(),r,i,this._config.wrap);if(s===r)return;const l=this._getItemIndex(s),u=N=>EventHandler.trigger(this._element,N,{relatedTarget:s,direction:this._orderToDirection(e),from:this._getItemIndex(r),to:l});if(u(EVENT_SLIDE).defaultPrevented||!r||!s)return;const p=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(l),this._activeElement=s;const E=i?CLASS_NAME_START:CLASS_NAME_END,_=i?CLASS_NAME_NEXT:CLASS_NAME_PREV;s.classList.add(_),reflow(s),r.classList.add(E),s.classList.add(E);const S=()=>{s.classList.remove(E,_),s.classList.add(CLASS_NAME_ACTIVE$2),r.classList.remove(CLASS_NAME_ACTIVE$2,_,E),this._isSliding=!1,u(EVENT_SLID)};this._queueCallback(S,r,this._isAnimated()),p&&this.cycle()}_isAnimated(){return this._element.classList.contains(CLASS_NAME_SLIDE)}_getActive(){return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM,this._element)}_getItems(){return SelectorEngine.find(SELECTOR_ITEM,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return isRTL()?e===DIRECTION_LEFT?ORDER_PREV:ORDER_NEXT:e===DIRECTION_LEFT?ORDER_NEXT:ORDER_PREV}_orderToDirection(e){return isRTL()?e===ORDER_PREV?DIRECTION_LEFT:DIRECTION_RIGHT:e===ORDER_PREV?DIRECTION_RIGHT:DIRECTION_LEFT}static jQueryInterface(e){return this.each(function(){const t=Carousel.getOrCreateInstance(this,e);if(typeof e=="number"){t.to(e);return}if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$5,SELECTOR_DATA_SLIDE,function(n){const e=SelectorEngine.getElementFromSelector(this);if(!e||!e.classList.contains(CLASS_NAME_CAROUSEL))return;n.preventDefault();const t=Carousel.getOrCreateInstance(e),r=this.getAttribute("data-bs-slide-to");if(r){t.to(r),t._maybeEnableCycle();return}if(Manipulator.getDataAttribute(this,"slide")==="next"){t.next(),t._maybeEnableCycle();return}t.prev(),t._maybeEnableCycle()});EventHandler.on(window,EVENT_LOAD_DATA_API$3,()=>{const n=SelectorEngine.find(SELECTOR_DATA_RIDE);for(const e of n)Carousel.getOrCreateInstance(e)});defineJQueryPlugin(Carousel);const NAME$b="collapse",DATA_KEY$7="bs.collapse",EVENT_KEY$7=`.${DATA_KEY$7}`,DATA_API_KEY$4=".data-api",EVENT_SHOW$6=`show${EVENT_KEY$7}`,EVENT_SHOWN$6=`shown${EVENT_KEY$7}`,EVENT_HIDE$6=`hide${EVENT_KEY$7}`,EVENT_HIDDEN$6=`hidden${EVENT_KEY$7}`,EVENT_CLICK_DATA_API$4=`click${EVENT_KEY$7}${DATA_API_KEY$4}`,CLASS_NAME_SHOW$7="show",CLASS_NAME_COLLAPSE="collapse",CLASS_NAME_COLLAPSING="collapsing",CLASS_NAME_COLLAPSED="collapsed",CLASS_NAME_DEEPER_CHILDREN=`:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`,CLASS_NAME_HORIZONTAL="collapse-horizontal",WIDTH="width",HEIGHT="height",SELECTOR_ACTIVES=".collapse.show, .collapse.collapsing",SELECTOR_DATA_TOGGLE$4='[data-bs-toggle="collapse"]',Default$a={parent:null,toggle:!0},DefaultType$a={parent:"(null|element)",toggle:"boolean"};class Collapse extends BaseComponent{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];const r=SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);for(const i of r){const s=SelectorEngine.getSelectorFromElement(i),l=SelectorEngine.find(s).filter(u=>u===this._element);s!==null&&l.length&&this._triggerArray.push(i)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Default$a}static get DefaultType(){return DefaultType$a}static get NAME(){return NAME$b}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(u=>u!==this._element).map(u=>Collapse.getOrCreateInstance(u,{toggle:!1}))),e.length&&e[0]._isTransitioning||EventHandler.trigger(this._element,EVENT_SHOW$6).defaultPrevented)return;for(const u of e)u.hide();const r=this._getDimension();this._element.classList.remove(CLASS_NAME_COLLAPSE),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.style[r]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7),this._element.style[r]="",EventHandler.trigger(this._element,EVENT_SHOWN$6)},l=`scroll${r[0].toUpperCase()+r.slice(1)}`;this._queueCallback(i,this._element,!0),this._element.style[r]=`${this._element[l]}px`}hide(){if(this._isTransitioning||!this._isShown()||EventHandler.trigger(this._element,EVENT_HIDE$6).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,reflow(this._element),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.classList.remove(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7);for(const i of this._triggerArray){const s=SelectorEngine.getElementFromSelector(i);s&&!this._isShown(s)&&this._addAriaAndCollapsedClass([i],!1)}this._isTransitioning=!0;const r=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE),EventHandler.trigger(this._element,EVENT_HIDDEN$6)};this._element.style[t]="",this._queueCallback(r,this._element,!0)}_isShown(e=this._element){return e.classList.contains(CLASS_NAME_SHOW$7)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=getElement(e.parent),e}_getDimension(){return this._element.classList.contains(CLASS_NAME_HORIZONTAL)?WIDTH:HEIGHT}_initializeChildren(){if(!this._config.parent)return;const e=this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);for(const t of e){const r=SelectorEngine.getElementFromSelector(t);r&&this._addAriaAndCollapsedClass([t],this._isShown(r))}}_getFirstLevelChildren(e){const t=SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN,this._config.parent);return SelectorEngine.find(e,this._config.parent).filter(r=>!t.includes(r))}_addAriaAndCollapsedClass(e,t){if(e.length)for(const r of e)r.classList.toggle(CLASS_NAME_COLLAPSED,!t),r.setAttribute("aria-expanded",t)}static jQueryInterface(e){const t={};return typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){const r=Collapse.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof r[e]>"u")throw new TypeError(`No method named "${e}"`);r[e]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$4,SELECTOR_DATA_TOGGLE$4,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();for(const e of SelectorEngine.getMultipleElementsFromSelector(this))Collapse.getOrCreateInstance(e,{toggle:!1}).toggle()});defineJQueryPlugin(Collapse);const NAME$a="dropdown",DATA_KEY$6="bs.dropdown",EVENT_KEY$6=`.${DATA_KEY$6}`,DATA_API_KEY$3=".data-api",ESCAPE_KEY$2="Escape",TAB_KEY$1="Tab",ARROW_UP_KEY$1="ArrowUp",ARROW_DOWN_KEY$1="ArrowDown",RIGHT_MOUSE_BUTTON=2,EVENT_HIDE$5=`hide${EVENT_KEY$6}`,EVENT_HIDDEN$5=`hidden${EVENT_KEY$6}`,EVENT_SHOW$5=`show${EVENT_KEY$6}`,EVENT_SHOWN$5=`shown${EVENT_KEY$6}`,EVENT_CLICK_DATA_API$3=`click${EVENT_KEY$6}${DATA_API_KEY$3}`,EVENT_KEYDOWN_DATA_API=`keydown${EVENT_KEY$6}${DATA_API_KEY$3}`,EVENT_KEYUP_DATA_API=`keyup${EVENT_KEY$6}${DATA_API_KEY$3}`,CLASS_NAME_SHOW$6="show",CLASS_NAME_DROPUP="dropup",CLASS_NAME_DROPEND="dropend",CLASS_NAME_DROPSTART="dropstart",CLASS_NAME_DROPUP_CENTER="dropup-center",CLASS_NAME_DROPDOWN_CENTER="dropdown-center",SELECTOR_DATA_TOGGLE$3='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',SELECTOR_DATA_TOGGLE_SHOWN=`${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`,SELECTOR_MENU=".dropdown-menu",SELECTOR_NAVBAR=".navbar",SELECTOR_NAVBAR_NAV=".navbar-nav",SELECTOR_VISIBLE_ITEMS=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",PLACEMENT_TOP=isRTL()?"top-end":"top-start",PLACEMENT_TOPEND=isRTL()?"top-start":"top-end",PLACEMENT_BOTTOM=isRTL()?"bottom-end":"bottom-start",PLACEMENT_BOTTOMEND=isRTL()?"bottom-start":"bottom-end",PLACEMENT_RIGHT=isRTL()?"left-start":"right-start",PLACEMENT_LEFT=isRTL()?"right-start":"left-start",PLACEMENT_TOPCENTER="top",PLACEMENT_BOTTOMCENTER="bottom",Default$9={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},DefaultType$9={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Dropdown extends BaseComponent{constructor(e,t){super(e,t),this._popper=null,this._parent=this._element.parentNode,this._menu=SelectorEngine.next(this._element,SELECTOR_MENU)[0]||SelectorEngine.prev(this._element,SELECTOR_MENU)[0]||SelectorEngine.findOne(SELECTOR_MENU,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Default$9}static get DefaultType(){return DefaultType$9}static get NAME(){return NAME$a}toggle(){return this._isShown()?this.hide():this.show()}show(){if(isDisabled(this._element)||this._isShown())return;const e={relatedTarget:this._element};if(!EventHandler.trigger(this._element,EVENT_SHOW$5,e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(SELECTOR_NAVBAR_NAV))for(const r of[].concat(...document.body.children))EventHandler.on(r,"mouseover",noop);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(CLASS_NAME_SHOW$6),this._element.classList.add(CLASS_NAME_SHOW$6),EventHandler.trigger(this._element,EVENT_SHOWN$5,e)}}hide(){if(isDisabled(this._element)||!this._isShown())return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!EventHandler.trigger(this._element,EVENT_HIDE$5,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(const r of[].concat(...document.body.children))EventHandler.off(r,"mouseover",noop);this._popper&&this._popper.destroy(),this._menu.classList.remove(CLASS_NAME_SHOW$6),this._element.classList.remove(CLASS_NAME_SHOW$6),this._element.setAttribute("aria-expanded","false"),Manipulator.removeDataAttribute(this._menu,"popper"),EventHandler.trigger(this._element,EVENT_HIDDEN$5,e)}}_getConfig(e){if(e=super._getConfig(e),typeof e.reference=="object"&&!isElement(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(){if(typeof Popper>"u")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;this._config.reference==="parent"?e=this._parent:isElement(this._config.reference)?e=getElement(this._config.reference):typeof this._config.reference=="object"&&(e=this._config.reference);const t=this._getPopperConfig();this._popper=createPopper(e,this._menu,t)}_isShown(){return this._menu.classList.contains(CLASS_NAME_SHOW$6)}_getPlacement(){const e=this._parent;if(e.classList.contains(CLASS_NAME_DROPEND))return PLACEMENT_RIGHT;if(e.classList.contains(CLASS_NAME_DROPSTART))return PLACEMENT_LEFT;if(e.classList.contains(CLASS_NAME_DROPUP_CENTER))return PLACEMENT_TOPCENTER;if(e.classList.contains(CLASS_NAME_DROPDOWN_CENTER))return PLACEMENT_BOTTOMCENTER;const t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(CLASS_NAME_DROPUP)?t?PLACEMENT_TOPEND:PLACEMENT_TOP:t?PLACEMENT_BOTTOMEND:PLACEMENT_BOTTOM}_detectNavbar(){return this._element.closest(SELECTOR_NAVBAR)!==null}_getOffset(){const{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(Manipulator.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...execute(this._config.popperConfig,[e])}}_selectMenuItem({key:e,target:t}){const r=SelectorEngine.find(SELECTOR_VISIBLE_ITEMS,this._menu).filter(i=>isVisible(i));r.length&&getNextActiveElement(r,t,e===ARROW_DOWN_KEY$1,!r.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){const t=Dropdown.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e.button===RIGHT_MOUSE_BUTTON||e.type==="keyup"&&e.key!==TAB_KEY$1)return;const t=SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);for(const r of t){const i=Dropdown.getInstance(r);if(!i||i._config.autoClose===!1)continue;const s=e.composedPath(),l=s.includes(i._menu);if(s.includes(i._element)||i._config.autoClose==="inside"&&!l||i._config.autoClose==="outside"&&l||i._menu.contains(e.target)&&(e.type==="keyup"&&e.key===TAB_KEY$1||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;const u={relatedTarget:i._element};e.type==="click"&&(u.clickEvent=e),i._completeHide(u)}}static dataApiKeydownHandler(e){const t=/input|textarea/i.test(e.target.tagName),r=e.key===ESCAPE_KEY$2,i=[ARROW_UP_KEY$1,ARROW_DOWN_KEY$1].includes(e.key);if(!i&&!r||t&&!r)return;e.preventDefault();const s=this.matches(SELECTOR_DATA_TOGGLE$3)?this:SelectorEngine.prev(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.next(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3,e.delegateTarget.parentNode),l=Dropdown.getOrCreateInstance(s);if(i){e.stopPropagation(),l.show(),l._selectMenuItem(e);return}l._isShown()&&(e.stopPropagation(),l.hide(),s.focus())}}EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_DATA_TOGGLE$3,Dropdown.dataApiKeydownHandler);EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_MENU,Dropdown.dataApiKeydownHandler);EventHandler.on(document,EVENT_CLICK_DATA_API$3,Dropdown.clearMenus);EventHandler.on(document,EVENT_KEYUP_DATA_API,Dropdown.clearMenus);EventHandler.on(document,EVENT_CLICK_DATA_API$3,SELECTOR_DATA_TOGGLE$3,function(n){n.preventDefault(),Dropdown.getOrCreateInstance(this).toggle()});defineJQueryPlugin(Dropdown);const NAME$9="backdrop",CLASS_NAME_FADE$4="fade",CLASS_NAME_SHOW$5="show",EVENT_MOUSEDOWN=`mousedown.bs.${NAME$9}`,Default$8={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},DefaultType$8={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Backdrop extends Config{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return Default$8}static get DefaultType(){return DefaultType$8}static get NAME(){return NAME$9}show(e){if(!this._config.isVisible){execute(e);return}this._append();const t=this._getElement();this._config.isAnimated&&reflow(t),t.classList.add(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{execute(e)})}hide(e){if(!this._config.isVisible){execute(e);return}this._getElement().classList.remove(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{this.dispose(),execute(e)})}dispose(){this._isAppended&&(EventHandler.off(this._element,EVENT_MOUSEDOWN),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(CLASS_NAME_FADE$4),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=getElement(e.rootElement),e}_append(){if(this._isAppended)return;const e=this._getElement();this._config.rootElement.append(e),EventHandler.on(e,EVENT_MOUSEDOWN,()=>{execute(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){executeAfterTransition(e,this._getElement(),this._config.isAnimated)}}const NAME$8="focustrap",DATA_KEY$5="bs.focustrap",EVENT_KEY$5=`.${DATA_KEY$5}`,EVENT_FOCUSIN$2=`focusin${EVENT_KEY$5}`,EVENT_KEYDOWN_TAB=`keydown.tab${EVENT_KEY$5}`,TAB_KEY="Tab",TAB_NAV_FORWARD="forward",TAB_NAV_BACKWARD="backward",Default$7={autofocus:!0,trapElement:null},DefaultType$7={autofocus:"boolean",trapElement:"element"};class FocusTrap extends Config{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Default$7}static get DefaultType(){return DefaultType$7}static get NAME(){return NAME$8}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),EventHandler.off(document,EVENT_KEY$5),EventHandler.on(document,EVENT_FOCUSIN$2,e=>this._handleFocusin(e)),EventHandler.on(document,EVENT_KEYDOWN_TAB,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,EventHandler.off(document,EVENT_KEY$5))}_handleFocusin(e){const{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;const r=SelectorEngine.focusableChildren(t);r.length===0?t.focus():this._lastTabNavDirection===TAB_NAV_BACKWARD?r[r.length-1].focus():r[0].focus()}_handleKeydown(e){e.key===TAB_KEY&&(this._lastTabNavDirection=e.shiftKey?TAB_NAV_BACKWARD:TAB_NAV_FORWARD)}}const SELECTOR_FIXED_CONTENT=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",SELECTOR_STICKY_CONTENT=".sticky-top",PROPERTY_PADDING="padding-right",PROPERTY_MARGIN="margin-right";class ScrollBarHelper{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,PROPERTY_PADDING,t=>t+e),this._setElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING,t=>t+e),this._setElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,r){const i=this.getWidth(),s=l=>{if(l!==this._element&&window.innerWidth>l.clientWidth+i)return;this._saveInitialAttribute(l,t);const u=window.getComputedStyle(l).getPropertyValue(t);l.style.setProperty(t,`${r(Number.parseFloat(u))}px`)};this._applyManipulationCallback(e,s)}_saveInitialAttribute(e,t){const r=e.style.getPropertyValue(t);r&&Manipulator.setDataAttribute(e,t,r)}_resetElementAttributes(e,t){const r=i=>{const s=Manipulator.getDataAttribute(i,t);if(s===null){i.style.removeProperty(t);return}Manipulator.removeDataAttribute(i,t),i.style.setProperty(t,s)};this._applyManipulationCallback(e,r)}_applyManipulationCallback(e,t){if(isElement(e)){t(e);return}for(const r of SelectorEngine.find(e,this._element))t(r)}}const NAME$7="modal",DATA_KEY$4="bs.modal",EVENT_KEY$4=`.${DATA_KEY$4}`,DATA_API_KEY$2=".data-api",ESCAPE_KEY$1="Escape",EVENT_HIDE$4=`hide${EVENT_KEY$4}`,EVENT_HIDE_PREVENTED$1=`hidePrevented${EVENT_KEY$4}`,EVENT_HIDDEN$4=`hidden${EVENT_KEY$4}`,EVENT_SHOW$4=`show${EVENT_KEY$4}`,EVENT_SHOWN$4=`shown${EVENT_KEY$4}`,EVENT_RESIZE$1=`resize${EVENT_KEY$4}`,EVENT_CLICK_DISMISS=`click.dismiss${EVENT_KEY$4}`,EVENT_MOUSEDOWN_DISMISS=`mousedown.dismiss${EVENT_KEY$4}`,EVENT_KEYDOWN_DISMISS$1=`keydown.dismiss${EVENT_KEY$4}`,EVENT_CLICK_DATA_API$2=`click${EVENT_KEY$4}${DATA_API_KEY$2}`,CLASS_NAME_OPEN="modal-open",CLASS_NAME_FADE$3="fade",CLASS_NAME_SHOW$4="show",CLASS_NAME_STATIC="modal-static",OPEN_SELECTOR$1=".modal.show",SELECTOR_DIALOG=".modal-dialog",SELECTOR_MODAL_BODY=".modal-body",SELECTOR_DATA_TOGGLE$2='[data-bs-toggle="modal"]',Default$6={backdrop:!0,focus:!0,keyboard:!0},DefaultType$6={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Modal extends BaseComponent{constructor(e,t){super(e,t),this._dialog=SelectorEngine.findOne(SELECTOR_DIALOG,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ScrollBarHelper,this._addEventListeners()}static get Default(){return Default$6}static get DefaultType(){return DefaultType$6}static get NAME(){return NAME$7}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||EventHandler.trigger(this._element,EVENT_SHOW$4,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(CLASS_NAME_OPEN),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||EventHandler.trigger(this._element,EVENT_HIDE$4).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(CLASS_NAME_SHOW$4),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){EventHandler.off(window,EVENT_KEY$4),EventHandler.off(this._dialog,EVENT_KEY$4),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Backdrop({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const t=SelectorEngine.findOne(SELECTOR_MODAL_BODY,this._dialog);t&&(t.scrollTop=0),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW$4);const r=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,EventHandler.trigger(this._element,EVENT_SHOWN$4,{relatedTarget:e})};this._queueCallback(r,this._dialog,this._isAnimated())}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS$1,e=>{if(e.key===ESCAPE_KEY$1){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),EventHandler.on(window,EVENT_RESIZE$1,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),EventHandler.on(this._element,EVENT_MOUSEDOWN_DISMISS,e=>{EventHandler.one(this._element,EVENT_CLICK_DISMISS,t=>{if(!(this._element!==e.target||this._element!==t.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(CLASS_NAME_OPEN),this._resetAdjustments(),this._scrollBar.reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$4)})}_isAnimated(){return this._element.classList.contains(CLASS_NAME_FADE$3)}_triggerBackdropTransition(){if(EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED$1).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,r=this._element.style.overflowY;r==="hidden"||this._element.classList.contains(CLASS_NAME_STATIC)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.classList.remove(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.style.overflowY=r},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),r=t>0;if(r&&!e){const i=isRTL()?"paddingLeft":"paddingRight";this._element.style[i]=`${t}px`}if(!r&&e){const i=isRTL()?"paddingRight":"paddingLeft";this._element.style[i]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const r=Modal.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof r[e]>"u")throw new TypeError(`No method named "${e}"`);r[e](t)}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$2,SELECTOR_DATA_TOGGLE$2,function(n){const e=SelectorEngine.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),EventHandler.one(e,EVENT_SHOW$4,i=>{i.defaultPrevented||EventHandler.one(e,EVENT_HIDDEN$4,()=>{isVisible(this)&&this.focus()})});const t=SelectorEngine.findOne(OPEN_SELECTOR$1);t&&Modal.getInstance(t).hide(),Modal.getOrCreateInstance(e).toggle(this)});enableDismissTrigger(Modal);defineJQueryPlugin(Modal);const NAME$6="offcanvas",DATA_KEY$3="bs.offcanvas",EVENT_KEY$3=`.${DATA_KEY$3}`,DATA_API_KEY$1=".data-api",EVENT_LOAD_DATA_API$2=`load${EVENT_KEY$3}${DATA_API_KEY$1}`,ESCAPE_KEY="Escape",CLASS_NAME_SHOW$3="show",CLASS_NAME_SHOWING$1="showing",CLASS_NAME_HIDING="hiding",CLASS_NAME_BACKDROP="offcanvas-backdrop",OPEN_SELECTOR=".offcanvas.show",EVENT_SHOW$3=`show${EVENT_KEY$3}`,EVENT_SHOWN$3=`shown${EVENT_KEY$3}`,EVENT_HIDE$3=`hide${EVENT_KEY$3}`,EVENT_HIDE_PREVENTED=`hidePrevented${EVENT_KEY$3}`,EVENT_HIDDEN$3=`hidden${EVENT_KEY$3}`,EVENT_RESIZE=`resize${EVENT_KEY$3}`,EVENT_CLICK_DATA_API$1=`click${EVENT_KEY$3}${DATA_API_KEY$1}`,EVENT_KEYDOWN_DISMISS=`keydown.dismiss${EVENT_KEY$3}`,SELECTOR_DATA_TOGGLE$1='[data-bs-toggle="offcanvas"]',Default$5={backdrop:!0,keyboard:!0,scroll:!1},DefaultType$5={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Offcanvas extends BaseComponent{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Default$5}static get DefaultType(){return DefaultType$5}static get NAME(){return NAME$6}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||EventHandler.trigger(this._element,EVENT_SHOW$3,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||new ScrollBarHelper().hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(CLASS_NAME_SHOWING$1);const r=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(CLASS_NAME_SHOW$3),this._element.classList.remove(CLASS_NAME_SHOWING$1),EventHandler.trigger(this._element,EVENT_SHOWN$3,{relatedTarget:e})};this._queueCallback(r,this._element,!0)}hide(){if(!this._isShown||EventHandler.trigger(this._element,EVENT_HIDE$3).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(CLASS_NAME_HIDING),this._backdrop.hide();const t=()=>{this._element.classList.remove(CLASS_NAME_SHOW$3,CLASS_NAME_HIDING),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||new ScrollBarHelper().reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$3)};this._queueCallback(t,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const e=()=>{if(this._config.backdrop==="static"){EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED);return}this.hide()},t=!!this._config.backdrop;return new Backdrop({className:CLASS_NAME_BACKDROP,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?e:null})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS,e=>{if(e.key===ESCAPE_KEY){if(this._config.keyboard){this.hide();return}EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED)}})}static jQueryInterface(e){return this.each(function(){const t=Offcanvas.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$1,SELECTOR_DATA_TOGGLE$1,function(n){const e=SelectorEngine.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),isDisabled(this))return;EventHandler.one(e,EVENT_HIDDEN$3,()=>{isVisible(this)&&this.focus()});const t=SelectorEngine.findOne(OPEN_SELECTOR);t&&t!==e&&Offcanvas.getInstance(t).hide(),Offcanvas.getOrCreateInstance(e).toggle(this)});EventHandler.on(window,EVENT_LOAD_DATA_API$2,()=>{for(const n of SelectorEngine.find(OPEN_SELECTOR))Offcanvas.getOrCreateInstance(n).show()});EventHandler.on(window,EVENT_RESIZE,()=>{for(const n of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(n).position!=="fixed"&&Offcanvas.getOrCreateInstance(n).hide()});enableDismissTrigger(Offcanvas);defineJQueryPlugin(Offcanvas);const ARIA_ATTRIBUTE_PATTERN=/^aria-[\w-]*$/i,DefaultAllowlist={"*":["class","dir","id","lang","role",ARIA_ATTRIBUTE_PATTERN],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},uriAttributes=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),SAFE_URL_PATTERN=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,allowedAttribute=(n,e)=>{const t=n.nodeName.toLowerCase();return e.includes(t)?uriAttributes.has(t)?!!SAFE_URL_PATTERN.test(n.nodeValue):!0:e.filter(r=>r instanceof RegExp).some(r=>r.test(t))};function sanitizeHtml(n,e,t){if(!n.length)return n;if(t&&typeof t=="function")return t(n);const i=new window.DOMParser().parseFromString(n,"text/html"),s=[].concat(...i.body.querySelectorAll("*"));for(const l of s){const u=l.nodeName.toLowerCase();if(!Object.keys(e).includes(u)){l.remove();continue}const h=[].concat(...l.attributes),p=[].concat(e["*"]||[],e[u]||[]);for(const E of h)allowedAttribute(E,p)||l.removeAttribute(E.nodeName)}return i.body.innerHTML}const NAME$5="TemplateFactory",Default$4={allowList:DefaultAllowlist,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},DefaultType$4={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},DefaultContentType={entry:"(string|element|function|null)",selector:"(string|element)"};class TemplateFactory extends Config{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Default$4}static get DefaultType(){return DefaultType$4}static get NAME(){return NAME$5}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){const e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(const[i,s]of Object.entries(this._config.content))this._setContent(e,s,i);const t=e.children[0],r=this._resolvePossibleFunction(this._config.extraClass);return r&&t.classList.add(...r.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(const[t,r]of Object.entries(e))super._typeCheckConfig({selector:t,entry:r},DefaultContentType)}_setContent(e,t,r){const i=SelectorEngine.findOne(r,e);if(i){if(t=this._resolvePossibleFunction(t),!t){i.remove();return}if(isElement(t)){this._putElementInTemplate(getElement(t),i);return}if(this._config.html){i.innerHTML=this._maybeSanitize(t);return}i.textContent=t}}_maybeSanitize(e){return this._config.sanitize?sanitizeHtml(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return execute(e,[this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML="",t.append(e);return}t.textContent=e.textContent}}const NAME$4="tooltip",DISALLOWED_ATTRIBUTES=new Set(["sanitize","allowList","sanitizeFn"]),CLASS_NAME_FADE$2="fade",CLASS_NAME_MODAL="modal",CLASS_NAME_SHOW$2="show",SELECTOR_TOOLTIP_INNER=".tooltip-inner",SELECTOR_MODAL=`.${CLASS_NAME_MODAL}`,EVENT_MODAL_HIDE="hide.bs.modal",TRIGGER_HOVER="hover",TRIGGER_FOCUS="focus",TRIGGER_CLICK="click",TRIGGER_MANUAL="manual",EVENT_HIDE$2="hide",EVENT_HIDDEN$2="hidden",EVENT_SHOW$2="show",EVENT_SHOWN$2="shown",EVENT_INSERTED="inserted",EVENT_CLICK$1="click",EVENT_FOCUSIN$1="focusin",EVENT_FOCUSOUT$1="focusout",EVENT_MOUSEENTER="mouseenter",EVENT_MOUSELEAVE="mouseleave",AttachmentMap={AUTO:"auto",TOP:"top",RIGHT:isRTL()?"left":"right",BOTTOM:"bottom",LEFT:isRTL()?"right":"left"},Default$3={allowList:DefaultAllowlist,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},DefaultType$3={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class Tooltip extends BaseComponent{constructor(e,t){if(typeof Popper>"u")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Default$3}static get DefaultType(){return DefaultType$3}static get NAME(){return NAME$4}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),EventHandler.off(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;const e=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOW$2)),r=(findShadowRoot(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!r)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_INSERTED))),this._popper=this._createPopper(i),i.classList.add(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const u of[].concat(...document.body.children))EventHandler.on(u,"mouseover",noop);const l=()=>{EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOWN$2)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(l,this.tip,this._isAnimated())}hide(){if(!this._isShown()||EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDE$2)).defaultPrevented)return;if(this._getTipElement().classList.remove(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const i of[].concat(...document.body.children))EventHandler.off(i,"mouseover",noop);this._activeTrigger[TRIGGER_CLICK]=!1,this._activeTrigger[TRIGGER_FOCUS]=!1,this._activeTrigger[TRIGGER_HOVER]=!1,this._isHovered=null;const r=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDDEN$2)))};this._queueCallback(r,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){const t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(CLASS_NAME_FADE$2,CLASS_NAME_SHOW$2),t.classList.add(`bs-${this.constructor.NAME}-auto`);const r=getUID(this.constructor.NAME).toString();return t.setAttribute("id",r),this._isAnimated()&&t.classList.add(CLASS_NAME_FADE$2),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new TemplateFactory({...this._config,content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[SELECTOR_TOOLTIP_INNER]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(CLASS_NAME_FADE$2)}_isShown(){return this.tip&&this.tip.classList.contains(CLASS_NAME_SHOW$2)}_createPopper(e){const t=execute(this._config.placement,[this,e,this._element]),r=AttachmentMap[t.toUpperCase()];return createPopper(this._element,e,this._getPopperConfig(r))}_getOffset(){const{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return execute(e,[this._element])}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:r=>{this._getTipElement().setAttribute("data-popper-placement",r.state.placement)}}]};return{...t,...execute(this._config.popperConfig,[t])}}_setListeners(){const e=this._config.trigger.split(" ");for(const t of e)if(t==="click")EventHandler.on(this._element,this.constructor.eventName(EVENT_CLICK$1),this._config.selector,r=>{this._initializeOnDelegatedTarget(r).toggle()});else if(t!==TRIGGER_MANUAL){const r=t===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSEENTER):this.constructor.eventName(EVENT_FOCUSIN$1),i=t===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSELEAVE):this.constructor.eventName(EVENT_FOCUSOUT$1);EventHandler.on(this._element,r,this._config.selector,s=>{const l=this._initializeOnDelegatedTarget(s);l._activeTrigger[s.type==="focusin"?TRIGGER_FOCUS:TRIGGER_HOVER]=!0,l._enter()}),EventHandler.on(this._element,i,this._config.selector,s=>{const l=this._initializeOnDelegatedTarget(s);l._activeTrigger[s.type==="focusout"?TRIGGER_FOCUS:TRIGGER_HOVER]=l._element.contains(s.relatedTarget),l._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},EventHandler.on(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler)}_fixTitle(){const e=this._element.getAttribute("title");e&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){const t=Manipulator.getDataAttributes(this._element);for(const r of Object.keys(t))DISALLOWED_ATTRIBUTES.has(r)&&delete t[r];return e={...t,...typeof e=="object"&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:getElement(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){const e={};for(const[t,r]of Object.entries(this._config))this.constructor.Default[t]!==r&&(e[t]=r);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){const t=Tooltip.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}defineJQueryPlugin(Tooltip);const NAME$3="popover",SELECTOR_TITLE=".popover-header",SELECTOR_CONTENT=".popover-body",Default$2={...Tooltip.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},DefaultType$2={...Tooltip.DefaultType,content:"(null|string|element|function)"};class Popover extends Tooltip{static get Default(){return Default$2}static get DefaultType(){return DefaultType$2}static get NAME(){return NAME$3}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[SELECTOR_TITLE]:this._getTitle(),[SELECTOR_CONTENT]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){const t=Popover.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}defineJQueryPlugin(Popover);const NAME$2="scrollspy",DATA_KEY$2="bs.scrollspy",EVENT_KEY$2=`.${DATA_KEY$2}`,DATA_API_KEY=".data-api",EVENT_ACTIVATE=`activate${EVENT_KEY$2}`,EVENT_CLICK=`click${EVENT_KEY$2}`,EVENT_LOAD_DATA_API$1=`load${EVENT_KEY$2}${DATA_API_KEY}`,CLASS_NAME_DROPDOWN_ITEM="dropdown-item",CLASS_NAME_ACTIVE$1="active",SELECTOR_DATA_SPY='[data-bs-spy="scroll"]',SELECTOR_TARGET_LINKS="[href]",SELECTOR_NAV_LIST_GROUP=".nav, .list-group",SELECTOR_NAV_LINKS=".nav-link",SELECTOR_NAV_ITEMS=".nav-item",SELECTOR_LIST_ITEMS=".list-group-item",SELECTOR_LINK_ITEMS=`${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`,SELECTOR_DROPDOWN=".dropdown",SELECTOR_DROPDOWN_TOGGLE$1=".dropdown-toggle",Default$1={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},DefaultType$1={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class ScrollSpy extends BaseComponent{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Default$1}static get DefaultType(){return DefaultType$1}static get NAME(){return NAME$2}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=getElement(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(t=>Number.parseFloat(t))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(EventHandler.off(this._config.target,EVENT_CLICK),EventHandler.on(this._config.target,EVENT_CLICK,SELECTOR_TARGET_LINKS,e=>{const t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();const r=this._rootElement||window,i=t.offsetTop-this._element.offsetTop;if(r.scrollTo){r.scrollTo({top:i,behavior:"smooth"});return}r.scrollTop=i}}))}_getNewObserver(){const e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),e)}_observerCallback(e){const t=l=>this._targetLinks.get(`#${l.target.id}`),r=l=>{this._previousScrollData.visibleEntryTop=l.target.offsetTop,this._process(t(l))},i=(this._rootElement||document.documentElement).scrollTop,s=i>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=i;for(const l of e){if(!l.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(l));continue}const u=l.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&u){if(r(l),!i)return;continue}!s&&!u&&r(l)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const e=SelectorEngine.find(SELECTOR_TARGET_LINKS,this._config.target);for(const t of e){if(!t.hash||isDisabled(t))continue;const r=SelectorEngine.findOne(decodeURI(t.hash),this._element);isVisible(r)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,r))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(CLASS_NAME_ACTIVE$1),this._activateParents(e),EventHandler.trigger(this._element,EVENT_ACTIVATE,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(CLASS_NAME_DROPDOWN_ITEM)){SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1,e.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);return}for(const t of SelectorEngine.parents(e,SELECTOR_NAV_LIST_GROUP))for(const r of SelectorEngine.prev(t,SELECTOR_LINK_ITEMS))r.classList.add(CLASS_NAME_ACTIVE$1)}_clearActiveClass(e){e.classList.remove(CLASS_NAME_ACTIVE$1);const t=SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`,e);for(const r of t)r.classList.remove(CLASS_NAME_ACTIVE$1)}static jQueryInterface(e){return this.each(function(){const t=ScrollSpy.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}EventHandler.on(window,EVENT_LOAD_DATA_API$1,()=>{for(const n of SelectorEngine.find(SELECTOR_DATA_SPY))ScrollSpy.getOrCreateInstance(n)});defineJQueryPlugin(ScrollSpy);const NAME$1="tab",DATA_KEY$1="bs.tab",EVENT_KEY$1=`.${DATA_KEY$1}`,EVENT_HIDE$1=`hide${EVENT_KEY$1}`,EVENT_HIDDEN$1=`hidden${EVENT_KEY$1}`,EVENT_SHOW$1=`show${EVENT_KEY$1}`,EVENT_SHOWN$1=`shown${EVENT_KEY$1}`,EVENT_CLICK_DATA_API=`click${EVENT_KEY$1}`,EVENT_KEYDOWN=`keydown${EVENT_KEY$1}`,EVENT_LOAD_DATA_API=`load${EVENT_KEY$1}`,ARROW_LEFT_KEY="ArrowLeft",ARROW_RIGHT_KEY="ArrowRight",ARROW_UP_KEY="ArrowUp",ARROW_DOWN_KEY="ArrowDown",HOME_KEY="Home",END_KEY="End",CLASS_NAME_ACTIVE="active",CLASS_NAME_FADE$1="fade",CLASS_NAME_SHOW$1="show",CLASS_DROPDOWN="dropdown",SELECTOR_DROPDOWN_TOGGLE=".dropdown-toggle",SELECTOR_DROPDOWN_MENU=".dropdown-menu",NOT_SELECTOR_DROPDOWN_TOGGLE=`:not(${SELECTOR_DROPDOWN_TOGGLE})`,SELECTOR_TAB_PANEL='.list-group, .nav, [role="tablist"]',SELECTOR_OUTER=".nav-item, .list-group-item",SELECTOR_INNER=`.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`,SELECTOR_DATA_TOGGLE='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',SELECTOR_INNER_ELEM=`${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`,SELECTOR_DATA_TOGGLE_ACTIVE=`.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;class Tab extends BaseComponent{constructor(e){super(e),this._parent=this._element.closest(SELECTOR_TAB_PANEL),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),EventHandler.on(this._element,EVENT_KEYDOWN,t=>this._keydown(t)))}static get NAME(){return NAME$1}show(){const e=this._element;if(this._elemIsActive(e))return;const t=this._getActiveElem(),r=t?EventHandler.trigger(t,EVENT_HIDE$1,{relatedTarget:e}):null;EventHandler.trigger(e,EVENT_SHOW$1,{relatedTarget:t}).defaultPrevented||r&&r.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){if(!e)return;e.classList.add(CLASS_NAME_ACTIVE),this._activate(SelectorEngine.getElementFromSelector(e));const r=()=>{if(e.getAttribute("role")!=="tab"){e.classList.add(CLASS_NAME_SHOW$1);return}e.removeAttribute("tabindex"),e.setAttribute("aria-selected",!0),this._toggleDropDown(e,!0),EventHandler.trigger(e,EVENT_SHOWN$1,{relatedTarget:t})};this._queueCallback(r,e,e.classList.contains(CLASS_NAME_FADE$1))}_deactivate(e,t){if(!e)return;e.classList.remove(CLASS_NAME_ACTIVE),e.blur(),this._deactivate(SelectorEngine.getElementFromSelector(e));const r=()=>{if(e.getAttribute("role")!=="tab"){e.classList.remove(CLASS_NAME_SHOW$1);return}e.setAttribute("aria-selected",!1),e.setAttribute("tabindex","-1"),this._toggleDropDown(e,!1),EventHandler.trigger(e,EVENT_HIDDEN$1,{relatedTarget:t})};this._queueCallback(r,e,e.classList.contains(CLASS_NAME_FADE$1))}_keydown(e){if(![ARROW_LEFT_KEY,ARROW_RIGHT_KEY,ARROW_UP_KEY,ARROW_DOWN_KEY,HOME_KEY,END_KEY].includes(e.key))return;e.stopPropagation(),e.preventDefault();const t=this._getChildren().filter(i=>!isDisabled(i));let r;if([HOME_KEY,END_KEY].includes(e.key))r=t[e.key===HOME_KEY?0:t.length-1];else{const i=[ARROW_RIGHT_KEY,ARROW_DOWN_KEY].includes(e.key);r=getNextActiveElement(t,e.target,i,!0)}r&&(r.focus({preventScroll:!0}),Tab.getOrCreateInstance(r).show())}_getChildren(){return SelectorEngine.find(SELECTOR_INNER_ELEM,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(const r of t)this._setInitialAttributesOnChild(r)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);const t=this._elemIsActive(e),r=this._getOuterElement(e);e.setAttribute("aria-selected",t),r!==e&&this._setAttributeIfNotExists(r,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){const t=SelectorEngine.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(t,"aria-labelledby",`${e.id}`))}_toggleDropDown(e,t){const r=this._getOuterElement(e);if(!r.classList.contains(CLASS_DROPDOWN))return;const i=(s,l)=>{const u=SelectorEngine.findOne(s,r);u&&u.classList.toggle(l,t)};i(SELECTOR_DROPDOWN_TOGGLE,CLASS_NAME_ACTIVE),i(SELECTOR_DROPDOWN_MENU,CLASS_NAME_SHOW$1),r.setAttribute("aria-expanded",t)}_setAttributeIfNotExists(e,t,r){e.hasAttribute(t)||e.setAttribute(t,r)}_elemIsActive(e){return e.classList.contains(CLASS_NAME_ACTIVE)}_getInnerElement(e){return e.matches(SELECTOR_INNER_ELEM)?e:SelectorEngine.findOne(SELECTOR_INNER_ELEM,e)}_getOuterElement(e){return e.closest(SELECTOR_OUTER)||e}static jQueryInterface(e){return this.each(function(){const t=Tab.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API,SELECTOR_DATA_TOGGLE,function(n){["A","AREA"].includes(this.tagName)&&n.preventDefault(),!isDisabled(this)&&Tab.getOrCreateInstance(this).show()});EventHandler.on(window,EVENT_LOAD_DATA_API,()=>{for(const n of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE))Tab.getOrCreateInstance(n)});defineJQueryPlugin(Tab);const NAME="toast",DATA_KEY="bs.toast",EVENT_KEY=`.${DATA_KEY}`,EVENT_MOUSEOVER=`mouseover${EVENT_KEY}`,EVENT_MOUSEOUT=`mouseout${EVENT_KEY}`,EVENT_FOCUSIN=`focusin${EVENT_KEY}`,EVENT_FOCUSOUT=`focusout${EVENT_KEY}`,EVENT_HIDE=`hide${EVENT_KEY}`,EVENT_HIDDEN=`hidden${EVENT_KEY}`,EVENT_SHOW=`show${EVENT_KEY}`,EVENT_SHOWN=`shown${EVENT_KEY}`,CLASS_NAME_FADE="fade",CLASS_NAME_HIDE="hide",CLASS_NAME_SHOW="show",CLASS_NAME_SHOWING="showing",DefaultType={animation:"boolean",autohide:"boolean",delay:"number"},Default={animation:!0,autohide:!0,delay:5e3};class Toast extends BaseComponent{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Default}static get DefaultType(){return DefaultType}static get NAME(){return NAME}show(){if(EventHandler.trigger(this._element,EVENT_SHOW).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(CLASS_NAME_FADE);const t=()=>{this._element.classList.remove(CLASS_NAME_SHOWING),EventHandler.trigger(this._element,EVENT_SHOWN),this._maybeScheduleHide()};this._element.classList.remove(CLASS_NAME_HIDE),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW,CLASS_NAME_SHOWING),this._queueCallback(t,this._element,this._config.animation)}hide(){if(!this.isShown()||EventHandler.trigger(this._element,EVENT_HIDE).defaultPrevented)return;const t=()=>{this._element.classList.add(CLASS_NAME_HIDE),this._element.classList.remove(CLASS_NAME_SHOWING,CLASS_NAME_SHOW),EventHandler.trigger(this._element,EVENT_HIDDEN)};this._element.classList.add(CLASS_NAME_SHOWING),this._queueCallback(t,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(CLASS_NAME_SHOW),super.dispose()}isShown(){return this._element.classList.contains(CLASS_NAME_SHOW)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=t;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=t;break}}if(t){this._clearTimeout();return}const r=e.relatedTarget;this._element===r||this._element.contains(r)||this._maybeScheduleHide()}_setListeners(){EventHandler.on(this._element,EVENT_MOUSEOVER,e=>this._onInteraction(e,!0)),EventHandler.on(this._element,EVENT_MOUSEOUT,e=>this._onInteraction(e,!1)),EventHandler.on(this._element,EVENT_FOCUSIN,e=>this._onInteraction(e,!0)),EventHandler.on(this._element,EVENT_FOCUSOUT,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Toast.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}enableDismissTrigger(Toast);defineJQueryPlugin(Toast);class AutoLookUpAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");L(this,"makeQuery",(e,t)=>{let r="";return typeof t=="number"&&(r=`${e.code} = ${t}`),typeof t=="string"&&(r=`${e.code} = "${t}"`),this.props.condition.queryString!==""&&(r=`${r} and (${this.props.condition.queryString})`),r});L(this,"getUpdateRecords",async(e,t)=>await new index_browser.KintoneRestAPIClient().record.getAllRecords({app:this.props.lookupField.app.id,fields:["$id"],condition:this.makeQuery(e,t)}));L(this,"convertForLookup",(e,t,r)=>e.map(i=>({id:Number(i.$id.value),record:{[t.code]:{value:r}}})));L(this,"updateLookupTarget",async e=>{if(e&&e.length>0)try{const r=await new index_browser.KintoneRestAPIClient().record.updateAllRecords({app:this.props.lookupField.app.id,records:e});return!0}catch(t){if(t instanceof index_browser.KintoneAllRecordsError)return this.showError(this.props.lookupField.app,this.props.lookupField.fields[0],t,e.length),!1;throw t}return!1});L(this,"showSpinnerModel",(e,t)=>{let r=$("#alcLookupModal");if(r.length===0){const i=`
+ */const elementMap=new Map,Data={set(n,e,t){elementMap.has(n)||elementMap.set(n,new Map);const r=elementMap.get(n);if(!r.has(e)&&r.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(r.keys())[0]}.`);return}r.set(e,t)},get(n,e){return elementMap.has(n)&&elementMap.get(n).get(e)||null},remove(n,e){if(!elementMap.has(n))return;const t=elementMap.get(n);t.delete(e),t.size===0&&elementMap.delete(n)}},MAX_UID=1e6,MILLISECONDS_MULTIPLIER=1e3,TRANSITION_END="transitionend",parseSelector=n=>(n&&window.CSS&&window.CSS.escape&&(n=n.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),n),toType=n=>n==null?`${n}`:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),getUID=n=>{do n+=Math.floor(Math.random()*MAX_UID);while(document.getElementById(n));return n},getTransitionDurationFromElement=n=>{if(!n)return 0;let{transitionDuration:e,transitionDelay:t}=window.getComputedStyle(n);const r=Number.parseFloat(e),i=Number.parseFloat(t);return!r&&!i?0:(e=e.split(",")[0],t=t.split(",")[0],(Number.parseFloat(e)+Number.parseFloat(t))*MILLISECONDS_MULTIPLIER)},triggerTransitionEnd=n=>{n.dispatchEvent(new Event(TRANSITION_END))},isElement=n=>!n||typeof n!="object"?!1:(typeof n.jquery<"u"&&(n=n[0]),typeof n.nodeType<"u"),getElement=n=>isElement(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(parseSelector(n)):null,isVisible=n=>{if(!isElement(n)||n.getClientRects().length===0)return!1;const e=getComputedStyle(n).getPropertyValue("visibility")==="visible",t=n.closest("details:not([open])");if(!t)return e;if(t!==n){const r=n.closest("summary");if(r&&r.parentNode!==t||r===null)return!1}return e},isDisabled=n=>!n||n.nodeType!==Node.ELEMENT_NODE||n.classList.contains("disabled")?!0:typeof n.disabled<"u"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",findShadowRoot=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){const e=n.getRootNode();return e instanceof ShadowRoot?e:null}return n instanceof ShadowRoot?n:n.parentNode?findShadowRoot(n.parentNode):null},noop=()=>{},reflow=n=>{n.offsetHeight},getjQuery=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,DOMContentLoadedCallbacks=[],onDOMContentLoaded=n=>{document.readyState==="loading"?(DOMContentLoadedCallbacks.length||document.addEventListener("DOMContentLoaded",()=>{for(const e of DOMContentLoadedCallbacks)e()}),DOMContentLoadedCallbacks.push(n)):n()},isRTL=()=>document.documentElement.dir==="rtl",defineJQueryPlugin=n=>{onDOMContentLoaded(()=>{const e=getjQuery();if(e){const t=n.NAME,r=e.fn[t];e.fn[t]=n.jQueryInterface,e.fn[t].Constructor=n,e.fn[t].noConflict=()=>(e.fn[t]=r,n.jQueryInterface)}})},execute=(n,e=[],t=n)=>typeof n=="function"?n(...e):t,executeAfterTransition=(n,e,t=!0)=>{if(!t){execute(n);return}const r=5,i=getTransitionDurationFromElement(e)+r;let s=!1;const l=({target:u})=>{u===e&&(s=!0,e.removeEventListener(TRANSITION_END,l),execute(n))};e.addEventListener(TRANSITION_END,l),setTimeout(()=>{s||triggerTransitionEnd(e)},i)},getNextActiveElement=(n,e,t,r)=>{const i=n.length;let s=n.indexOf(e);return s===-1?!t&&r?n[i-1]:n[0]:(s+=t?1:-1,r&&(s=(s+i)%i),n[Math.max(0,Math.min(s,i-1))])},namespaceRegex=/[^.]*(?=\..*)\.|.*/,stripNameRegex=/\..*/,stripUidRegex=/::\d+$/,eventRegistry={};let uidEvent=1;const customEvents={mouseenter:"mouseover",mouseleave:"mouseout"},nativeEvents=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function makeEventUid(n,e){return e&&`${e}::${uidEvent++}`||n.uidEvent||uidEvent++}function getElementEvents(n){const e=makeEventUid(n);return n.uidEvent=e,eventRegistry[e]=eventRegistry[e]||{},eventRegistry[e]}function bootstrapHandler(n,e){return function t(r){return hydrateObj(r,{delegateTarget:n}),t.oneOff&&EventHandler.off(n,r.type,e),e.apply(n,[r])}}function bootstrapDelegationHandler(n,e,t){return function r(i){const s=n.querySelectorAll(e);for(let{target:l}=i;l&&l!==this;l=l.parentNode)for(const u of s)if(u===l)return hydrateObj(i,{delegateTarget:l}),r.oneOff&&EventHandler.off(n,i.type,e,t),t.apply(l,[i])}}function findHandler(n,e,t=null){return Object.values(n).find(r=>r.callable===e&&r.delegationSelector===t)}function normalizeParameters(n,e,t){const r=typeof e=="string",i=r?t:e||t;let s=getTypeEvent(n);return nativeEvents.has(s)||(s=n),[r,i,s]}function addHandler(n,e,t,r,i){if(typeof e!="string"||!n)return;let[s,l,u]=normalizeParameters(e,t,r);e in customEvents&&(l=(T=>function(w){if(!w.relatedTarget||w.relatedTarget!==w.delegateTarget&&!w.delegateTarget.contains(w.relatedTarget))return T.call(this,w)})(l));const h=getElementEvents(n),p=h[u]||(h[u]={}),E=findHandler(p,l,s?t:null);if(E){E.oneOff=E.oneOff&&i;return}const _=makeEventUid(l,e.replace(namespaceRegex,"")),S=s?bootstrapDelegationHandler(n,t,l):bootstrapHandler(n,l);S.delegationSelector=s?t:null,S.callable=l,S.oneOff=i,S.uidEvent=_,p[_]=S,n.addEventListener(u,S,s)}function removeHandler(n,e,t,r,i){const s=findHandler(e[t],r,i);s&&(n.removeEventListener(t,s,!!i),delete e[t][s.uidEvent])}function removeNamespacedHandlers(n,e,t,r){const i=e[t]||{};for(const[s,l]of Object.entries(i))s.includes(r)&&removeHandler(n,e,t,l.callable,l.delegationSelector)}function getTypeEvent(n){return n=n.replace(stripNameRegex,""),customEvents[n]||n}const EventHandler={on(n,e,t,r){addHandler(n,e,t,r,!1)},one(n,e,t,r){addHandler(n,e,t,r,!0)},off(n,e,t,r){if(typeof e!="string"||!n)return;const[i,s,l]=normalizeParameters(e,t,r),u=l!==e,h=getElementEvents(n),p=h[l]||{},E=e.startsWith(".");if(typeof s<"u"){if(!Object.keys(p).length)return;removeHandler(n,h,l,s,i?t:null);return}if(E)for(const _ of Object.keys(h))removeNamespacedHandlers(n,h,_,e.slice(1));for(const[_,S]of Object.entries(p)){const N=_.replace(stripUidRegex,"");(!u||e.includes(N))&&removeHandler(n,h,l,S.callable,S.delegationSelector)}},trigger(n,e,t){if(typeof e!="string"||!n)return null;const r=getjQuery(),i=getTypeEvent(e),s=e!==i;let l=null,u=!0,h=!0,p=!1;s&&r&&(l=r.Event(e,t),r(n).trigger(l),u=!l.isPropagationStopped(),h=!l.isImmediatePropagationStopped(),p=l.isDefaultPrevented());const E=hydrateObj(new Event(e,{bubbles:u,cancelable:!0}),t);return p&&E.preventDefault(),h&&n.dispatchEvent(E),E.defaultPrevented&&l&&l.preventDefault(),E}};function hydrateObj(n,e={}){for(const[t,r]of Object.entries(e))try{n[t]=r}catch{Object.defineProperty(n,t,{configurable:!0,get(){return r}})}return n}function normalizeData(n){if(n==="true")return!0;if(n==="false")return!1;if(n===Number(n).toString())return Number(n);if(n===""||n==="null")return null;if(typeof n!="string")return n;try{return JSON.parse(decodeURIComponent(n))}catch{return n}}function normalizeDataKey(n){return n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}const Manipulator={setDataAttribute(n,e,t){n.setAttribute(`data-bs-${normalizeDataKey(e)}`,t)},removeDataAttribute(n,e){n.removeAttribute(`data-bs-${normalizeDataKey(e)}`)},getDataAttributes(n){if(!n)return{};const e={},t=Object.keys(n.dataset).filter(r=>r.startsWith("bs")&&!r.startsWith("bsConfig"));for(const r of t){let i=r.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=normalizeData(n.dataset[r])}return e},getDataAttribute(n,e){return normalizeData(n.getAttribute(`data-bs-${normalizeDataKey(e)}`))}};class Config{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){const r=isElement(t)?Manipulator.getDataAttribute(t,"config"):{};return{...this.constructor.Default,...typeof r=="object"?r:{},...isElement(t)?Manipulator.getDataAttributes(t):{},...typeof e=="object"?e:{}}}_typeCheckConfig(e,t=this.constructor.DefaultType){for(const[r,i]of Object.entries(t)){const s=e[r],l=isElement(s)?"element":toType(s);if(!new RegExp(i).test(l))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${r}" provided type "${l}" but expected type "${i}".`)}}}const VERSION="5.3.3";class BaseComponent extends Config{constructor(e,t){super(),e=getElement(e),e&&(this._element=e,this._config=this._getConfig(t),Data.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Data.remove(this._element,this.constructor.DATA_KEY),EventHandler.off(this._element,this.constructor.EVENT_KEY);for(const e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,r=!0){executeAfterTransition(e,t,r)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return Data.get(getElement(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return VERSION}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}}const getSelector=n=>{let e=n.getAttribute("data-bs-target");if(!e||e==="#"){let t=n.getAttribute("href");if(!t||!t.includes("#")&&!t.startsWith("."))return null;t.includes("#")&&!t.startsWith("#")&&(t=`#${t.split("#")[1]}`),e=t&&t!=="#"?t.trim():null}return e?e.split(",").map(t=>parseSelector(t)).join(","):null},SelectorEngine={find(n,e=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(e,n))},findOne(n,e=document.documentElement){return Element.prototype.querySelector.call(e,n)},children(n,e){return[].concat(...n.children).filter(t=>t.matches(e))},parents(n,e){const t=[];let r=n.parentNode.closest(e);for(;r;)t.push(r),r=r.parentNode.closest(e);return t},prev(n,e){let t=n.previousElementSibling;for(;t;){if(t.matches(e))return[t];t=t.previousElementSibling}return[]},next(n,e){let t=n.nextElementSibling;for(;t;){if(t.matches(e))return[t];t=t.nextElementSibling}return[]},focusableChildren(n){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,n).filter(t=>!isDisabled(t)&&isVisible(t))},getSelectorFromElement(n){const e=getSelector(n);return e&&SelectorEngine.findOne(e)?e:null},getElementFromSelector(n){const e=getSelector(n);return e?SelectorEngine.findOne(e):null},getMultipleElementsFromSelector(n){const e=getSelector(n);return e?SelectorEngine.find(e):[]}},enableDismissTrigger=(n,e="hide")=>{const t=`click.dismiss${n.EVENT_KEY}`,r=n.NAME;EventHandler.on(document,t,`[data-bs-dismiss="${r}"]`,function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),isDisabled(this))return;const s=SelectorEngine.getElementFromSelector(this)||this.closest(`.${r}`);n.getOrCreateInstance(s)[e]()})},NAME$f="alert",DATA_KEY$a="bs.alert",EVENT_KEY$b=`.${DATA_KEY$a}`,EVENT_CLOSE=`close${EVENT_KEY$b}`,EVENT_CLOSED=`closed${EVENT_KEY$b}`,CLASS_NAME_FADE$5="fade",CLASS_NAME_SHOW$8="show";class Alert extends BaseComponent{static get NAME(){return NAME$f}close(){if(EventHandler.trigger(this._element,EVENT_CLOSE).defaultPrevented)return;this._element.classList.remove(CLASS_NAME_SHOW$8);const t=this._element.classList.contains(CLASS_NAME_FADE$5);this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),EventHandler.trigger(this._element,EVENT_CLOSED),this.dispose()}static jQueryInterface(e){return this.each(function(){const t=Alert.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}enableDismissTrigger(Alert,"close");defineJQueryPlugin(Alert);const NAME$e="button",DATA_KEY$9="bs.button",EVENT_KEY$a=`.${DATA_KEY$9}`,DATA_API_KEY$6=".data-api",CLASS_NAME_ACTIVE$3="active",SELECTOR_DATA_TOGGLE$5='[data-bs-toggle="button"]',EVENT_CLICK_DATA_API$6=`click${EVENT_KEY$a}${DATA_API_KEY$6}`;class Button extends BaseComponent{static get NAME(){return NAME$e}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(CLASS_NAME_ACTIVE$3))}static jQueryInterface(e){return this.each(function(){const t=Button.getOrCreateInstance(this);e==="toggle"&&t[e]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API$6,SELECTOR_DATA_TOGGLE$5,n=>{n.preventDefault();const e=n.target.closest(SELECTOR_DATA_TOGGLE$5);Button.getOrCreateInstance(e).toggle()});defineJQueryPlugin(Button);const NAME$d="swipe",EVENT_KEY$9=".bs.swipe",EVENT_TOUCHSTART=`touchstart${EVENT_KEY$9}`,EVENT_TOUCHMOVE=`touchmove${EVENT_KEY$9}`,EVENT_TOUCHEND=`touchend${EVENT_KEY$9}`,EVENT_POINTERDOWN=`pointerdown${EVENT_KEY$9}`,EVENT_POINTERUP=`pointerup${EVENT_KEY$9}`,POINTER_TYPE_TOUCH="touch",POINTER_TYPE_PEN="pen",CLASS_NAME_POINTER_EVENT="pointer-event",SWIPE_THRESHOLD=40,Default$c={endCallback:null,leftCallback:null,rightCallback:null},DefaultType$c={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Swipe extends Config{constructor(e,t){super(),this._element=e,!(!e||!Swipe.isSupported())&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return Default$c}static get DefaultType(){return DefaultType$c}static get NAME(){return NAME$d}dispose(){EventHandler.off(this._element,EVENT_KEY$9)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),execute(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){const e=Math.abs(this._deltaX);if(e<=SWIPE_THRESHOLD)return;const t=e/this._deltaX;this._deltaX=0,t&&execute(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(EventHandler.on(this._element,EVENT_POINTERDOWN,e=>this._start(e)),EventHandler.on(this._element,EVENT_POINTERUP,e=>this._end(e)),this._element.classList.add(CLASS_NAME_POINTER_EVENT)):(EventHandler.on(this._element,EVENT_TOUCHSTART,e=>this._start(e)),EventHandler.on(this._element,EVENT_TOUCHMOVE,e=>this._move(e)),EventHandler.on(this._element,EVENT_TOUCHEND,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===POINTER_TYPE_PEN||e.pointerType===POINTER_TYPE_TOUCH)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const NAME$c="carousel",DATA_KEY$8="bs.carousel",EVENT_KEY$8=`.${DATA_KEY$8}`,DATA_API_KEY$5=".data-api",ARROW_LEFT_KEY$1="ArrowLeft",ARROW_RIGHT_KEY$1="ArrowRight",TOUCHEVENT_COMPAT_WAIT=500,ORDER_NEXT="next",ORDER_PREV="prev",DIRECTION_LEFT="left",DIRECTION_RIGHT="right",EVENT_SLIDE=`slide${EVENT_KEY$8}`,EVENT_SLID=`slid${EVENT_KEY$8}`,EVENT_KEYDOWN$1=`keydown${EVENT_KEY$8}`,EVENT_MOUSEENTER$1=`mouseenter${EVENT_KEY$8}`,EVENT_MOUSELEAVE$1=`mouseleave${EVENT_KEY$8}`,EVENT_DRAG_START=`dragstart${EVENT_KEY$8}`,EVENT_LOAD_DATA_API$3=`load${EVENT_KEY$8}${DATA_API_KEY$5}`,EVENT_CLICK_DATA_API$5=`click${EVENT_KEY$8}${DATA_API_KEY$5}`,CLASS_NAME_CAROUSEL="carousel",CLASS_NAME_ACTIVE$2="active",CLASS_NAME_SLIDE="slide",CLASS_NAME_END="carousel-item-end",CLASS_NAME_START="carousel-item-start",CLASS_NAME_NEXT="carousel-item-next",CLASS_NAME_PREV="carousel-item-prev",SELECTOR_ACTIVE=".active",SELECTOR_ITEM=".carousel-item",SELECTOR_ACTIVE_ITEM=SELECTOR_ACTIVE+SELECTOR_ITEM,SELECTOR_ITEM_IMG=".carousel-item img",SELECTOR_INDICATORS=".carousel-indicators",SELECTOR_DATA_SLIDE="[data-bs-slide], [data-bs-slide-to]",SELECTOR_DATA_RIDE='[data-bs-ride="carousel"]',KEY_TO_DIRECTION={[ARROW_LEFT_KEY$1]:DIRECTION_RIGHT,[ARROW_RIGHT_KEY$1]:DIRECTION_LEFT},Default$b={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},DefaultType$b={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Carousel extends BaseComponent{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=SelectorEngine.findOne(SELECTOR_INDICATORS,this._element),this._addEventListeners(),this._config.ride===CLASS_NAME_CAROUSEL&&this.cycle()}static get Default(){return Default$b}static get DefaultType(){return DefaultType$b}static get NAME(){return NAME$c}next(){this._slide(ORDER_NEXT)}nextWhenVisible(){!document.hidden&&isVisible(this._element)&&this.next()}prev(){this._slide(ORDER_PREV)}pause(){this._isSliding&&triggerTransitionEnd(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.cycle());return}this.cycle()}}to(e){const t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.to(e));return}const r=this._getItemIndex(this._getActive());if(r===e)return;const i=e>r?ORDER_NEXT:ORDER_PREV;this._slide(i,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&EventHandler.on(this._element,EVENT_KEYDOWN$1,e=>this._keydown(e)),this._config.pause==="hover"&&(EventHandler.on(this._element,EVENT_MOUSEENTER$1,()=>this.pause()),EventHandler.on(this._element,EVENT_MOUSELEAVE$1,()=>this._maybeEnableCycle())),this._config.touch&&Swipe.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const r of SelectorEngine.find(SELECTOR_ITEM_IMG,this._element))EventHandler.on(r,EVENT_DRAG_START,i=>i.preventDefault());const t={leftCallback:()=>this._slide(this._directionToOrder(DIRECTION_LEFT)),rightCallback:()=>this._slide(this._directionToOrder(DIRECTION_RIGHT)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),TOUCHEVENT_COMPAT_WAIT+this._config.interval))}};this._swipeHelper=new Swipe(this._element,t)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=KEY_TO_DIRECTION[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;const t=SelectorEngine.findOne(SELECTOR_ACTIVE,this._indicatorsElement);t.classList.remove(CLASS_NAME_ACTIVE$2),t.removeAttribute("aria-current");const r=SelectorEngine.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);r&&(r.classList.add(CLASS_NAME_ACTIVE$2),r.setAttribute("aria-current","true"))}_updateInterval(){const e=this._activeElement||this._getActive();if(!e)return;const t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;const r=this._getActive(),i=e===ORDER_NEXT,s=t||getNextActiveElement(this._getItems(),r,i,this._config.wrap);if(s===r)return;const l=this._getItemIndex(s),u=N=>EventHandler.trigger(this._element,N,{relatedTarget:s,direction:this._orderToDirection(e),from:this._getItemIndex(r),to:l});if(u(EVENT_SLIDE).defaultPrevented||!r||!s)return;const p=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(l),this._activeElement=s;const E=i?CLASS_NAME_START:CLASS_NAME_END,_=i?CLASS_NAME_NEXT:CLASS_NAME_PREV;s.classList.add(_),reflow(s),r.classList.add(E),s.classList.add(E);const S=()=>{s.classList.remove(E,_),s.classList.add(CLASS_NAME_ACTIVE$2),r.classList.remove(CLASS_NAME_ACTIVE$2,_,E),this._isSliding=!1,u(EVENT_SLID)};this._queueCallback(S,r,this._isAnimated()),p&&this.cycle()}_isAnimated(){return this._element.classList.contains(CLASS_NAME_SLIDE)}_getActive(){return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM,this._element)}_getItems(){return SelectorEngine.find(SELECTOR_ITEM,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return isRTL()?e===DIRECTION_LEFT?ORDER_PREV:ORDER_NEXT:e===DIRECTION_LEFT?ORDER_NEXT:ORDER_PREV}_orderToDirection(e){return isRTL()?e===ORDER_PREV?DIRECTION_LEFT:DIRECTION_RIGHT:e===ORDER_PREV?DIRECTION_RIGHT:DIRECTION_LEFT}static jQueryInterface(e){return this.each(function(){const t=Carousel.getOrCreateInstance(this,e);if(typeof e=="number"){t.to(e);return}if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$5,SELECTOR_DATA_SLIDE,function(n){const e=SelectorEngine.getElementFromSelector(this);if(!e||!e.classList.contains(CLASS_NAME_CAROUSEL))return;n.preventDefault();const t=Carousel.getOrCreateInstance(e),r=this.getAttribute("data-bs-slide-to");if(r){t.to(r),t._maybeEnableCycle();return}if(Manipulator.getDataAttribute(this,"slide")==="next"){t.next(),t._maybeEnableCycle();return}t.prev(),t._maybeEnableCycle()});EventHandler.on(window,EVENT_LOAD_DATA_API$3,()=>{const n=SelectorEngine.find(SELECTOR_DATA_RIDE);for(const e of n)Carousel.getOrCreateInstance(e)});defineJQueryPlugin(Carousel);const NAME$b="collapse",DATA_KEY$7="bs.collapse",EVENT_KEY$7=`.${DATA_KEY$7}`,DATA_API_KEY$4=".data-api",EVENT_SHOW$6=`show${EVENT_KEY$7}`,EVENT_SHOWN$6=`shown${EVENT_KEY$7}`,EVENT_HIDE$6=`hide${EVENT_KEY$7}`,EVENT_HIDDEN$6=`hidden${EVENT_KEY$7}`,EVENT_CLICK_DATA_API$4=`click${EVENT_KEY$7}${DATA_API_KEY$4}`,CLASS_NAME_SHOW$7="show",CLASS_NAME_COLLAPSE="collapse",CLASS_NAME_COLLAPSING="collapsing",CLASS_NAME_COLLAPSED="collapsed",CLASS_NAME_DEEPER_CHILDREN=`:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`,CLASS_NAME_HORIZONTAL="collapse-horizontal",WIDTH="width",HEIGHT="height",SELECTOR_ACTIVES=".collapse.show, .collapse.collapsing",SELECTOR_DATA_TOGGLE$4='[data-bs-toggle="collapse"]',Default$a={parent:null,toggle:!0},DefaultType$a={parent:"(null|element)",toggle:"boolean"};class Collapse extends BaseComponent{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];const r=SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);for(const i of r){const s=SelectorEngine.getSelectorFromElement(i),l=SelectorEngine.find(s).filter(u=>u===this._element);s!==null&&l.length&&this._triggerArray.push(i)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Default$a}static get DefaultType(){return DefaultType$a}static get NAME(){return NAME$b}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(u=>u!==this._element).map(u=>Collapse.getOrCreateInstance(u,{toggle:!1}))),e.length&&e[0]._isTransitioning||EventHandler.trigger(this._element,EVENT_SHOW$6).defaultPrevented)return;for(const u of e)u.hide();const r=this._getDimension();this._element.classList.remove(CLASS_NAME_COLLAPSE),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.style[r]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7),this._element.style[r]="",EventHandler.trigger(this._element,EVENT_SHOWN$6)},l=`scroll${r[0].toUpperCase()+r.slice(1)}`;this._queueCallback(i,this._element,!0),this._element.style[r]=`${this._element[l]}px`}hide(){if(this._isTransitioning||!this._isShown()||EventHandler.trigger(this._element,EVENT_HIDE$6).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,reflow(this._element),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.classList.remove(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7);for(const i of this._triggerArray){const s=SelectorEngine.getElementFromSelector(i);s&&!this._isShown(s)&&this._addAriaAndCollapsedClass([i],!1)}this._isTransitioning=!0;const r=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE),EventHandler.trigger(this._element,EVENT_HIDDEN$6)};this._element.style[t]="",this._queueCallback(r,this._element,!0)}_isShown(e=this._element){return e.classList.contains(CLASS_NAME_SHOW$7)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=getElement(e.parent),e}_getDimension(){return this._element.classList.contains(CLASS_NAME_HORIZONTAL)?WIDTH:HEIGHT}_initializeChildren(){if(!this._config.parent)return;const e=this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);for(const t of e){const r=SelectorEngine.getElementFromSelector(t);r&&this._addAriaAndCollapsedClass([t],this._isShown(r))}}_getFirstLevelChildren(e){const t=SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN,this._config.parent);return SelectorEngine.find(e,this._config.parent).filter(r=>!t.includes(r))}_addAriaAndCollapsedClass(e,t){if(e.length)for(const r of e)r.classList.toggle(CLASS_NAME_COLLAPSED,!t),r.setAttribute("aria-expanded",t)}static jQueryInterface(e){const t={};return typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){const r=Collapse.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof r[e]>"u")throw new TypeError(`No method named "${e}"`);r[e]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$4,SELECTOR_DATA_TOGGLE$4,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();for(const e of SelectorEngine.getMultipleElementsFromSelector(this))Collapse.getOrCreateInstance(e,{toggle:!1}).toggle()});defineJQueryPlugin(Collapse);const NAME$a="dropdown",DATA_KEY$6="bs.dropdown",EVENT_KEY$6=`.${DATA_KEY$6}`,DATA_API_KEY$3=".data-api",ESCAPE_KEY$2="Escape",TAB_KEY$1="Tab",ARROW_UP_KEY$1="ArrowUp",ARROW_DOWN_KEY$1="ArrowDown",RIGHT_MOUSE_BUTTON=2,EVENT_HIDE$5=`hide${EVENT_KEY$6}`,EVENT_HIDDEN$5=`hidden${EVENT_KEY$6}`,EVENT_SHOW$5=`show${EVENT_KEY$6}`,EVENT_SHOWN$5=`shown${EVENT_KEY$6}`,EVENT_CLICK_DATA_API$3=`click${EVENT_KEY$6}${DATA_API_KEY$3}`,EVENT_KEYDOWN_DATA_API=`keydown${EVENT_KEY$6}${DATA_API_KEY$3}`,EVENT_KEYUP_DATA_API=`keyup${EVENT_KEY$6}${DATA_API_KEY$3}`,CLASS_NAME_SHOW$6="show",CLASS_NAME_DROPUP="dropup",CLASS_NAME_DROPEND="dropend",CLASS_NAME_DROPSTART="dropstart",CLASS_NAME_DROPUP_CENTER="dropup-center",CLASS_NAME_DROPDOWN_CENTER="dropdown-center",SELECTOR_DATA_TOGGLE$3='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',SELECTOR_DATA_TOGGLE_SHOWN=`${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`,SELECTOR_MENU=".dropdown-menu",SELECTOR_NAVBAR=".navbar",SELECTOR_NAVBAR_NAV=".navbar-nav",SELECTOR_VISIBLE_ITEMS=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",PLACEMENT_TOP=isRTL()?"top-end":"top-start",PLACEMENT_TOPEND=isRTL()?"top-start":"top-end",PLACEMENT_BOTTOM=isRTL()?"bottom-end":"bottom-start",PLACEMENT_BOTTOMEND=isRTL()?"bottom-start":"bottom-end",PLACEMENT_RIGHT=isRTL()?"left-start":"right-start",PLACEMENT_LEFT=isRTL()?"right-start":"left-start",PLACEMENT_TOPCENTER="top",PLACEMENT_BOTTOMCENTER="bottom",Default$9={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},DefaultType$9={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Dropdown extends BaseComponent{constructor(e,t){super(e,t),this._popper=null,this._parent=this._element.parentNode,this._menu=SelectorEngine.next(this._element,SELECTOR_MENU)[0]||SelectorEngine.prev(this._element,SELECTOR_MENU)[0]||SelectorEngine.findOne(SELECTOR_MENU,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Default$9}static get DefaultType(){return DefaultType$9}static get NAME(){return NAME$a}toggle(){return this._isShown()?this.hide():this.show()}show(){if(isDisabled(this._element)||this._isShown())return;const e={relatedTarget:this._element};if(!EventHandler.trigger(this._element,EVENT_SHOW$5,e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(SELECTOR_NAVBAR_NAV))for(const r of[].concat(...document.body.children))EventHandler.on(r,"mouseover",noop);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(CLASS_NAME_SHOW$6),this._element.classList.add(CLASS_NAME_SHOW$6),EventHandler.trigger(this._element,EVENT_SHOWN$5,e)}}hide(){if(isDisabled(this._element)||!this._isShown())return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!EventHandler.trigger(this._element,EVENT_HIDE$5,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(const r of[].concat(...document.body.children))EventHandler.off(r,"mouseover",noop);this._popper&&this._popper.destroy(),this._menu.classList.remove(CLASS_NAME_SHOW$6),this._element.classList.remove(CLASS_NAME_SHOW$6),this._element.setAttribute("aria-expanded","false"),Manipulator.removeDataAttribute(this._menu,"popper"),EventHandler.trigger(this._element,EVENT_HIDDEN$5,e)}}_getConfig(e){if(e=super._getConfig(e),typeof e.reference=="object"&&!isElement(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(){if(typeof Popper>"u")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;this._config.reference==="parent"?e=this._parent:isElement(this._config.reference)?e=getElement(this._config.reference):typeof this._config.reference=="object"&&(e=this._config.reference);const t=this._getPopperConfig();this._popper=createPopper(e,this._menu,t)}_isShown(){return this._menu.classList.contains(CLASS_NAME_SHOW$6)}_getPlacement(){const e=this._parent;if(e.classList.contains(CLASS_NAME_DROPEND))return PLACEMENT_RIGHT;if(e.classList.contains(CLASS_NAME_DROPSTART))return PLACEMENT_LEFT;if(e.classList.contains(CLASS_NAME_DROPUP_CENTER))return PLACEMENT_TOPCENTER;if(e.classList.contains(CLASS_NAME_DROPDOWN_CENTER))return PLACEMENT_BOTTOMCENTER;const t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(CLASS_NAME_DROPUP)?t?PLACEMENT_TOPEND:PLACEMENT_TOP:t?PLACEMENT_BOTTOMEND:PLACEMENT_BOTTOM}_detectNavbar(){return this._element.closest(SELECTOR_NAVBAR)!==null}_getOffset(){const{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(Manipulator.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,...execute(this._config.popperConfig,[e])}}_selectMenuItem({key:e,target:t}){const r=SelectorEngine.find(SELECTOR_VISIBLE_ITEMS,this._menu).filter(i=>isVisible(i));r.length&&getNextActiveElement(r,t,e===ARROW_DOWN_KEY$1,!r.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){const t=Dropdown.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e.button===RIGHT_MOUSE_BUTTON||e.type==="keyup"&&e.key!==TAB_KEY$1)return;const t=SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);for(const r of t){const i=Dropdown.getInstance(r);if(!i||i._config.autoClose===!1)continue;const s=e.composedPath(),l=s.includes(i._menu);if(s.includes(i._element)||i._config.autoClose==="inside"&&!l||i._config.autoClose==="outside"&&l||i._menu.contains(e.target)&&(e.type==="keyup"&&e.key===TAB_KEY$1||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;const u={relatedTarget:i._element};e.type==="click"&&(u.clickEvent=e),i._completeHide(u)}}static dataApiKeydownHandler(e){const t=/input|textarea/i.test(e.target.tagName),r=e.key===ESCAPE_KEY$2,i=[ARROW_UP_KEY$1,ARROW_DOWN_KEY$1].includes(e.key);if(!i&&!r||t&&!r)return;e.preventDefault();const s=this.matches(SELECTOR_DATA_TOGGLE$3)?this:SelectorEngine.prev(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.next(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3,e.delegateTarget.parentNode),l=Dropdown.getOrCreateInstance(s);if(i){e.stopPropagation(),l.show(),l._selectMenuItem(e);return}l._isShown()&&(e.stopPropagation(),l.hide(),s.focus())}}EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_DATA_TOGGLE$3,Dropdown.dataApiKeydownHandler);EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_MENU,Dropdown.dataApiKeydownHandler);EventHandler.on(document,EVENT_CLICK_DATA_API$3,Dropdown.clearMenus);EventHandler.on(document,EVENT_KEYUP_DATA_API,Dropdown.clearMenus);EventHandler.on(document,EVENT_CLICK_DATA_API$3,SELECTOR_DATA_TOGGLE$3,function(n){n.preventDefault(),Dropdown.getOrCreateInstance(this).toggle()});defineJQueryPlugin(Dropdown);const NAME$9="backdrop",CLASS_NAME_FADE$4="fade",CLASS_NAME_SHOW$5="show",EVENT_MOUSEDOWN=`mousedown.bs.${NAME$9}`,Default$8={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},DefaultType$8={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Backdrop extends Config{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return Default$8}static get DefaultType(){return DefaultType$8}static get NAME(){return NAME$9}show(e){if(!this._config.isVisible){execute(e);return}this._append();const t=this._getElement();this._config.isAnimated&&reflow(t),t.classList.add(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{execute(e)})}hide(e){if(!this._config.isVisible){execute(e);return}this._getElement().classList.remove(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{this.dispose(),execute(e)})}dispose(){this._isAppended&&(EventHandler.off(this._element,EVENT_MOUSEDOWN),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(CLASS_NAME_FADE$4),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=getElement(e.rootElement),e}_append(){if(this._isAppended)return;const e=this._getElement();this._config.rootElement.append(e),EventHandler.on(e,EVENT_MOUSEDOWN,()=>{execute(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){executeAfterTransition(e,this._getElement(),this._config.isAnimated)}}const NAME$8="focustrap",DATA_KEY$5="bs.focustrap",EVENT_KEY$5=`.${DATA_KEY$5}`,EVENT_FOCUSIN$2=`focusin${EVENT_KEY$5}`,EVENT_KEYDOWN_TAB=`keydown.tab${EVENT_KEY$5}`,TAB_KEY="Tab",TAB_NAV_FORWARD="forward",TAB_NAV_BACKWARD="backward",Default$7={autofocus:!0,trapElement:null},DefaultType$7={autofocus:"boolean",trapElement:"element"};class FocusTrap extends Config{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Default$7}static get DefaultType(){return DefaultType$7}static get NAME(){return NAME$8}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),EventHandler.off(document,EVENT_KEY$5),EventHandler.on(document,EVENT_FOCUSIN$2,e=>this._handleFocusin(e)),EventHandler.on(document,EVENT_KEYDOWN_TAB,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,EventHandler.off(document,EVENT_KEY$5))}_handleFocusin(e){const{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;const r=SelectorEngine.focusableChildren(t);r.length===0?t.focus():this._lastTabNavDirection===TAB_NAV_BACKWARD?r[r.length-1].focus():r[0].focus()}_handleKeydown(e){e.key===TAB_KEY&&(this._lastTabNavDirection=e.shiftKey?TAB_NAV_BACKWARD:TAB_NAV_FORWARD)}}const SELECTOR_FIXED_CONTENT=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",SELECTOR_STICKY_CONTENT=".sticky-top",PROPERTY_PADDING="padding-right",PROPERTY_MARGIN="margin-right";class ScrollBarHelper{constructor(){this._element=document.body}getWidth(){const e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){const e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,PROPERTY_PADDING,t=>t+e),this._setElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING,t=>t+e),this._setElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,r){const i=this.getWidth(),s=l=>{if(l!==this._element&&window.innerWidth>l.clientWidth+i)return;this._saveInitialAttribute(l,t);const u=window.getComputedStyle(l).getPropertyValue(t);l.style.setProperty(t,`${r(Number.parseFloat(u))}px`)};this._applyManipulationCallback(e,s)}_saveInitialAttribute(e,t){const r=e.style.getPropertyValue(t);r&&Manipulator.setDataAttribute(e,t,r)}_resetElementAttributes(e,t){const r=i=>{const s=Manipulator.getDataAttribute(i,t);if(s===null){i.style.removeProperty(t);return}Manipulator.removeDataAttribute(i,t),i.style.setProperty(t,s)};this._applyManipulationCallback(e,r)}_applyManipulationCallback(e,t){if(isElement(e)){t(e);return}for(const r of SelectorEngine.find(e,this._element))t(r)}}const NAME$7="modal",DATA_KEY$4="bs.modal",EVENT_KEY$4=`.${DATA_KEY$4}`,DATA_API_KEY$2=".data-api",ESCAPE_KEY$1="Escape",EVENT_HIDE$4=`hide${EVENT_KEY$4}`,EVENT_HIDE_PREVENTED$1=`hidePrevented${EVENT_KEY$4}`,EVENT_HIDDEN$4=`hidden${EVENT_KEY$4}`,EVENT_SHOW$4=`show${EVENT_KEY$4}`,EVENT_SHOWN$4=`shown${EVENT_KEY$4}`,EVENT_RESIZE$1=`resize${EVENT_KEY$4}`,EVENT_CLICK_DISMISS=`click.dismiss${EVENT_KEY$4}`,EVENT_MOUSEDOWN_DISMISS=`mousedown.dismiss${EVENT_KEY$4}`,EVENT_KEYDOWN_DISMISS$1=`keydown.dismiss${EVENT_KEY$4}`,EVENT_CLICK_DATA_API$2=`click${EVENT_KEY$4}${DATA_API_KEY$2}`,CLASS_NAME_OPEN="modal-open",CLASS_NAME_FADE$3="fade",CLASS_NAME_SHOW$4="show",CLASS_NAME_STATIC="modal-static",OPEN_SELECTOR$1=".modal.show",SELECTOR_DIALOG=".modal-dialog",SELECTOR_MODAL_BODY=".modal-body",SELECTOR_DATA_TOGGLE$2='[data-bs-toggle="modal"]',Default$6={backdrop:!0,focus:!0,keyboard:!0},DefaultType$6={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Modal extends BaseComponent{constructor(e,t){super(e,t),this._dialog=SelectorEngine.findOne(SELECTOR_DIALOG,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ScrollBarHelper,this._addEventListeners()}static get Default(){return Default$6}static get DefaultType(){return DefaultType$6}static get NAME(){return NAME$7}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||EventHandler.trigger(this._element,EVENT_SHOW$4,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(CLASS_NAME_OPEN),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||EventHandler.trigger(this._element,EVENT_HIDE$4).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(CLASS_NAME_SHOW$4),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){EventHandler.off(window,EVENT_KEY$4),EventHandler.off(this._dialog,EVENT_KEY$4),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Backdrop({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const t=SelectorEngine.findOne(SELECTOR_MODAL_BODY,this._dialog);t&&(t.scrollTop=0),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW$4);const r=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,EventHandler.trigger(this._element,EVENT_SHOWN$4,{relatedTarget:e})};this._queueCallback(r,this._dialog,this._isAnimated())}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS$1,e=>{if(e.key===ESCAPE_KEY$1){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),EventHandler.on(window,EVENT_RESIZE$1,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),EventHandler.on(this._element,EVENT_MOUSEDOWN_DISMISS,e=>{EventHandler.one(this._element,EVENT_CLICK_DISMISS,t=>{if(!(this._element!==e.target||this._element!==t.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(CLASS_NAME_OPEN),this._resetAdjustments(),this._scrollBar.reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$4)})}_isAnimated(){return this._element.classList.contains(CLASS_NAME_FADE$3)}_triggerBackdropTransition(){if(EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED$1).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,r=this._element.style.overflowY;r==="hidden"||this._element.classList.contains(CLASS_NAME_STATIC)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.classList.remove(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.style.overflowY=r},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),r=t>0;if(r&&!e){const i=isRTL()?"paddingLeft":"paddingRight";this._element.style[i]=`${t}px`}if(!r&&e){const i=isRTL()?"paddingRight":"paddingLeft";this._element.style[i]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){const r=Modal.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof r[e]>"u")throw new TypeError(`No method named "${e}"`);r[e](t)}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$2,SELECTOR_DATA_TOGGLE$2,function(n){const e=SelectorEngine.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),EventHandler.one(e,EVENT_SHOW$4,i=>{i.defaultPrevented||EventHandler.one(e,EVENT_HIDDEN$4,()=>{isVisible(this)&&this.focus()})});const t=SelectorEngine.findOne(OPEN_SELECTOR$1);t&&Modal.getInstance(t).hide(),Modal.getOrCreateInstance(e).toggle(this)});enableDismissTrigger(Modal);defineJQueryPlugin(Modal);const NAME$6="offcanvas",DATA_KEY$3="bs.offcanvas",EVENT_KEY$3=`.${DATA_KEY$3}`,DATA_API_KEY$1=".data-api",EVENT_LOAD_DATA_API$2=`load${EVENT_KEY$3}${DATA_API_KEY$1}`,ESCAPE_KEY="Escape",CLASS_NAME_SHOW$3="show",CLASS_NAME_SHOWING$1="showing",CLASS_NAME_HIDING="hiding",CLASS_NAME_BACKDROP="offcanvas-backdrop",OPEN_SELECTOR=".offcanvas.show",EVENT_SHOW$3=`show${EVENT_KEY$3}`,EVENT_SHOWN$3=`shown${EVENT_KEY$3}`,EVENT_HIDE$3=`hide${EVENT_KEY$3}`,EVENT_HIDE_PREVENTED=`hidePrevented${EVENT_KEY$3}`,EVENT_HIDDEN$3=`hidden${EVENT_KEY$3}`,EVENT_RESIZE=`resize${EVENT_KEY$3}`,EVENT_CLICK_DATA_API$1=`click${EVENT_KEY$3}${DATA_API_KEY$1}`,EVENT_KEYDOWN_DISMISS=`keydown.dismiss${EVENT_KEY$3}`,SELECTOR_DATA_TOGGLE$1='[data-bs-toggle="offcanvas"]',Default$5={backdrop:!0,keyboard:!0,scroll:!1},DefaultType$5={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Offcanvas extends BaseComponent{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Default$5}static get DefaultType(){return DefaultType$5}static get NAME(){return NAME$6}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||EventHandler.trigger(this._element,EVENT_SHOW$3,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||new ScrollBarHelper().hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(CLASS_NAME_SHOWING$1);const r=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(CLASS_NAME_SHOW$3),this._element.classList.remove(CLASS_NAME_SHOWING$1),EventHandler.trigger(this._element,EVENT_SHOWN$3,{relatedTarget:e})};this._queueCallback(r,this._element,!0)}hide(){if(!this._isShown||EventHandler.trigger(this._element,EVENT_HIDE$3).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(CLASS_NAME_HIDING),this._backdrop.hide();const t=()=>{this._element.classList.remove(CLASS_NAME_SHOW$3,CLASS_NAME_HIDING),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||new ScrollBarHelper().reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$3)};this._queueCallback(t,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const e=()=>{if(this._config.backdrop==="static"){EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED);return}this.hide()},t=!!this._config.backdrop;return new Backdrop({className:CLASS_NAME_BACKDROP,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?e:null})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS,e=>{if(e.key===ESCAPE_KEY){if(this._config.keyboard){this.hide();return}EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED)}})}static jQueryInterface(e){return this.each(function(){const t=Offcanvas.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$1,SELECTOR_DATA_TOGGLE$1,function(n){const e=SelectorEngine.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),isDisabled(this))return;EventHandler.one(e,EVENT_HIDDEN$3,()=>{isVisible(this)&&this.focus()});const t=SelectorEngine.findOne(OPEN_SELECTOR);t&&t!==e&&Offcanvas.getInstance(t).hide(),Offcanvas.getOrCreateInstance(e).toggle(this)});EventHandler.on(window,EVENT_LOAD_DATA_API$2,()=>{for(const n of SelectorEngine.find(OPEN_SELECTOR))Offcanvas.getOrCreateInstance(n).show()});EventHandler.on(window,EVENT_RESIZE,()=>{for(const n of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(n).position!=="fixed"&&Offcanvas.getOrCreateInstance(n).hide()});enableDismissTrigger(Offcanvas);defineJQueryPlugin(Offcanvas);const ARIA_ATTRIBUTE_PATTERN=/^aria-[\w-]*$/i,DefaultAllowlist={"*":["class","dir","id","lang","role",ARIA_ATTRIBUTE_PATTERN],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},uriAttributes=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),SAFE_URL_PATTERN=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,allowedAttribute=(n,e)=>{const t=n.nodeName.toLowerCase();return e.includes(t)?uriAttributes.has(t)?!!SAFE_URL_PATTERN.test(n.nodeValue):!0:e.filter(r=>r instanceof RegExp).some(r=>r.test(t))};function sanitizeHtml(n,e,t){if(!n.length)return n;if(t&&typeof t=="function")return t(n);const i=new window.DOMParser().parseFromString(n,"text/html"),s=[].concat(...i.body.querySelectorAll("*"));for(const l of s){const u=l.nodeName.toLowerCase();if(!Object.keys(e).includes(u)){l.remove();continue}const h=[].concat(...l.attributes),p=[].concat(e["*"]||[],e[u]||[]);for(const E of h)allowedAttribute(E,p)||l.removeAttribute(E.nodeName)}return i.body.innerHTML}const NAME$5="TemplateFactory",Default$4={allowList:DefaultAllowlist,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},DefaultType$4={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},DefaultContentType={entry:"(string|element|function|null)",selector:"(string|element)"};class TemplateFactory extends Config{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Default$4}static get DefaultType(){return DefaultType$4}static get NAME(){return NAME$5}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){const e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(const[i,s]of Object.entries(this._config.content))this._setContent(e,s,i);const t=e.children[0],r=this._resolvePossibleFunction(this._config.extraClass);return r&&t.classList.add(...r.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(const[t,r]of Object.entries(e))super._typeCheckConfig({selector:t,entry:r},DefaultContentType)}_setContent(e,t,r){const i=SelectorEngine.findOne(r,e);if(i){if(t=this._resolvePossibleFunction(t),!t){i.remove();return}if(isElement(t)){this._putElementInTemplate(getElement(t),i);return}if(this._config.html){i.innerHTML=this._maybeSanitize(t);return}i.textContent=t}}_maybeSanitize(e){return this._config.sanitize?sanitizeHtml(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return execute(e,[this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML="",t.append(e);return}t.textContent=e.textContent}}const NAME$4="tooltip",DISALLOWED_ATTRIBUTES=new Set(["sanitize","allowList","sanitizeFn"]),CLASS_NAME_FADE$2="fade",CLASS_NAME_MODAL="modal",CLASS_NAME_SHOW$2="show",SELECTOR_TOOLTIP_INNER=".tooltip-inner",SELECTOR_MODAL=`.${CLASS_NAME_MODAL}`,EVENT_MODAL_HIDE="hide.bs.modal",TRIGGER_HOVER="hover",TRIGGER_FOCUS="focus",TRIGGER_CLICK="click",TRIGGER_MANUAL="manual",EVENT_HIDE$2="hide",EVENT_HIDDEN$2="hidden",EVENT_SHOW$2="show",EVENT_SHOWN$2="shown",EVENT_INSERTED="inserted",EVENT_CLICK$1="click",EVENT_FOCUSIN$1="focusin",EVENT_FOCUSOUT$1="focusout",EVENT_MOUSEENTER="mouseenter",EVENT_MOUSELEAVE="mouseleave",AttachmentMap={AUTO:"auto",TOP:"top",RIGHT:isRTL()?"left":"right",BOTTOM:"bottom",LEFT:isRTL()?"right":"left"},Default$3={allowList:DefaultAllowlist,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'
',title:"",trigger:"hover focus"},DefaultType$3={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class Tooltip extends BaseComponent{constructor(e,t){if(typeof Popper>"u")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Default$3}static get DefaultType(){return DefaultType$3}static get NAME(){return NAME$4}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),EventHandler.off(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;const e=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOW$2)),r=(findShadowRoot(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!r)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:s}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_INSERTED))),this._popper=this._createPopper(i),i.classList.add(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const u of[].concat(...document.body.children))EventHandler.on(u,"mouseover",noop);const l=()=>{EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOWN$2)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(l,this.tip,this._isAnimated())}hide(){if(!this._isShown()||EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDE$2)).defaultPrevented)return;if(this._getTipElement().classList.remove(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const i of[].concat(...document.body.children))EventHandler.off(i,"mouseover",noop);this._activeTrigger[TRIGGER_CLICK]=!1,this._activeTrigger[TRIGGER_FOCUS]=!1,this._activeTrigger[TRIGGER_HOVER]=!1,this._isHovered=null;const r=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDDEN$2)))};this._queueCallback(r,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){const t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(CLASS_NAME_FADE$2,CLASS_NAME_SHOW$2),t.classList.add(`bs-${this.constructor.NAME}-auto`);const r=getUID(this.constructor.NAME).toString();return t.setAttribute("id",r),this._isAnimated()&&t.classList.add(CLASS_NAME_FADE$2),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new TemplateFactory({...this._config,content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[SELECTOR_TOOLTIP_INNER]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(CLASS_NAME_FADE$2)}_isShown(){return this.tip&&this.tip.classList.contains(CLASS_NAME_SHOW$2)}_createPopper(e){const t=execute(this._config.placement,[this,e,this._element]),r=AttachmentMap[t.toUpperCase()];return createPopper(this._element,e,this._getPopperConfig(r))}_getOffset(){const{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return execute(e,[this._element])}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:r=>{this._getTipElement().setAttribute("data-popper-placement",r.state.placement)}}]};return{...t,...execute(this._config.popperConfig,[t])}}_setListeners(){const e=this._config.trigger.split(" ");for(const t of e)if(t==="click")EventHandler.on(this._element,this.constructor.eventName(EVENT_CLICK$1),this._config.selector,r=>{this._initializeOnDelegatedTarget(r).toggle()});else if(t!==TRIGGER_MANUAL){const r=t===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSEENTER):this.constructor.eventName(EVENT_FOCUSIN$1),i=t===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSELEAVE):this.constructor.eventName(EVENT_FOCUSOUT$1);EventHandler.on(this._element,r,this._config.selector,s=>{const l=this._initializeOnDelegatedTarget(s);l._activeTrigger[s.type==="focusin"?TRIGGER_FOCUS:TRIGGER_HOVER]=!0,l._enter()}),EventHandler.on(this._element,i,this._config.selector,s=>{const l=this._initializeOnDelegatedTarget(s);l._activeTrigger[s.type==="focusout"?TRIGGER_FOCUS:TRIGGER_HOVER]=l._element.contains(s.relatedTarget),l._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},EventHandler.on(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler)}_fixTitle(){const e=this._element.getAttribute("title");e&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){const t=Manipulator.getDataAttributes(this._element);for(const r of Object.keys(t))DISALLOWED_ATTRIBUTES.has(r)&&delete t[r];return e={...t,...typeof e=="object"&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:getElement(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){const e={};for(const[t,r]of Object.entries(this._config))this.constructor.Default[t]!==r&&(e[t]=r);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){const t=Tooltip.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}defineJQueryPlugin(Tooltip);const NAME$3="popover",SELECTOR_TITLE=".popover-header",SELECTOR_CONTENT=".popover-body",Default$2={...Tooltip.Default,content:"",offset:[0,8],placement:"right",template:'
',trigger:"click"},DefaultType$2={...Tooltip.DefaultType,content:"(null|string|element|function)"};class Popover extends Tooltip{static get Default(){return Default$2}static get DefaultType(){return DefaultType$2}static get NAME(){return NAME$3}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[SELECTOR_TITLE]:this._getTitle(),[SELECTOR_CONTENT]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){const t=Popover.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e]()}})}}defineJQueryPlugin(Popover);const NAME$2="scrollspy",DATA_KEY$2="bs.scrollspy",EVENT_KEY$2=`.${DATA_KEY$2}`,DATA_API_KEY=".data-api",EVENT_ACTIVATE=`activate${EVENT_KEY$2}`,EVENT_CLICK=`click${EVENT_KEY$2}`,EVENT_LOAD_DATA_API$1=`load${EVENT_KEY$2}${DATA_API_KEY}`,CLASS_NAME_DROPDOWN_ITEM="dropdown-item",CLASS_NAME_ACTIVE$1="active",SELECTOR_DATA_SPY='[data-bs-spy="scroll"]',SELECTOR_TARGET_LINKS="[href]",SELECTOR_NAV_LIST_GROUP=".nav, .list-group",SELECTOR_NAV_LINKS=".nav-link",SELECTOR_NAV_ITEMS=".nav-item",SELECTOR_LIST_ITEMS=".list-group-item",SELECTOR_LINK_ITEMS=`${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`,SELECTOR_DROPDOWN=".dropdown",SELECTOR_DROPDOWN_TOGGLE$1=".dropdown-toggle",Default$1={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},DefaultType$1={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class ScrollSpy extends BaseComponent{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Default$1}static get DefaultType(){return DefaultType$1}static get NAME(){return NAME$2}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=getElement(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(t=>Number.parseFloat(t))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(EventHandler.off(this._config.target,EVENT_CLICK),EventHandler.on(this._config.target,EVENT_CLICK,SELECTOR_TARGET_LINKS,e=>{const t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();const r=this._rootElement||window,i=t.offsetTop-this._element.offsetTop;if(r.scrollTo){r.scrollTo({top:i,behavior:"smooth"});return}r.scrollTop=i}}))}_getNewObserver(){const e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),e)}_observerCallback(e){const t=l=>this._targetLinks.get(`#${l.target.id}`),r=l=>{this._previousScrollData.visibleEntryTop=l.target.offsetTop,this._process(t(l))},i=(this._rootElement||document.documentElement).scrollTop,s=i>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=i;for(const l of e){if(!l.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(l));continue}const u=l.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&u){if(r(l),!i)return;continue}!s&&!u&&r(l)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const e=SelectorEngine.find(SELECTOR_TARGET_LINKS,this._config.target);for(const t of e){if(!t.hash||isDisabled(t))continue;const r=SelectorEngine.findOne(decodeURI(t.hash),this._element);isVisible(r)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,r))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(CLASS_NAME_ACTIVE$1),this._activateParents(e),EventHandler.trigger(this._element,EVENT_ACTIVATE,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(CLASS_NAME_DROPDOWN_ITEM)){SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1,e.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);return}for(const t of SelectorEngine.parents(e,SELECTOR_NAV_LIST_GROUP))for(const r of SelectorEngine.prev(t,SELECTOR_LINK_ITEMS))r.classList.add(CLASS_NAME_ACTIVE$1)}_clearActiveClass(e){e.classList.remove(CLASS_NAME_ACTIVE$1);const t=SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`,e);for(const r of t)r.classList.remove(CLASS_NAME_ACTIVE$1)}static jQueryInterface(e){return this.each(function(){const t=ScrollSpy.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}EventHandler.on(window,EVENT_LOAD_DATA_API$1,()=>{for(const n of SelectorEngine.find(SELECTOR_DATA_SPY))ScrollSpy.getOrCreateInstance(n)});defineJQueryPlugin(ScrollSpy);const NAME$1="tab",DATA_KEY$1="bs.tab",EVENT_KEY$1=`.${DATA_KEY$1}`,EVENT_HIDE$1=`hide${EVENT_KEY$1}`,EVENT_HIDDEN$1=`hidden${EVENT_KEY$1}`,EVENT_SHOW$1=`show${EVENT_KEY$1}`,EVENT_SHOWN$1=`shown${EVENT_KEY$1}`,EVENT_CLICK_DATA_API=`click${EVENT_KEY$1}`,EVENT_KEYDOWN=`keydown${EVENT_KEY$1}`,EVENT_LOAD_DATA_API=`load${EVENT_KEY$1}`,ARROW_LEFT_KEY="ArrowLeft",ARROW_RIGHT_KEY="ArrowRight",ARROW_UP_KEY="ArrowUp",ARROW_DOWN_KEY="ArrowDown",HOME_KEY="Home",END_KEY="End",CLASS_NAME_ACTIVE="active",CLASS_NAME_FADE$1="fade",CLASS_NAME_SHOW$1="show",CLASS_DROPDOWN="dropdown",SELECTOR_DROPDOWN_TOGGLE=".dropdown-toggle",SELECTOR_DROPDOWN_MENU=".dropdown-menu",NOT_SELECTOR_DROPDOWN_TOGGLE=`:not(${SELECTOR_DROPDOWN_TOGGLE})`,SELECTOR_TAB_PANEL='.list-group, .nav, [role="tablist"]',SELECTOR_OUTER=".nav-item, .list-group-item",SELECTOR_INNER=`.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`,SELECTOR_DATA_TOGGLE='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',SELECTOR_INNER_ELEM=`${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`,SELECTOR_DATA_TOGGLE_ACTIVE=`.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;class Tab extends BaseComponent{constructor(e){super(e),this._parent=this._element.closest(SELECTOR_TAB_PANEL),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),EventHandler.on(this._element,EVENT_KEYDOWN,t=>this._keydown(t)))}static get NAME(){return NAME$1}show(){const e=this._element;if(this._elemIsActive(e))return;const t=this._getActiveElem(),r=t?EventHandler.trigger(t,EVENT_HIDE$1,{relatedTarget:e}):null;EventHandler.trigger(e,EVENT_SHOW$1,{relatedTarget:t}).defaultPrevented||r&&r.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){if(!e)return;e.classList.add(CLASS_NAME_ACTIVE),this._activate(SelectorEngine.getElementFromSelector(e));const r=()=>{if(e.getAttribute("role")!=="tab"){e.classList.add(CLASS_NAME_SHOW$1);return}e.removeAttribute("tabindex"),e.setAttribute("aria-selected",!0),this._toggleDropDown(e,!0),EventHandler.trigger(e,EVENT_SHOWN$1,{relatedTarget:t})};this._queueCallback(r,e,e.classList.contains(CLASS_NAME_FADE$1))}_deactivate(e,t){if(!e)return;e.classList.remove(CLASS_NAME_ACTIVE),e.blur(),this._deactivate(SelectorEngine.getElementFromSelector(e));const r=()=>{if(e.getAttribute("role")!=="tab"){e.classList.remove(CLASS_NAME_SHOW$1);return}e.setAttribute("aria-selected",!1),e.setAttribute("tabindex","-1"),this._toggleDropDown(e,!1),EventHandler.trigger(e,EVENT_HIDDEN$1,{relatedTarget:t})};this._queueCallback(r,e,e.classList.contains(CLASS_NAME_FADE$1))}_keydown(e){if(![ARROW_LEFT_KEY,ARROW_RIGHT_KEY,ARROW_UP_KEY,ARROW_DOWN_KEY,HOME_KEY,END_KEY].includes(e.key))return;e.stopPropagation(),e.preventDefault();const t=this._getChildren().filter(i=>!isDisabled(i));let r;if([HOME_KEY,END_KEY].includes(e.key))r=t[e.key===HOME_KEY?0:t.length-1];else{const i=[ARROW_RIGHT_KEY,ARROW_DOWN_KEY].includes(e.key);r=getNextActiveElement(t,e.target,i,!0)}r&&(r.focus({preventScroll:!0}),Tab.getOrCreateInstance(r).show())}_getChildren(){return SelectorEngine.find(SELECTOR_INNER_ELEM,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(const r of t)this._setInitialAttributesOnChild(r)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);const t=this._elemIsActive(e),r=this._getOuterElement(e);e.setAttribute("aria-selected",t),r!==e&&this._setAttributeIfNotExists(r,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){const t=SelectorEngine.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(t,"aria-labelledby",`${e.id}`))}_toggleDropDown(e,t){const r=this._getOuterElement(e);if(!r.classList.contains(CLASS_DROPDOWN))return;const i=(s,l)=>{const u=SelectorEngine.findOne(s,r);u&&u.classList.toggle(l,t)};i(SELECTOR_DROPDOWN_TOGGLE,CLASS_NAME_ACTIVE),i(SELECTOR_DROPDOWN_MENU,CLASS_NAME_SHOW$1),r.setAttribute("aria-expanded",t)}_setAttributeIfNotExists(e,t,r){e.hasAttribute(t)||e.setAttribute(t,r)}_elemIsActive(e){return e.classList.contains(CLASS_NAME_ACTIVE)}_getInnerElement(e){return e.matches(SELECTOR_INNER_ELEM)?e:SelectorEngine.findOne(SELECTOR_INNER_ELEM,e)}_getOuterElement(e){return e.closest(SELECTOR_OUTER)||e}static jQueryInterface(e){return this.each(function(){const t=Tab.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API,SELECTOR_DATA_TOGGLE,function(n){["A","AREA"].includes(this.tagName)&&n.preventDefault(),!isDisabled(this)&&Tab.getOrCreateInstance(this).show()});EventHandler.on(window,EVENT_LOAD_DATA_API,()=>{for(const n of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE))Tab.getOrCreateInstance(n)});defineJQueryPlugin(Tab);const NAME="toast",DATA_KEY="bs.toast",EVENT_KEY=`.${DATA_KEY}`,EVENT_MOUSEOVER=`mouseover${EVENT_KEY}`,EVENT_MOUSEOUT=`mouseout${EVENT_KEY}`,EVENT_FOCUSIN=`focusin${EVENT_KEY}`,EVENT_FOCUSOUT=`focusout${EVENT_KEY}`,EVENT_HIDE=`hide${EVENT_KEY}`,EVENT_HIDDEN=`hidden${EVENT_KEY}`,EVENT_SHOW=`show${EVENT_KEY}`,EVENT_SHOWN=`shown${EVENT_KEY}`,CLASS_NAME_FADE="fade",CLASS_NAME_HIDE="hide",CLASS_NAME_SHOW="show",CLASS_NAME_SHOWING="showing",DefaultType={animation:"boolean",autohide:"boolean",delay:"number"},Default={animation:!0,autohide:!0,delay:5e3};class Toast extends BaseComponent{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Default}static get DefaultType(){return DefaultType}static get NAME(){return NAME}show(){if(EventHandler.trigger(this._element,EVENT_SHOW).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(CLASS_NAME_FADE);const t=()=>{this._element.classList.remove(CLASS_NAME_SHOWING),EventHandler.trigger(this._element,EVENT_SHOWN),this._maybeScheduleHide()};this._element.classList.remove(CLASS_NAME_HIDE),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW,CLASS_NAME_SHOWING),this._queueCallback(t,this._element,this._config.animation)}hide(){if(!this.isShown()||EventHandler.trigger(this._element,EVENT_HIDE).defaultPrevented)return;const t=()=>{this._element.classList.add(CLASS_NAME_HIDE),this._element.classList.remove(CLASS_NAME_SHOWING,CLASS_NAME_SHOW),EventHandler.trigger(this._element,EVENT_HIDDEN)};this._element.classList.add(CLASS_NAME_SHOWING),this._queueCallback(t,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(CLASS_NAME_SHOW),super.dispose()}isShown(){return this._element.classList.contains(CLASS_NAME_SHOW)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=t;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=t;break}}if(t){this._clearTimeout();return}const r=e.relatedTarget;this._element===r||this._element.contains(r)||this._maybeScheduleHide()}_setListeners(){EventHandler.on(this._element,EVENT_MOUSEOVER,e=>this._onInteraction(e,!0)),EventHandler.on(this._element,EVENT_MOUSEOUT,e=>this._onInteraction(e,!1)),EventHandler.on(this._element,EVENT_FOCUSIN,e=>this._onInteraction(e,!0)),EventHandler.on(this._element,EVENT_FOCUSOUT,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){const t=Toast.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]>"u")throw new TypeError(`No method named "${e}"`);t[e](this)}})}}enableDismissTrigger(Toast);defineJQueryPlugin(Toast);class AutoLookUpAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");L(this,"makeQuery",(e,t)=>{let r="";return typeof t=="number"&&(r=`${e.code} = ${t}`),typeof t=="string"&&(r=`${e.code} = "${t}"`),this.props.condition.queryString&&(r=`${r} and (${this.props.condition.queryString})`),r});L(this,"getUpdateRecords",async(e,t)=>await new index_browser.KintoneRestAPIClient().record.getAllRecords({app:this.props.lookupField.app.id,fields:["$id"],condition:this.makeQuery(e,t)}));L(this,"convertForLookup",(e,t,r)=>e.map(i=>({id:Number(i.$id.value),record:{[t.code]:{value:r}}})));L(this,"updateLookupTarget",async e=>{if(e&&e.length>0)try{const r=await new index_browser.KintoneRestAPIClient().record.updateAllRecords({app:this.props.lookupField.app.id,records:e});return!0}catch(t){if(t instanceof index_browser.KintoneAllRecordsError)return this.showError(this.props.lookupField.app,this.props.lookupField.fields[0],t,e.length),!1;throw t}return!1});L(this,"showSpinnerModel",(e,t)=>{let r=$("#alcLookupModal");if(r.length===0){const i=`
@@ -97,8 +97,8 @@ var Bn=Object.defineProperty;var Vn=(n,e,t)=>e in n?Bn(n,e,{enumerable:!0,config
更新件数:${r}件
`;i.html(s)});L(this,"showError",(e,t,r,i)=>{const s=r.error.message,l=r.numOfProcessedRecords,u=r.numOfAllRecords,h=$(`#alcLookupModal .modal-body #app${e.id}_${t.code}`),p=`
✖
${e.name}
更新件数:${l}/${u}
-
${s}
`;h.html(p)});L(this,"closeDialog",()=>{const e=$("#alcLookupModal");Modal.getOrCreateInstance(e.get()[0]).dispose(),$("#alcLookupModal").parent().remove()});this.name="ルックアップ更新",this.actionProps=[],this.props={},this.register()}async process(e,t,r){this.actionProps=e.actionProps,this.props={...e.ActionValue,condition:JSON.parse(e.ActionValue.condition)};let i={canNext:!0,result:""};try{const s=this.props.lookupField.fields.filter(_=>_.lookup&&_.lookup.relatedApp.app===String(kintone.app.getId()));if(!s||s.length===0)throw new Error(`ルックアップの設定は不正です。${this.props.lookupField.fields[0].label} `);const l=this.props.lookupField.fields[0],u=t.record[l.lookup.relatedKeyField].value,h=await this.getUpdateRecords(l,u);if(h.length===0)return i;const p=this.convertForLookup(h,l,u);console.log("updateRecords",p),this.showSpinnerModel(this.props.lookupField.app,l),await this.updateLookupTarget(p)&&this.showResult(this.props.lookupField.app,l,p.length)}catch(s){this.closeDialog(),r.errors.handleError(s,e,"ルックアップ更新中例外が発生しました"),i.canNext=!1}return i}register(){actionAddins[this.name]=this}}new AutoLookUpAction;class FieldDisableAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="編集可/不可",this.actionProps=[],this.props={field:{code:""},editable:"",condition:""},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{if(this.actionProps=e.actionProps,!("field"in e.ActionValue)&&!("editable"in e.ActionValue))return i;this.props=e.ActionValue;const s=this.getConditionResult(r),l=t.record;if(!(this.props.field.code in l))throw new Error(`フィールド「${this.props.field.code}」が見つかりません。`);return s&&(this.props.editable==="編集可"?l[this.props.field.code].disabled=!1:this.props.editable==="編集不可"&&(l[this.props.field.code].disabled=!0)),i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}getConditionResult(e){const t=this.getCondition(this.props.condition);return t?t.evaluate(t.root,e):!0}getCondition(e){try{const t=new ConditionTree;return t.fromJson(e),t.getConditions(t.root).length>0?t:null}catch{return null}}register(){actionAddins[this.name]=this}}new FieldDisableAction;class StyleFieldAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="条件書式表示",this.actionProps=[],this.props={field:{code:""},fontColor:"",bgColor:"",fontStyle:[],allRow:"",condition:""},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{return this.actionProps=e.actionProps,!("field"in e.ActionValue)&&!("allRow"in e.ActionValue)||(this.props=e.ActionValue,console.log(t.type),t.type==="app.record.index.show"?this.setStyleForView(t,this.props,r):t.type==="app.record.detail.show"?this.setStyleForDetail(t,this.props,r):(t.type.includes("app.record.create.change.")||t.type.includes("app.record.edit.change."))&&this.setStyleForEdit(t,this.props,r),i={canNext:!0,result:!0}),i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}setStyleForEdit(e,t,r){const i=document.getElementById("record-gaia");i&&Array.from(i.getElementsByTagName("span")).filter(s=>s.innerText===t.field.code).map(s=>{var l,u,h;return(h=(u=(l=s.parentElement)==null?void 0:l.nextElementSibling)==null?void 0:u.querySelector(".input-text-outer-cybozu"))==null?void 0:h.firstElementChild}).filter(s=>!!s).forEach(s=>{this.getConditionResult(this.getCondition(t.condition),r)?this.setFieldStyle(t,s):s.removeAttribute("style")})}setStyleForDetail(e,t,r){const i=kintone.app.record.getFieldElement(t.field.code);if(!i)return;const s=this.getCondition(t.condition);this.getConditionResult(s,r)&&this.setFieldStyle(t,i)}setStyleForView(e,t,r){const i=e.records,s=kintone.app.getFieldElements(t.field.code);if(!s)return;let l;const u=this.getCondition(t.condition);i.forEach((h,p)=>{const E={variables:r.variables,record:h,errors:r.errors};this.getConditionResult(u,E)&&(l=s[p],t.allRow==="行全体"&&(l=s[p].parentElement),l&&this.setFieldStyle(t,l))})}setFieldStyle(e,t){if(e.fontColor&&(t.style.color=e.fontColor),e.bgColor&&(t.style.backgroundColor=e.bgColor),e.fontStyle.length>0){e.fontStyle.includes("斜体")&&(t.style.fontStyle="italic"),e.fontStyle.includes("太字")&&(t.style.fontWeight="bold");let r="";e.fontStyle.includes("下線")&&(r="underline"),e.fontStyle.includes("打ち消し線")&&(r=r?r+" line-through":"line-through"),r&&(t.style.textDecoration=r)}}getConditionResult(e,t){return e?e.evaluate(e.root,t):!0}getCondition(e){try{const t=new ConditionTree;return t.fromJson(e),t.getConditions(t.root).length>0?t:null}catch{return null}}register(){actionAddins[this.name]=this}}new StyleFieldAction;class DateTimeCalcAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="日時を加算/減算する",this.actionProps=[],this.props={verNameGet:"",calcOption:"",verName:{name:""},year:"0",month:"0",date:"0",hour:"0",minute:"0",second:"0"},this.register()}isDateValue(e){let t,r=e.match(/(\d{4})-(\d{1})-(\d{1})$/),i=e.match(/(\d{4})-(\d{2})-(\d{2})$/),s=e.match(/(\d{4})-(\d{2})-(\d{1})$/),l=e.match(/(\d{4})-(\d{1})-(\d{2})$/),u=e.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d{2,3})Z$/),h=e.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/);if(t=new Date(e),t!==void 0&&!isNaN(t.getDate())&&i===null&&r===null&&s===null&&l===null&&h===null&&u===null)throw new Error("計算の基準日となる値が、適切な日付・日時の形式ではありません。「日時を加算/減算する」コンポーネントの処理を中断しました。");return!0}valueToNumber(e,t,r){const i=(l,u)=>u.split(".").reduce((h,p)=>(h||{})[p],l);r==="変数"&&isNaN(Number(t))&&(t=i(e.variables,t));let s=Number(t);if(!isFinite(s))throw new Error("計算値が、数値ではありません。「日時を加算/減算する」コンポーネントの処理を中断しました。");return s}calcDate(e,t,r,i,s,l,u){let h;return e=new Date(e),e.setFullYear(e.getFullYear()+t),e.setMonth(e.getMonth()+r),e.setDate(e.getDate()+i),e.setHours(e.getHours()+s),e.setMinutes(e.getMinutes()+l),e.setSeconds(e.getSeconds()+u),h=e.toISOString(),h}async process(e,t,r){let i={canNext:!0,result:!1};try{this.actionProps=e.actionProps,this.props=e.ActionValue;const l=((h,p)=>p.split(".").reduce((E,_)=>(E||{})[_],h))(r.variables,this.props.verNameGet);if(!l)throw new Error("基準値となる変数の値が空、または存在しません。「日時を加算/減算する」コンポーネントの処理を中断しました。");let u;if(u=this.isDateValue(l),u){let h=this.props.calcOption,p=this.valueToNumber(r,this.props.year,h),E=this.valueToNumber(r,this.props.month,h),_=this.valueToNumber(r,this.props.date,h),S=this.valueToNumber(r,this.props.hour,h),N=this.valueToNumber(r,this.props.minute,h),T=this.valueToNumber(r,this.props.second,h),w;w=this.calcDate(l,p,E,_,S,N,T),r.variables[this.props.verName.name]=w}return i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}register(){actionAddins[this.name]=this}}new DateTimeCalcAction;class EndOfMonthAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="月末算出",this.actionProps=[],this.props={verNameGet:"",verName:{name:""}},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{if(this.actionProps=e.actionProps,!("verName"in e.ActionValue)&&!("verNameGet"in e.ActionValue))return i;this.props=e.ActionValue;let l=((_,S)=>S.split(".").reduce((N,T)=>(N||{})[T],_))(r.variables,this.props.verNameGet),u=new Date(l),h=u.getFullYear(),p=u.getMonth()+1,E=new Date(h,p,0);return this.props.verName&&this.props.verName.name!==""&&(r.variables[this.props.verName.name]=E.toISOString()),i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}register(){actionAddins[this.name]=this}}new EndOfMonthAction;class DateSpecifiedAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="日付指定",this.actionProps=[],this.props={verNameGet:"",newYear:0,newMonth:0,newDay:0,verName:{name:""}},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{if(this.actionProps=e.actionProps,!("verName"in e.ActionValue)&&!("verNameGet"in e.ActionValue))return i;this.props=e.ActionValue;let l=((h,p)=>p.split(".").reduce((E,_)=>(E||{})[_],h))(r.variables,this.props.verNameGet),u=new Date(l);if(l==null||l===""||isNaN(u.getDate()))throw new Error("Invalid time value");return u.setFullYear(this.props.newYear>=1900&&this.props.newYear<=9999?this.props.newYear:u.getFullYear()),u.setMonth(this.props.newMonth>=1&&this.props.newMonth<=12?this.props.newMonth-1:u.getMonth()),u.setDate(this.props.newDay>=1&&this.props.newDay<=31?this.props.newDay:u.getDate()),this.props.verName&&this.props.verName.name!==""&&(r.variables[this.props.verName.name]=u.toISOString()),i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}register(){actionAddins[this.name]=this}}new DateSpecifiedAction;class Snipper{constructor(e){L(this,"spinnerElement");L(this,"container");this.container=$(e??"body"),this.spinnerElement=this.createSpinner()}createSpinner(){const e=['
"].join(""),t=$(e);return this.container.append(t),t}removeSpinner(){this.spinnerElement.remove()}showSpinner(){this.spinnerElement.removeClass("alc-dnone")}hideSpinner(){this.spinnerElement.addClass("alc-dnone")}}const getSegment=(n,e)=>n.pathname.split("/").filter(Boolean).at(e)??"",getPageState=(n,e)=>{const t=new URL(n),r=getSegment(t,-1),i=getSegment(t,-2);if(r===e&&/^\d+$/.test(e))return{type:"app",mode:null};if(r.toLowerCase()==="show"&&i===e&&/^\d+$/.test(e)){const s=t.searchParams.get("mode");return{type:"show",mode:s==="show"||s==="edit"?s:null}}return r.toLowerCase()==="edit"&&i===e&&/^\d+$/.test(e)?{type:"edit",mode:null}:{type:"other",mode:null}};class DropDownManager{constructor(e,t){L(this,"dictionary",{});L(this,"state",{});L(this,"selects",new Map);L(this,"columnMap",new Map);L(this,"columMapValueArray",[]);L(this,"columMapArray",[]);L(this,"props");L(this,"event");L(this,"selectorChangeHandle",(e,t)=>{const r=t.target;this.state[e]=r.value;const i=this.getLevel(e);this.columMapArray.filter((s,l)=>l>i).forEach(([s,l])=>{var p;const u=l.dropDown.code;this.updateOptions(u);const h=(p=this.selects.get(u))==null?void 0:p.previousElementSibling;h&&(h.value=""),delete this.state[u]})});this.props=e,this.event=t}async init(){try{const e=new index_browser.KintoneRestAPIClient,t=this.props.sourceApp.id,r=this.props.fieldList.map(s=>s.source.code),i=await e.record.getAllRecords({app:t,fields:r});this.dictionary=this.buildDropdownDictionary(i,this.props.fieldList)}catch(e){throw console.error("階層化ドロップダウンの初期化中にエラーが発生しました:",e),e}}async calculateHash(e,t){const r=JSON.stringify(e)+JSON.stringify(t),s=new TextEncoder().encode(r),l=await crypto.subtle.digest("SHA-1",s);return Array.from(new Uint8Array(l)).map(p=>p.toString(16).padStart(2,"0")).join("")}buildDropdownDictionary(e,t){const r={"0_TOP":new Set},i=new Map(t.map((l,u)=>[l.source.code,u]));e.map(l=>Object.entries(l).map(([u,h])=>({fieldCode:u,value:h.value,index:i.get(u)})).filter(u=>u.index!==void 0).sort((u,h)=>u.index-h.index)).forEach(l=>{l.forEach((u,h,p)=>{const{value:E,fieldCode:_}=u;if(!E)return;const S=E;if(h===0)r["0_TOP"].add(S);else{const N=p[h-1],T=`${N.index}_${N.value}`;r[T]=r[T]||new Set,r[T].add(S)}})});const s={};for(const[l,u]of Object.entries(r))s[l]=Array.from(u).sort();return s}getFromLocalStorage(e){const t=localStorage.getItem(e);return this.clearUpDictionary(e),t?JSON.parse(t):null}clearUpDictionary(e){Object.keys(localStorage).filter(t=>t.startsWith("dropdown_dictionary::")&&!t.endsWith(e)).forEach(t=>localStorage.removeItem(t))}saveToLocalStorage(e,t){localStorage.setItem(e,JSON.stringify(t))}async handlePageState(e){const t=getPageState(window.location.href.replace("#","?"),e);switch(t.type){case"app":case"edit":case"show":if(t.type==="show"&&t.mode!=="edit")break;await this.init(),this.setupCascadingDropDown(t.type);break}}setupCascadingDropDown(e){const t=document.getElementById(e==="app"?"view-list-data-gaia":"record-gaia");if(!t){console.error("ルート要素が見つかりません");return}e==="app"?this.initDropdownContainerForList():this.initDropdownContainerforDetail(t),this.renderDropdownContainer()}initDropdownContainerForList(){this.props.fieldList.forEach((t,r,i)=>{const s=kintone.app.getFieldElements(t.dropDown.code);if(s){const l=$(s).filter(".recordlist-editcell-gaia").get(0);l!==void 0&&this.columnMap.set(l,t)}}),this.columMapArray=Array.from(this.columnMap.entries()),this.columMapValueArray=Array.from(this.columnMap.values())}initDropdownContainerforDetail(e){const t=this.props.fieldList;let r=$(e).find(".control-gaia");for(const i of t){const s=r.has(`div.control-label-gaia span:contains("${i.dropDown.label}")`).get(0);s!==void 0&&$(s).find(".control-value-gaia").get(0)!==void 0&&this.columnMap.set(s,i)}this.columMapArray=Array.from(this.columnMap.entries()),this.columMapValueArray=Array.from(this.columnMap.values())}renderDropdownContainer(){this.columnMap.forEach((e,t)=>{if(!t)return;const r=t.querySelector("input");r&&this.createSelect(r,e.dropDown.code)})}createSelect(e,t){var s;const r=document.createElement("div");r.className="bs-scope",r.style.margin="0.12rem";const i=document.createElement("select");i.className="custom-dropdown form-select",i.dataset.field=t,i.addEventListener("change",l=>{this.selectorChangeHandle(t,l),e.value=this.state[t]}),r.appendChild(i),this.updateOptions(t,i,e.value),(s=e.parentNode)==null||s.insertBefore(r,e.nextSibling),e.style.display="none",this.selects.set(t,r)}updateOptions(e,t,r){var p;let i=t;if(t)this.state[e]=r;else if(i=(p=this.selects.get(e))==null?void 0:p.querySelector("select"),!i){console.error(`フィールド ${e} のドロップダウンメニュー要素が見つかりません`);return}if(!this.props.fieldList.find(E=>E.dropDown.code===e))throw console.error(`フィールド ${e} の設定が見つかりません`),new Error(`フィールド ${e} の設定が見つかりません`);const l=this.getLevel(e),u=this.getPreviousValueFromState(e),h=this.getOptions(l,u);i&&(i.innerHTML='
選択してください ',h.forEach(E=>{const _=document.createElement("option");_.value=E,_.textContent=E,i==null||i.appendChild(_)}),i.value=r??this.state[e]??"",i.disabled=l>0&&!u)}getLevel(e){return this.columMapValueArray.findIndex(t=>t.dropDown.code===e)}getPreviousValueFromState(e){const t=this.getLevel(e);if(t<=0)return"";const r=this.columMapValueArray[t-1];return this.state[r.dropDown.code]??""}getOptions(e,t){const r=e===0?"0_TOP":this.buildKey(e-1,t);return this.dictionary[r]||[]}buildKey(e,t){return`${e}_${t}`}}const cascadingDropdown="";class CascadingDropDownAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="階層化ドロップダウン",this.actionProps=[],this.props={},this.register()}async process(e,t,r){this.actionProps=e.actionProps,this.props=e.ActionValue;const i={canNext:!0,result:""},s=new Snipper("body"),l=new DropDownManager(this.props.cascadingDropDown,t);try{if(!this.props)return i;const u=this.props.cascadingDropDown.dropDownApp.id;return s.showSpinner(),await l.handlePageState(u),s.hideSpinner(),i}catch(u){return console.error("CascadingDropDownAction プロセス中にエラーが発生しました:",u),r.errors.handleError(u,e),{canNext:!1,result:""}}finally{s.removeSpinner()}}register(){actionAddins[this.name]=this}}new CascadingDropDownAction;class ActionProperty{constructor(e,t,r,i,s){L(this,"component");L(this,"props");this.component=e,this.props={name:t,displayName:r,placeholder:i,modelValue:s}}static defaultProperty(){return new ActionProperty("InputText","displayName","表示名","表示を入力してください","")}}class ActionNode{constructor({id:e,name:t,title:r,inputPoint:i,outputPoints:s,actionProps:l}){L(this,"id");L(this,"name");L(this,"inputPoint");L(this,"outputPoints");L(this,"actionProps");L(this,"prevNodeId");L(this,"nextNodeIds");this.id=e,this.name=t,this.inputPoint=i,this.outputPoints=s;const u=ActionProperty.defaultProperty();u.props.modelValue=r,this.actionProps=l,this.nextNodeIds=new Map}get title(){const e=this.actionProps.find(t=>t.props.name==="displayName");return e==null?void 0:e.props.modelValue}get subTitle(){return this.name}get isRoot(){return!1}get ActionValue(){const e={};return this.actionProps.forEach(t=>{e[t.props.name]=t.props.modelValue}),e}}class RootAction{constructor({id:e,name:t,title:r,subTitle:i}){L(this,"id");L(this,"name");L(this,"title");L(this,"subTitle");L(this,"inputPoint");L(this,"outputPoints");L(this,"isRoot");L(this,"actionProps");L(this,"ActionValue");L(this,"prevNodeId");L(this,"nextNodeIds");this.id=e,this.name=t,this.title=r,this.subTitle=i,this.inputPoint="",this.outputPoints=[],this.isRoot=!0,this.actionProps=[],this.ActionValue={},this.nextNodeIds=new Map}}class ActionFlow{constructor(e){L(this,"id");L(this,"actionNodes");e instanceof Array?this.actionNodes=e:this.actionNodes=[e],this.id=""}findNodeById(e){return this.actionNodes.find(t=>t.id===e)}toJSON(){return{id:this.id,actionNodes:this.actionNodes.map(e=>{const{nextNodeIds:t,...r}=e;return{...r,nextNodeIds:Array.from(t.entries())}})}}getRoot(){return this.actionNodes.find(e=>e.isRoot)}static fromJSON(e){const t=JSON.parse(e),r=t.actionNodes.map(s=>{const l=s.isRoot?new RootAction(s):new ActionNode(s);return l.nextNodeIds=new Map(Object.entries(s.nextNodeIds)),l.prevNodeId=s.prevNodeId,l.id=s.id,l}),i=new ActionFlow(r);return i.id=t.id,i}}class ErrorManager{constructor(){L(this,"errors",[])}get hasError(){return this.errors.length>0}handleError(e,t,r){const i=r||"";let s=e instanceof Error?`${i} ${e.message}`:i;console.error(`「${t.name}」処理中例外発生しました。`,e),this.errors.push({error:s,action:t})}setEvent(e){const t=this.errors.map(r=>`「${r.action.name}」処理中例外発生しました。
+
${s}
`;h.html(p)});L(this,"closeDialog",()=>{const e=$("#alcLookupModal");Modal.getOrCreateInstance(e.get()[0]).dispose(),$("#alcLookupModal").parent().remove()});this.name="ルックアップ更新",this.actionProps=[],this.props={},this.register()}async process(e,t,r){this.actionProps=e.actionProps,this.props={...e.ActionValue,condition:JSON.parse(e.ActionValue.condition||"{}")};let i={canNext:!0,result:""};const s=this.props.lookupField.fields.filter(l=>l.lookup&&l.lookup.relatedApp.app===String(kintone.app.getId()));if(!s||s.length===0)throw new Error(`ルックアップの設定は不正です。${this.props.lookupField.fields[0].label} `);try{const l=this.props.lookupField.fields[0];this.showSpinnerModel(this.props.lookupField.app,l);const u=t.record[l.lookup.relatedKeyField].value,h=await this.getUpdateRecords(l,u);if(h.length===0)return i;const p=this.convertForLookup(h,l,u);console.log("updateRecords",p),await this.updateLookupTarget(p)&&this.showResult(this.props.lookupField.app,l,p.length)}catch(l){this.closeDialog(),r.errors.handleError(l,e,"ルックアップ更新中例外が発生しました"),i.canNext=!1}return i}register(){actionAddins[this.name]=this}}new AutoLookUpAction;class FieldDisableAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="編集可/不可",this.actionProps=[],this.props={field:{code:""},editable:"",condition:""},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{if(this.actionProps=e.actionProps,!("field"in e.ActionValue)&&!("editable"in e.ActionValue))return i;this.props=e.ActionValue;const s=this.getConditionResult(r),l=t.record;if(!(this.props.field.code in l))throw new Error(`フィールド「${this.props.field.code}」が見つかりません。`);return s&&(this.props.editable==="編集可"?l[this.props.field.code].disabled=!1:this.props.editable==="編集不可"&&(l[this.props.field.code].disabled=!0)),i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}getConditionResult(e){const t=this.getCondition(this.props.condition);return t?t.evaluate(t.root,e):!0}getCondition(e){try{const t=new ConditionTree;return t.fromJson(e),t.getConditions(t.root).length>0?t:null}catch{return null}}register(){actionAddins[this.name]=this}}new FieldDisableAction;class StyleFieldAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="条件書式表示",this.actionProps=[],this.props={field:{code:""},fontColor:"",bgColor:"",fontStyle:[],allRow:"",condition:""},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{return this.actionProps=e.actionProps,!("field"in e.ActionValue)&&!("allRow"in e.ActionValue)||(this.props=e.ActionValue,console.log(t.type),t.type==="app.record.index.show"?this.setStyleForView(t,this.props,r):t.type==="app.record.detail.show"?this.setStyleForDetail(t,this.props,r):(t.type.includes("app.record.create.change.")||t.type.includes("app.record.edit.change."))&&this.setStyleForEdit(t,this.props,r),i={canNext:!0,result:!0}),i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}setStyleForEdit(e,t,r){const i=document.getElementById("record-gaia");i&&Array.from(i.getElementsByTagName("span")).filter(s=>s.innerText===t.field.code).map(s=>{var l,u,h;return(h=(u=(l=s.parentElement)==null?void 0:l.nextElementSibling)==null?void 0:u.querySelector(".input-text-outer-cybozu"))==null?void 0:h.firstElementChild}).filter(s=>!!s).forEach(s=>{this.getConditionResult(this.getCondition(t.condition),r)?this.setFieldStyle(t,s):s.removeAttribute("style")})}setStyleForDetail(e,t,r){const i=kintone.app.record.getFieldElement(t.field.code);if(!i)return;const s=this.getCondition(t.condition);this.getConditionResult(s,r)&&this.setFieldStyle(t,i)}setStyleForView(e,t,r){const i=e.records,s=kintone.app.getFieldElements(t.field.code);if(!s)return;let l;const u=this.getCondition(t.condition);i.forEach((h,p)=>{const E={variables:r.variables,record:h,errors:r.errors};this.getConditionResult(u,E)&&(l=s[p],t.allRow==="行全体"&&(l=s[p].parentElement),l&&this.setFieldStyle(t,l))})}setFieldStyle(e,t){if(e.fontColor&&(t.style.color=e.fontColor),e.bgColor&&(t.style.backgroundColor=e.bgColor),e.fontStyle.length>0){e.fontStyle.includes("斜体")&&(t.style.fontStyle="italic"),e.fontStyle.includes("太字")&&(t.style.fontWeight="bold");let r="";e.fontStyle.includes("下線")&&(r="underline"),e.fontStyle.includes("打ち消し線")&&(r=r?r+" line-through":"line-through"),r&&(t.style.textDecoration=r)}}getConditionResult(e,t){return e?e.evaluate(e.root,t):!0}getCondition(e){try{const t=new ConditionTree;return t.fromJson(e),t.getConditions(t.root).length>0?t:null}catch{return null}}register(){actionAddins[this.name]=this}}new StyleFieldAction;class DateTimeCalcAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="日時を加算/減算する",this.actionProps=[],this.props={verNameGet:"",calcOption:"",verName:{name:""},year:"0",month:"0",date:"0",hour:"0",minute:"0",second:"0"},this.register()}isDateValue(e){let t,r=e.match(/(\d{4})-(\d{1})-(\d{1})$/),i=e.match(/(\d{4})-(\d{2})-(\d{2})$/),s=e.match(/(\d{4})-(\d{2})-(\d{1})$/),l=e.match(/(\d{4})-(\d{1})-(\d{2})$/),u=e.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d{2,3})Z$/),h=e.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/);if(t=new Date(e),t!==void 0&&!isNaN(t.getDate())&&i===null&&r===null&&s===null&&l===null&&h===null&&u===null)throw new Error("計算の基準日となる値が、適切な日付・日時の形式ではありません。「日時を加算/減算する」コンポーネントの処理を中断しました。");return!0}valueToNumber(e,t,r){const i=(l,u)=>u.split(".").reduce((h,p)=>(h||{})[p],l);r==="変数"&&isNaN(Number(t))&&(t=i(e.variables,t));let s=Number(t);if(!isFinite(s))throw new Error("計算値が、数値ではありません。「日時を加算/減算する」コンポーネントの処理を中断しました。");return s}calcDate(e,t,r,i,s,l,u){let h;return e=new Date(e),e.setFullYear(e.getFullYear()+t),e.setMonth(e.getMonth()+r),e.setDate(e.getDate()+i),e.setHours(e.getHours()+s),e.setMinutes(e.getMinutes()+l),e.setSeconds(e.getSeconds()+u),h=e.toISOString(),h}async process(e,t,r){let i={canNext:!0,result:!1};try{this.actionProps=e.actionProps,this.props=e.ActionValue;const l=((h,p)=>p.split(".").reduce((E,_)=>(E||{})[_],h))(r.variables,this.props.verNameGet);if(!l)throw new Error("基準値となる変数の値が空、または存在しません。「日時を加算/減算する」コンポーネントの処理を中断しました。");let u;if(u=this.isDateValue(l),u){let h=this.props.calcOption,p=this.valueToNumber(r,this.props.year,h),E=this.valueToNumber(r,this.props.month,h),_=this.valueToNumber(r,this.props.date,h),S=this.valueToNumber(r,this.props.hour,h),N=this.valueToNumber(r,this.props.minute,h),T=this.valueToNumber(r,this.props.second,h),w;w=this.calcDate(l,p,E,_,S,N,T),r.variables[this.props.verName.name]=w}return i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}register(){actionAddins[this.name]=this}}new DateTimeCalcAction;class EndOfMonthAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="月末算出",this.actionProps=[],this.props={verNameGet:"",verName:{name:""}},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{if(this.actionProps=e.actionProps,!("verName"in e.ActionValue)&&!("verNameGet"in e.ActionValue))return i;this.props=e.ActionValue;let l=((_,S)=>S.split(".").reduce((N,T)=>(N||{})[T],_))(r.variables,this.props.verNameGet),u=new Date(l),h=u.getFullYear(),p=u.getMonth()+1,E=new Date(h,p,0);return this.props.verName&&this.props.verName.name!==""&&(r.variables[this.props.verName.name]=E.toISOString()),i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}register(){actionAddins[this.name]=this}}new EndOfMonthAction;class DateSpecifiedAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="日付指定",this.actionProps=[],this.props={verNameGet:"",newYear:0,newMonth:0,newDay:0,verName:{name:""}},this.register()}async process(e,t,r){let i={canNext:!0,result:!1};try{if(this.actionProps=e.actionProps,!("verName"in e.ActionValue)&&!("verNameGet"in e.ActionValue))return i;this.props=e.ActionValue;let l=((h,p)=>p.split(".").reduce((E,_)=>(E||{})[_],h))(r.variables,this.props.verNameGet),u=new Date(l);if(l==null||l===""||isNaN(u.getDate()))throw new Error("Invalid time value");return u.setFullYear(this.props.newYear>=1900&&this.props.newYear<=9999?this.props.newYear:u.getFullYear()),u.setMonth(this.props.newMonth>=1&&this.props.newMonth<=12?this.props.newMonth-1:u.getMonth()),u.setDate(this.props.newDay>=1&&this.props.newDay<=31?this.props.newDay:u.getDate()),this.props.verName&&this.props.verName.name!==""&&(r.variables[this.props.verName.name]=u.toISOString()),i={canNext:!0,result:!0},i}catch(s){return r.errors.handleError(s,e),i.canNext=!1,i}}register(){actionAddins[this.name]=this}}new DateSpecifiedAction;class Snipper{constructor(e){L(this,"spinnerElement");L(this,"container");this.container=$(e??"body"),this.spinnerElement=this.createSpinner()}createSpinner(){const e=['
"].join(""),t=$(e);return this.container.append(t),t}removeSpinner(){this.spinnerElement.remove()}showSpinner(){this.spinnerElement.removeClass("alc-dnone")}hideSpinner(){this.spinnerElement.addClass("alc-dnone")}}const getSegment=(n,e)=>n.pathname.split("/").filter(Boolean).at(e)??"",getPageState=(n,e)=>{const t=new URL(n),r=getSegment(t,-1),i=getSegment(t,-2);if(r===e&&/^\d+$/.test(e))return{type:"app",mode:null};if(r.toLowerCase()==="show"&&i===e&&/^\d+$/.test(e)){const s=t.searchParams.get("mode");return{type:"show",mode:s==="show"||s==="edit"?s:null}}return r.toLowerCase()==="edit"&&i===e&&/^\d+$/.test(e)?{type:"edit",mode:null}:{type:"other",mode:null}};class DropDownManager{constructor(e,t){L(this,"dictionary",{});L(this,"state",{});L(this,"selects",new Map);L(this,"columnMap",new Map);L(this,"columMapValueArray",[]);L(this,"columMapArray",[]);L(this,"props");L(this,"event");L(this,"selectorChangeHandle",(e,t)=>{const r=t.target;this.state[e]=r.value;const i=this.getLevel(e);this.columMapArray.filter((s,l)=>l>i).forEach(([s,l])=>{var p;const u=l.dropDown.code;this.updateOptions(u);const h=(p=this.selects.get(u))==null?void 0:p.previousElementSibling;h&&(h.value=""),delete this.state[u]})});this.props=e,this.event=t}async init(){try{const e=new index_browser.KintoneRestAPIClient,t=this.props.sourceApp.id,r=this.props.fieldList.map(s=>s.source.code),i=await e.record.getAllRecords({app:t,fields:r});this.dictionary=this.buildDropdownDictionary(i,this.props.fieldList)}catch(e){throw console.error("階層化ドロップダウンの初期化中にエラーが発生しました:",e),e}}async calculateHash(e,t){const r=JSON.stringify(e)+JSON.stringify(t),s=new TextEncoder().encode(r),l=await crypto.subtle.digest("SHA-1",s);return Array.from(new Uint8Array(l)).map(p=>p.toString(16).padStart(2,"0")).join("")}buildDropdownDictionary(e,t){const r={"0_TOP":new Set},i=new Map(t.map((l,u)=>[l.source.code,u]));e.map(l=>Object.entries(l).map(([u,h])=>({fieldCode:u,value:h.value,index:i.get(u)})).filter(u=>u.index!==void 0).sort((u,h)=>u.index-h.index)).forEach(l=>{l.forEach((u,h,p)=>{const{value:E,fieldCode:_}=u;if(!E)return;const S=E;if(h===0)r["0_TOP"].add(S);else{const N=p[h-1],T=`${N.index}_${N.value}`;r[T]=r[T]||new Set,r[T].add(S)}})});const s={};for(const[l,u]of Object.entries(r))s[l]=Array.from(u).sort();return s}getFromLocalStorage(e){const t=localStorage.getItem(e);return this.clearUpDictionary(e),t?JSON.parse(t):null}clearUpDictionary(e){Object.keys(localStorage).filter(t=>t.startsWith("dropdown_dictionary::")&&!t.endsWith(e)).forEach(t=>localStorage.removeItem(t))}saveToLocalStorage(e,t){localStorage.setItem(e,JSON.stringify(t))}async handlePageState(e){const t=getPageState(window.location.href.replace("#","?"),e);switch(t.type){case"app":case"edit":case"show":if(t.type==="show"&&t.mode!=="edit")break;await this.init(),this.setupCascadingDropDown(t.type);break}}setupCascadingDropDown(e){const t=document.getElementById(e==="app"?"view-list-data-gaia":"record-gaia");if(!t){console.error("ルート要素が見つかりません");return}e==="app"?this.initDropdownContainerForList():this.initDropdownContainerforDetail(t),this.renderDropdownContainer()}initDropdownContainerForList(){this.props.fieldList.forEach((t,r,i)=>{const s=kintone.app.getFieldElements(t.dropDown.code);if(s){const l=$(s).filter(".recordlist-editcell-gaia").get(0);l!==void 0&&this.columnMap.set(l,t)}}),this.columMapArray=Array.from(this.columnMap.entries()),this.columMapValueArray=Array.from(this.columnMap.values())}initDropdownContainerforDetail(e){const t=this.props.fieldList;let r=$(e).find(".control-gaia");for(const i of t){const s=r.has(`div.control-label-gaia span:contains("${i.dropDown.label}")`).get(0);s!==void 0&&$(s).find(".control-value-gaia").get(0)!==void 0&&this.columnMap.set(s,i)}this.columMapArray=Array.from(this.columnMap.entries()),this.columMapValueArray=Array.from(this.columnMap.values())}renderDropdownContainer(){this.columnMap.forEach((e,t)=>{if(!t)return;const r=t.querySelector("input");r&&this.createSelect(r,e.dropDown.code)})}createSelect(e,t){var s;const r=document.createElement("div");r.className="bs-scope",r.style.margin="0.12rem";const i=document.createElement("select");i.className="custom-dropdown form-select",i.dataset.field=t,i.addEventListener("change",l=>{this.selectorChangeHandle(t,l),e.value=this.state[t]}),r.appendChild(i),this.updateOptions(t,i,e.value),(s=e.parentNode)==null||s.insertBefore(r,e.nextSibling),e.style.display="none",this.selects.set(t,r)}updateOptions(e,t,r){var p;let i=t;if(t)this.state[e]=r;else if(i=(p=this.selects.get(e))==null?void 0:p.querySelector("select"),!i){console.error(`フィールド ${e} のドロップダウンメニュー要素が見つかりません`);return}if(!this.props.fieldList.find(E=>E.dropDown.code===e))throw console.error(`フィールド ${e} の設定が見つかりません`),new Error(`フィールド ${e} の設定が見つかりません`);const l=this.getLevel(e),u=this.getPreviousValueFromState(e),h=this.getOptions(l,u);i&&(i.innerHTML='
選択してください ',h.forEach(E=>{const _=document.createElement("option");_.value=E,_.textContent=E,i==null||i.appendChild(_)}),i.value=r??this.state[e]??"",i.disabled=l>0&&!u)}getLevel(e){return this.columMapValueArray.findIndex(t=>t.dropDown.code===e)}getPreviousValueFromState(e){const t=this.getLevel(e);if(t<=0)return"";const r=this.columMapValueArray[t-1];return this.state[r.dropDown.code]??""}getOptions(e,t){const r=e===0?"0_TOP":this.buildKey(e-1,t);return this.dictionary[r]||[]}buildKey(e,t){return`${e}_${t}`}}const cascadingDropdown="";class CascadingDropDownAction{constructor(){L(this,"name");L(this,"actionProps");L(this,"props");this.name="階層化ドロップダウン",this.actionProps=[],this.props={},this.register()}async process(e,t,r){this.actionProps=e.actionProps,this.props=e.ActionValue;const i={canNext:!0,result:""},s=new Snipper("body"),l=new DropDownManager(this.props.cascadingDropDown,t);try{if(!this.props)return i;const u=this.props.cascadingDropDown.dropDownApp.id;return s.showSpinner(),await l.handlePageState(u),s.hideSpinner(),i}catch(u){return console.error("CascadingDropDownAction プロセス中にエラーが発生しました:",u),r.errors.handleError(u,e),{canNext:!1,result:""}}finally{s.removeSpinner()}}register(){actionAddins[this.name]=this}}new CascadingDropDownAction;class ActionProperty{constructor(e,t,r,i,s){L(this,"component");L(this,"props");this.component=e,this.props={name:t,displayName:r,placeholder:i,modelValue:s}}static defaultProperty(){return new ActionProperty("InputText","displayName","表示名","表示を入力してください","")}}class ActionNode{constructor({id:e,name:t,title:r,inputPoint:i,outputPoints:s,actionProps:l}){L(this,"id");L(this,"name");L(this,"inputPoint");L(this,"outputPoints");L(this,"actionProps");L(this,"prevNodeId");L(this,"nextNodeIds");this.id=e,this.name=t,this.inputPoint=i,this.outputPoints=s;const u=ActionProperty.defaultProperty();u.props.modelValue=r,this.actionProps=l,this.nextNodeIds=new Map}get title(){const e=this.actionProps.find(t=>t.props.name==="displayName");return e==null?void 0:e.props.modelValue}get subTitle(){return this.name}get isRoot(){return!1}get ActionValue(){const e={};return this.actionProps.forEach(t=>{e[t.props.name]=t.props.modelValue}),e}}class RootAction{constructor({id:e,name:t,title:r,subTitle:i}){L(this,"id");L(this,"name");L(this,"title");L(this,"subTitle");L(this,"inputPoint");L(this,"outputPoints");L(this,"isRoot");L(this,"actionProps");L(this,"ActionValue");L(this,"prevNodeId");L(this,"nextNodeIds");this.id=e,this.name=t,this.title=r,this.subTitle=i,this.inputPoint="",this.outputPoints=[],this.isRoot=!0,this.actionProps=[],this.ActionValue={},this.nextNodeIds=new Map}}class ActionFlow{constructor(e){L(this,"id");L(this,"actionNodes");e instanceof Array?this.actionNodes=e:this.actionNodes=[e],this.id=""}findNodeById(e){return this.actionNodes.find(t=>t.id===e)}toJSON(){return{id:this.id,actionNodes:this.actionNodes.map(e=>{const{nextNodeIds:t,...r}=e;return{...r,nextNodeIds:Array.from(t.entries())}})}}getRoot(){return this.actionNodes.find(e=>e.isRoot)}static fromJSON(e){const t=JSON.parse(e),r=t.actionNodes.map(s=>{const l=s.isRoot?new RootAction(s):new ActionNode(s);return l.nextNodeIds=new Map(Object.entries(s.nextNodeIds)),l.prevNodeId=s.prevNodeId,l.id=s.id,l}),i=new ActionFlow(r);return i.id=t.id,i}}class ErrorManager{constructor(){L(this,"errors",[])}get hasError(){return this.errors.length>0}handleError(e,t,r){const i=r||"";let s=e instanceof Error?`${i} ${e.message}`:i;console.error(`「${t.name}」処理中例外発生しました。`,e),this.errors.push({error:s,action:t})}setEvent(e){const t=this.errors.map(r=>`「${r.action.name}」処理中例外発生しました。
詳細:${r.error}`);e.error=t.join(`
`)}showError(){const e=this.errors.map(t=>`「${t.action.name}」処理中例外発生しました。
詳細:${t.error}`);window.alert(e)}}const ShowErrorEvents=["app.record.create.submit.success","app.record.edit.submit.success","app.record.index.edit.submit.success"];class ActionProcess{constructor(e,t,r){L(this,"eventId");L(this,"flow");L(this,"event");L(this,"context");this.eventId=e,this.flow=t,this.event=r;const i=new ErrorManager;this.context={record:this.event.record,variables:{},errors:i}}async exec(){const e=this.flow.getRoot();if(e===void 0||e.nextNodeIds.size===0)return;let t=e.nextNodeIds.get("");if(t===void 0)return;let r=this.flow.findNodeById(t),i={canNext:!0};for(;r!==void 0&&i.canNext;){const s=actionAddins[r.name];s!==void 0&&(i=await s.process(r,this.event,this.context));let l="";if(r.outputPoints&&r.outputPoints.length>1&&(l=i.result||""),t=r.nextNodeIds.get(l),t===void 0)break;r=this.flow.findNodeById(t)}this.context.errors.hasError&&(this.context.errors.setEvent(this.event),ShowErrorEvents.includes(this.event.type)&&this.context.errors.showError())}}$(function(){const n=u=>u.filter(h=>h.includes(".change.")),e=u=>u.filter(h=>h.includes(".customButtonClick.")),t=u=>u.filter(h=>!h.includes(".customButtonClick.")&&!h.includes(".change.")),r=Object.keys(alcflow),i=n(r),s=e(r),l=t(r);l.length>0&&kintone.events.on(l,async u=>{const h=alcflow[u.type],p=ActionFlow.fromJSON(h.content);return p!==void 0&&await new ActionProcess(u.type,p,u).exec(),u}),i.length>0&&kintone.events.on(i,u=>{const h=alcflow[u.type],p=ActionFlow.fromJSON(h.content);return p!==void 0&&new ActionProcess(u.type,p,u).exec().then(_=>{const S=u.record;kintone.app.record.set({record:S})}).catch(_=>{console.error(_)}),u}),s.length>0&&s.forEach(u=>{$(document).on(u,async()=>{const h=kintone.app.record.get(),p=alcflow[u],E=ActionFlow.fromJSON(p.content);E!==void 0&&await new ActionProcess(u,E,h).exec();const _=h.record;kintone.app.record.set({record:_})})})});
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxjX3J1bnRpbWUuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCIuLi9zcmMvYWN0aW9ucy9pbmRleC50cyIsIi4uL3NyYy9hY3Rpb25zL211c3QtaW5wdXQudHMiLCIuLi9zcmMvdXRpbC9mb3JtYXQudHMiLCIuLi9zcmMvYWN0aW9ucy9hdXRvLW51bWJlcmluZy50cyIsIi4uL3NyYy90eXBlcy9Db25kaXRpb25zLnRzIiwiLi4vc3JjL2FjdGlvbnMvZmllbGQtc2hvd24udHMiLCIuLi9zcmMvYWN0aW9ucy9lcnJvci1zaG93LnRzIiwiLi4vc3JjL2FjdGlvbnMvYnV0dG9uLWFkZC50cyIsIi4uL3NyYy9hY3Rpb25zL2NvbmRpdGlvbi1hY3Rpb24udHMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvcGxhdGZvcm0vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvcGxhdGZvcm0vVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbWUvTWltZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9taW1lL3R5cGVzL3N0YW5kYXJkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbWUvbGl0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9wbGF0Zm9ybS9icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL3VybC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvQmFzZUNsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvQnVsa1JlcXVlc3RDbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L0FwcENsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9lcnJvci9LaW50b25lQWJvcnRTZWFyY2hFcnJvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9lcnJvci9LaW50b25lQWxsUmVjb3Jkc0Vycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2Vycm9yL0tpbnRvbmVSZXN0QVBJRXJyb3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvZXJyb3IvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L1JlY29yZENsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvU3BhY2VDbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvZm9ybS1kYXRhL2xpYi9icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC9GaWxlQ2xpZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC9QbHVnaW5DbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvYXhpb3MvZGlzdC9icm93c2VyL2F4aW9zLmNqcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9odHRwL0F4aW9zQ2xpZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2h0dHAvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9ldmFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yYW5nZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvcmVmLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9zeW50YXguanMiLCIuLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3R5cGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3VyaS5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXMtcHJvdG8vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhc293bi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWRlZmluZS1wcm9wZXJ0eS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nb3BkL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RlZmluZS1kYXRhLXByb3BlcnR5L2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZXQtZnVuY3Rpb24tbGVuZ3RoL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvY2FsbEJvdW5kLmpzIiwiLi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwiLCIuLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIi4uL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvanMtYmFzZTY0L2Jhc2U2NC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvS2ludG9uZVJlc3BvbnNlSGFuZGxlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9LaW50b25lUmVzdEFQSUNsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9pbmRleC5icm93c2VyLmpzIiwiLi4vc3JjL3R5cGVzL0ZpZWxkTGF5b3V0LnRzIiwiLi4vc3JjL3V0aWwvYWdncmVnYXRlcy50cyIsIi4uL3NyYy9hY3Rpb25zL2RhdGEtcHJvY2Vzc2luZy50cyIsIi4uL3NyYy9hY3Rpb25zL2RhdGEtdXBkYXRlLnRzIiwiLi4vc3JjL2FjdGlvbnMvY3VycmVudC1maWVsZC1nZXQudHMiLCIuLi9zcmMvYWN0aW9ucy9yZWd1bGFyLWNoZWNrLnRzIiwiLi4vc3JjL2FjdGlvbnMvbWFpbC1jaGVjay50cyIsIi4uL3NyYy9hY3Rpb25zL2NvdW50ZXItY2hlY2sudHMiLCIuLi9zcmMvYWN0aW9ucy9kYXRldGltZS1nZXR0ZXIudHMiLCIuLi9zcmMvYWN0aW9ucy9pbnNlcnQtdmFsdWUudHMiLCIuLi9zcmMvYWN0aW9ucy92YWx1ZS1nZXR0ZXIudHMiLCIuLi9zcmMvYWN0aW9ucy9zdHJpbmctam9pbi50cyIsIi4uL3NyYy9hY3Rpb25zL3ZhbGlkYXRpb24tZnVsbHdpZHRoLnRzIiwiLi4vc3JjL2FjdGlvbnMvdmFsaWRhdGlvbi1oYWxmd2lkdGgudHMiLCIuLi9zcmMvYWN0aW9ucy9oYWxmLWZ1bGwtY29udmVyc2lvbi50cyIsIi4uL3NyYy9hY3Rpb25zL2xvZ2luLXVzZXItZ2V0dGVyLnRzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L2RvbS9kYXRhLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L3V0aWwvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL21hbmlwdWxhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L3V0aWwvY29uZmlnLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L2Jhc2UtY29tcG9uZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L2RvbS9zZWxlY3Rvci1lbmdpbmUuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9iYWNrZHJvcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9mb2N1c3RyYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9zY3JvbGxiYXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvbW9kYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3VzZXJBZ2VudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzTGF5b3V0Vmlld3BvcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvY29udGFpbnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNUYWJsZUVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2Fycm93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRWYXJpYXRpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbEJhclguanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1Njcm9sbFBhcmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9jb21wdXRlT2Zmc2V0cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZmxpcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2hpZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRBbHRBeGlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlU2Nyb2xsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvb3JkZXJNb2RpZmllcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RlYm91bmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvY3JlYXRlUG9wcGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9wb3BwZXItbGl0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5lc20uanMiLCIuLi9zcmMvYWN0aW9ucy9hdXRvLWxvb2t1cC50cyIsIi4uL3NyYy9hY3Rpb25zL2ZpZWxkLWRpc2FibGUudHMiLCIuLi9zcmMvYWN0aW9ucy9zdHlsZS1maWVsZC50cyIsIi4uL3NyYy9hY3Rpb25zL2RhdGV0aW1lLWNhbGMudHMiLCIuLi9zcmMvYWN0aW9ucy9lbmQtb2YtbW9udGgudHMiLCIuLi9zcmMvYWN0aW9ucy9kYXRlLXNwZWNpZmllZC50cyIsIi4uL3NyYy91dGlsL3VpLWhlbHBlci50cyIsIi4uL3NyYy91dGlsL3VybC50cyIsIi4uL3NyYy90eXBlcy9DYXNjYWRpbmdEcm9wRG93bk1hbmFnZXIudHMiLCIuLi9zcmMvYWN0aW9ucy9jYXNjYWRpbmctZHJvcGRvd24udHMiLCIuLi9zcmMvdHlwZXMvQWN0aW9uVHlwZXMudHMiLCIuLi9zcmMvdHlwZXMvYWN0aW9uLXByb2Nlc3MudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjcuMVxuICogaHR0cHM6Ly9qcXVlcnkuY29tL1xuICpcbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAyMy0wOC0yOFQxMzozN1pcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgdHJhYy0xNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSApKCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIEVkZ2UgPD0gMTIgLSAxMyssIEZpcmVmb3ggPD0xOCAtIDQ1KywgSUUgMTAgLSAxMSwgU2FmYXJpIDUuMSAtIDkrLCBpT1MgNiAtIDkuMVxuLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlXG4vLyBhcmd1bWVudHMuY2FsbGVlLmNhbGxlciAodHJhYy0xMzMzNSkuIEJ1dCBhcyBvZiBqUXVlcnkgMy4wICgyMDE2KSwgc3RyaWN0IG1vZGUgc2hvdWxkIGJlIGNvbW1vblxuLy8gZW5vdWdoIHRoYXQgYWxsIHN1Y2ggYXR0ZW1wdHMgYXJlIGd1YXJkZWQgaW4gYSB0cnkgYmxvY2suXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGFyciA9IFtdO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGZsYXQgPSBhcnIuZmxhdCA/IGZ1bmN0aW9uKCBhcnJheSApIHtcblx0cmV0dXJuIGFyci5mbGF0LmNhbGwoIGFycmF5ICk7XG59IDogZnVuY3Rpb24oIGFycmF5ICkge1xuXHRyZXR1cm4gYXJyLmNvbmNhdC5hcHBseSggW10sIGFycmF5ICk7XG59O1xuXG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD01NywgRmlyZWZveCA8PTUyXG5cdFx0Ly8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIDxvYmplY3Q+IGVsZW1lbnRzXG5cdFx0Ly8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cblx0XHQvLyBXZSBkb24ndCB3YW50IHRvIGNsYXNzaWZ5ICphbnkqIERPTSBub2RlIGFzIGEgZnVuY3Rpb24uXG5cdFx0Ly8gU3VwcG9ydDogUXRXZWIgPD0zLjguNSwgV2ViS2l0IDw9NTM0LjM0LCB3a2h0bWx0b3BkZiB0b29sIDw9MC4xMi41XG5cdFx0Ly8gUGx1cyBmb3Igb2xkIFdlYktpdCwgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIGNvbGxlY3Rpb25zXG5cdFx0Ly8gKGUuZy4sIGB0eXBlb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIikgPT09IFwiZnVuY3Rpb25cImApLiAoZ2gtNDc1Nilcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBvYmoubm9kZVR5cGUgIT09IFwibnVtYmVyXCIgJiZcblx0XHRcdHR5cGVvZiBvYmouaXRlbSAhPT0gXCJmdW5jdGlvblwiO1xuXHR9O1xuXG5cbnZhciBpc1dpbmRvdyA9IGZ1bmN0aW9uIGlzV2luZG93KCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fTtcblxuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cblxuXG5cdHZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0ge1xuXHRcdHR5cGU6IHRydWUsXG5cdFx0c3JjOiB0cnVlLFxuXHRcdG5vbmNlOiB0cnVlLFxuXHRcdG5vTW9kdWxlOiB0cnVlXG5cdH07XG5cblx0ZnVuY3Rpb24gRE9NRXZhbCggY29kZSwgbm9kZSwgZG9jICkge1xuXHRcdGRvYyA9IGRvYyB8fCBkb2N1bWVudDtcblxuXHRcdHZhciBpLCB2YWwsXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDY0KywgRWRnZSAxOCtcblx0XHRcdFx0Ly8gU29tZSBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSBcIm5vbmNlXCIgcHJvcGVydHkgb24gc2NyaXB0cy5cblx0XHRcdFx0Ly8gT24gdGhlIG90aGVyIGhhbmQsIGp1c3QgdXNpbmcgYGdldEF0dHJpYnV0ZWAgaXMgbm90IGVub3VnaCBhc1xuXHRcdFx0XHQvLyB0aGUgYG5vbmNlYCBhdHRyaWJ1dGUgaXMgcmVzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHdoZW5ldmVyIGl0XG5cdFx0XHRcdC8vIGJlY29tZXMgYnJvd3NpbmctY29udGV4dCBjb25uZWN0ZWQuXG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvaXNzdWVzLzIzNjlcblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI25vbmNlLWF0dHJpYnV0ZXNcblx0XHRcdFx0Ly8gVGhlIGBub2RlLmdldEF0dHJpYnV0ZWAgY2hlY2sgd2FzIGFkZGVkIGZvciB0aGUgc2FrZSBvZlxuXHRcdFx0XHQvLyBgalF1ZXJ5Lmdsb2JhbEV2YWxgIHNvIHRoYXQgaXQgY2FuIGZha2UgYSBub25jZS1jb250YWluaW5nIG5vZGVcblx0XHRcdFx0Ly8gdmlhIGFuIG9iamVjdC5cblx0XHRcdFx0dmFsID0gbm9kZVsgaSBdIHx8IG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCBpICk7XG5cdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoIGksIHZhbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRvYy5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIHRvVHlwZSggb2JqICkge1xuXHRpZiAoIG9iaiA9PSBudWxsICkge1xuXHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHR0eXBlb2Ygb2JqO1xufVxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmVzbGludHJjLmpzb24gd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlXG5cblxuXG52YXIgdmVyc2lvbiA9IFwiMy43LjFcIixcblxuXHRyaHRtbFN1ZmZpeCA9IC9IVE1MJC9pLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fTtcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblxuXHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRpZiAoIG51bSA9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0cmV0dXJuIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF07XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXZlbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICggaSArIDEgKSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0b2RkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5ncmVwKCB0aGlzLCBmdW5jdGlvbiggX2VsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gaSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKCk7XG5cdH0sXG5cblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuXHQvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC5cblx0cHVzaDogcHVzaCxcblx0c29ydDogYXJyLnNvcnQsXG5cdHNwbGljZTogYXJyLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IE9iamVjdC5wcm90b3R5cGUgcG9sbHV0aW9uXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCBuYW1lID09PSBcIl9fcHJvdG9fX1wiIHx8IHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHtcblx0XHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSBwcm9wZXIgdHlwZSBmb3IgdGhlIHNvdXJjZSB2YWx1ZVxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgJiYgIUFycmF5LmlzQXJyYXkoIHNyYyApICkge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBbXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhY29weUlzQXJyYXkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0ge307XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgcHJvdG8sIEN0b3I7XG5cblx0XHQvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcblx0XHQvLyBVc2UgdG9TdHJpbmcgaW5zdGVhZCBvZiBqUXVlcnkudHlwZSB0byBjYXRjaCBob3N0IG9iamVjdHNcblx0XHRpZiAoICFvYmogfHwgdG9TdHJpbmcuY2FsbCggb2JqICkgIT09IFwiW29iamVjdCBPYmplY3RdXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cHJvdG8gPSBnZXRQcm90byggb2JqICk7XG5cblx0XHQvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluXG5cdFx0aWYgKCAhcHJvdG8gKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuXHRcdEN0b3IgPSBoYXNPd24uY2FsbCggcHJvdG8sIFwiY29uc3RydWN0b3JcIiApICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIHByb3ZpZGVkIGNvbnRleHQ7IGZhbGxzIGJhY2sgdG8gdGhlIGdsb2JhbCBvbmVcblx0Ly8gaWYgbm90IHNwZWNpZmllZC5cblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUsIG9wdGlvbnMsIGRvYyApIHtcblx0XHRET01FdmFsKCBjb2RlLCB7IG5vbmNlOiBvcHRpb25zICYmIG9wdGlvbnMubm9uY2UgfSwgZG9jICk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXG5cdC8vIFJldHJpZXZlIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuXHR0ZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbm9kZSxcblx0XHRcdHJldCA9IFwiXCIsXG5cdFx0XHRpID0gMCxcblx0XHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdGlmICggIW5vZGVUeXBlICkge1xuXG5cdFx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBlbGVtWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRcdHJldCArPSBqUXVlcnkudGV4dCggbm9kZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50O1xuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHRcdH1cblxuXHRcdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0aXNYTUxEb2M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lc3BhY2UgPSBlbGVtICYmIGVsZW0ubmFtZXNwYWNlVVJJLFxuXHRcdFx0ZG9jRWxlbSA9IGVsZW0gJiYgKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdC8vIEFzc3VtZSBIVE1MIHdoZW4gZG9jdW1lbnRFbGVtZW50IGRvZXNuJ3QgeWV0IGV4aXN0LCBzdWNoIGFzIGluc2lkZVxuXHRcdC8vIGRvY3VtZW50IGZyYWdtZW50cy5cblx0XHRyZXR1cm4gIXJodG1sU3VmZml4LnRlc3QoIG5hbWVzcGFjZSB8fCBkb2NFbGVtICYmIGRvY0VsZW0ubm9kZU5hbWUgfHwgXCJIVE1MXCIgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBmbGF0KCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHRcdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSB0b1R5cGUoIG9iaiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cblxuXG5mdW5jdGlvbiBub2RlTmFtZSggZWxlbSwgbmFtZSApIHtcblxuXHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblxufVxudmFyIHBvcCA9IGFyci5wb3A7XG5cblxudmFyIHNvcnQgPSBhcnIuc29ydDtcblxuXG52YXIgc3BsaWNlID0gYXJyLnNwbGljZTtcblxuXG52YXIgd2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIjtcblxuXG52YXIgcnRyaW1DU1MgPSBuZXcgUmVnRXhwKFxuXHRcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLFxuXHRcImdcIlxuKTtcblxuXG5cblxuLy8gTm90ZTogYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxualF1ZXJ5LmNvbnRhaW5zID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdHZhciBidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblxuXHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0XHQvLyBJRSBkb2Vzbid0IGhhdmUgYGNvbnRhaW5zYCBvbiBTVkcuXG5cdFx0YS5jb250YWlucyA/XG5cdFx0XHRhLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0KSApO1xufTtcblxuXG5cblxuLy8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cbi8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jY29tbW9uLXNlcmlhbGl6aW5nLWlkaW9tc1xudmFyIHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXHg4MC1cXHVGRkZGXFx3LV0vZztcblxuZnVuY3Rpb24gZmNzc2VzY2FwZSggY2gsIGFzQ29kZVBvaW50ICkge1xuXHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0aWYgKCBjaCA9PT0gXCJcXDBcIiApIHtcblx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHR9XG5cblx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICsgY2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdH1cblxuXHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdHJldHVybiBcIlxcXFxcIiArIGNoO1xufVxuXG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKCBzZWwgKyBcIlwiICkucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuXG5cblxudmFyIHByZWZlcnJlZERvYyA9IGRvY3VtZW50LFxuXHRwdXNoTmF0aXZlID0gcHVzaDtcblxuKCBmdW5jdGlvbigpIHtcblxudmFyIGksXG5cdEV4cHIsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXHRwdXNoID0gcHVzaE5hdGl2ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdGRvY3VtZW50LFxuXHRkb2N1bWVudEVsZW1lbnQsXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdG1hdGNoZXMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0galF1ZXJ5LmV4cGFuZG8sXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8XCIgK1xuXHRcdFwibG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNpZGVudC10b2tlbi1kaWFncmFtXG5cdGlkZW50aWZpZXIgPSBcIig/OlxcXFxcXFxcW1xcXFxkYS1mQS1GXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIj98XFxcXFxcXFxbXlxcXFxyXFxcXG5cXFxcZl18W1xcXFx3LV18W15cXDAtXFxcXHg3Zl0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJsZWFkaW5nQ29tYmluYXRvciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJkZXNjZW5kID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwifD5cIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0SUQ6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRDTEFTUzogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRUQUc6IG5ldyBSZWdFeHAoIFwiXihcIiArIGlkZW50aWZpZXIgKyBcInxbKl0pXCIgKSxcblx0XHRBVFRSOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRQU0VVRE86IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdENISUxEOiBuZXcgUmVnRXhwKFxuXHRcdFx0XCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICtcblx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICtcblx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdGJvb2w6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0bmVlZHNDb250ZXh0OiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cblx0Ly8gQ1NTIGVzY2FwZXNcblx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCI/fFxcXFxcXFxcKFteXFxcXHJcXFxcblxcXFxmXSlcIiwgXCJnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIGVzY2FwZSwgbm9uSGV4ICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlLnNsaWNlKCAxICkgLSAweDEwMDAwO1xuXG5cdFx0aWYgKCBub25IZXggKSB7XG5cblx0XHRcdC8vIFN0cmlwIHRoZSBiYWNrc2xhc2ggcHJlZml4IGZyb20gYSBub24taGV4IGVzY2FwZSBzZXF1ZW5jZVxuXHRcdFx0cmV0dXJuIG5vbkhleDtcblx0XHR9XG5cblx0XHQvLyBSZXBsYWNlIGEgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIHdpdGggdGhlIGVuY29kZWQgVW5pY29kZSBjb2RlIHBvaW50XG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMStcblx0XHQvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSwgbWFudWFsbHkgY29uc3RydWN0IGFcblx0XHQvLyBzdXJyb2dhdGUgcGFpclxuXHRcdHJldHVybiBoaWdoIDwgMCA/XG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXM7IHNlZSBgc2V0RG9jdW1lbnRgLlxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRS9FZGdlLlxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRpbkRpc2FibGVkRmllbGRzZXQgPSBhZGRDb21iaW5hdG9yKFxuXHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgbm9kZU5hbWUoIGVsZW0sIFwiZmllbGRzZXRcIiApO1xuXHRcdH0sXG5cdFx0eyBkaXI6IFwicGFyZW50Tm9kZVwiLCBuZXh0OiBcImxlZ2VuZFwiIH1cblx0KTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIEFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiB0aHJvdyB1bmV4cGVjdGVkbHlcbi8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM5M1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0IClcbnRyeSB7XG5cdHB1c2guYXBwbHkoXG5cdFx0KCBhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApICksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wXG5cdC8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHlcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7XG5cdFx0YXBwbHk6IGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHB1c2hOYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbCggZWxzICkgKTtcblx0XHR9LFxuXHRcdGNhbGw6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApICk7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBmaW5kKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKCBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKCBtID0gbWF0Y2hbIDEgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0XHRwdXNoLmNhbGwoIHJlc3VsdHMsIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFbGVtZW50IGNvbnRleHRcblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAmJiAoIGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkgKSAmJlxuXHRcdFx0XHRcdFx0XHRmaW5kLmNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRwdXNoLmNhbGwoIHJlc3VsdHMsIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDIgXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKCBtID0gbWF0Y2hbIDMgXSApICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggIW5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoICFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApICkgKSB7XG5cblx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cblx0XHRcdFx0Ly8gcVNBIGNvbnNpZGVycyBlbGVtZW50cyBvdXRzaWRlIGEgc2NvcGluZyByb290IHdoZW4gZXZhbHVhdGluZyBjaGlsZCBvclxuXHRcdFx0XHQvLyBkZXNjZW5kYW50IGNvbWJpbmF0b3JzLCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LlxuXHRcdFx0XHQvLyBJbiBzdWNoIGNhc2VzLCB3ZSB3b3JrIGFyb3VuZCB0aGUgYmVoYXZpb3IgYnkgcHJlZml4aW5nIGV2ZXJ5IHNlbGVjdG9yIGluIHRoZVxuXHRcdFx0XHQvLyBsaXN0IHdpdGggYW4gSUQgc2VsZWN0b3IgcmVmZXJlbmNpbmcgdGhlIHNjb3BlIGNvbnRleHQuXG5cdFx0XHRcdC8vIFRoZSB0ZWNobmlxdWUgaGFzIHRvIGJlIHVzZWQgYXMgd2VsbCB3aGVuIGEgbGVhZGluZyBjb21iaW5hdG9yIGlzIHVzZWRcblx0XHRcdFx0Ly8gYXMgc3VjaCBzZWxlY3RvcnMgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHF1ZXJ5U2VsZWN0b3JBbGwuXG5cdFx0XHRcdC8vIFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGlzIHRlY2huaXF1ZS5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggcmRlc2NlbmQudGVzdCggc2VsZWN0b3IgKSB8fCBybGVhZGluZ0NvbWJpbmF0b3IudGVzdCggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gV2UgY2FuIHVzZSA6c2NvcGUgaW5zdGVhZCBvZiB0aGUgSUQgaGFjayBpZiB0aGUgYnJvd3NlclxuXHRcdFx0XHRcdC8vIHN1cHBvcnRzIGl0ICYgaWYgd2UncmUgbm90IGNoYW5naW5nIHRoZSBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW5cblx0XHRcdFx0XHQvLyBzdHJpY3QtY29tcGFyaW5nIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICE9IGNvbnRleHQgfHwgIXN1cHBvcnQuc2NvcGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0XHRpZiAoICggbmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApICkgKSB7XG5cdFx0XHRcdFx0XHRcdG5pZCA9IGpRdWVyeS5lc2NhcGVTZWxlY3RvciggbmlkICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAoIG5pZCA9IGV4cGFuZG8gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzWyBpIF0gPSAoIG5pZCA/IFwiI1wiICsgbmlkIDogXCI6c2NvcGVcIiApICsgXCIgXCIgK1xuXHRcdFx0XHRcdFx0XHR0b1NlbGVjdG9yKCBncm91cHNbIGkgXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbUNTUywgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXNcblx0XHQvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2lzc3Vlcy8xNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoIGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUgKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBqUXVlcnkgc2VsZWN0b3IgbW9kdWxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApIHx8IG5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICkgKSAmJlxuXHRcdFx0ZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExK1xuXHRcdFx0XHQvLyBVc2UgdGhlIGlzRGlzYWJsZWQgc2hvcnRjdXQgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGRpc2FibGVkIGZpZWxkc2V0IGFuY2VzdG9yc1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pc0Rpc2FibGVkID09PSBkaXNhYmxlZCB8fFxuXG5cdFx0XHRcdFx0Ly8gV2hlcmUgdGhlcmUgaXMgbm8gaXNEaXNhYmxlZCwgY2hlY2sgbWFudWFsbHlcblx0XHRcdFx0XHRlbGVtLmlzRGlzYWJsZWQgIT09ICFkaXNhYmxlZCAmJlxuXHRcdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoIGogPSBtYXRjaEluZGV4ZXNbIGkgXSApIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFsgaiBdID0gISggbWF0Y2hlc1sgaiBdID0gc2VlZFsgaiBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIGpRdWVyeSBzZWxlY3RvciBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW25vZGVdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKi9cbmZ1bmN0aW9uIHNldERvY3VtZW50KCBub2RlICkge1xuXHR2YXIgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoIGRvYyA9PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXNcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhalF1ZXJ5LmlzWE1MRG9jKCBkb2N1bWVudCApO1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA3IG9ubHksIElFIDkgLSAxMStcblx0Ly8gT2xkZXIgYnJvd3NlcnMgZGlkbid0IHN1cHBvcnQgdW5wcmVmaXhlZCBgbWF0Y2hlc2AuXG5cdG1hdGNoZXMgPSBkb2N1bWVudEVsZW1lbnQubWF0Y2hlcyB8fFxuXHRcdGRvY3VtZW50RWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2N1bWVudEVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3I7XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxMiAtIDE4K1xuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnNcblx0Ly8gKHNlZSB0cmFjLTEzOTM2KS5cblx0Ly8gTGltaXQgdGhlIGZpeCB0byBJRSAmIEVkZ2UgTGVnYWN5OyBkZXNwaXRlIEVkZ2UgMTUrIGltcGxlbWVudGluZyBgbWF0Y2hlc2AsXG5cdC8vIGFsbCBJRSA5KyBhbmQgRWRnZSBMZWdhY3kgdmVyc2lvbnMgaW1wbGVtZW50IGBtc01hdGNoZXNTZWxlY3RvcmAgYXMgd2VsbC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3IgJiZcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0cHJlZmVycmVkRG9jICE9IGRvY3VtZW50ICYmXG5cdFx0KCBzdWJXaW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldyApICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPDEwXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxuXHQvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggZWwgKS5pZCA9IGpRdWVyeS5leHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHxcblx0XHRcdCFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggalF1ZXJ5LmV4cGFuZG8gKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUuXG5cdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRyZXR1cm4gbWF0Y2hlcy5jYWxsKCBlbCwgXCIqXCIgKTtcblx0fSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0Ly8gSUUvRWRnZSBkb24ndCBzdXBwb3J0IHRoZSA6c2NvcGUgcHNldWRvLWNsYXNzLlxuXHRzdXBwb3J0LnNjb3BlID0gYXNzZXJ0KCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggXCI6c2NvcGVcIiApO1xuXHR9ICk7XG5cblx0Ly8gU3VwcG9ydDogQ2hyb21lIDEwNSAtIDExMSBvbmx5LCBTYWZhcmkgMTUuNCAtIDE2LjMgb25seVxuXHQvLyBNYWtlIHN1cmUgdGhlIGA6aGFzKClgIGFyZ3VtZW50IGlzIHBhcnNlZCB1bmZvcmdpdmluZ2x5LlxuXHQvLyBXZSBpbmNsdWRlIGAqYCBpbiB0aGUgdGVzdCB0byBkZXRlY3QgYnVnZ3kgaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlXG5cdC8vIF9zZWxlY3RpdmVseV8gZm9yZ2l2aW5nIChzcGVjaWZpY2FsbHkgd2hlbiB0aGUgbGlzdCBpbmNsdWRlcyBhdCBsZWFzdFxuXHQvLyBvbmUgdmFsaWQgc2VsZWN0b3IpLlxuXHQvLyBOb3RlIHRoYXQgd2UgdHJlYXQgY29tcGxldGUgbGFjayBvZiBzdXBwb3J0IGZvciBgOmhhcygpYCBhcyBpZiBpdCB3ZXJlXG5cdC8vIHNwZWMtY29tcGxpYW50IHN1cHBvcnQsIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSB1c2Ugb2YgYDpoYXMoKWAgaW4gc3VjaFxuXHQvLyBlbnZpcm9ubWVudHMgd2lsbCBmYWlsIGluIHRoZSBxU0EgcGF0aCBhbmQgZmFsbCBiYWNrIHRvIGpRdWVyeSB0cmF2ZXJzYWxcblx0Ly8gYW55d2F5LlxuXHRzdXBwb3J0LmNzc0hhcyA9IGFzc2VydCggZnVuY3Rpb24oKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIFwiOmhhcygqLDpqcWZha2UpXCIgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSApO1xuXG5cdC8vIElEIGZpbHRlciBhbmQgZmluZFxuXHRpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHtcblx0XHRFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0RXhwci5maW5kLklEID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlci5JRCA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaSwgZWxlbXMsXG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0Ly8gVmVyaWZ5IHRoZSBpZCBhdHRyaWJ1dGVcblx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHRcdHZhciBpbnB1dDtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggZWwgKS5pbm5lckhUTUwgPVxuXHRcdFx0XCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+XCIgK1xuXHRcdFx0XCI8c2VsZWN0IGlkPSdcIiArIGV4cGFuZG8gKyBcIi1cXHJcXFxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPlwiICtcblx0XHRcdFwiPG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcblxuXHRcdC8vIFN1cHBvcnQ6IGlPUyA8PTcgLSA4IG9ubHlcblx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kIFwidmFsdWVcIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5IGluIHNvbWUgWE1MIGRvY3VtZW50c1xuXHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW3NlbGVjdGVkXVwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgPD03IC0gOCBvbmx5XG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbaWR+PVwiICsgZXhwYW5kbyArIFwiLV1cIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIn49XCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgOCBvbmx5XG5cdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmxpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHNcblx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiLiMuK1srfl1cIiApO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTEwNSssIEZpcmVmb3ggPD0xMDQrLCBTYWZhcmkgPD0xNS40K1xuXHRcdC8vIEluIHNvbWUgb2YgdGhlIGRvY3VtZW50IGtpbmRzLCB0aGVzZSBzZWxlY3RvcnMgd291bGRuJ3Qgd29yayBuYXRpdmVseS5cblx0XHQvLyBUaGlzIGlzIHByb2JhYmx5IE9LIGJ1dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2Ugd2FudCB0byBtYWludGFpblxuXHRcdC8vIGhhbmRsaW5nIHRoZW0gdGhyb3VnaCBqUXVlcnkgdHJhdmVyc2FsIGluIGpRdWVyeSAzLnguXG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCI6Y2hlY2tlZFwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmNoZWNrZWRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErXG5cdFx0Ly8gSUUncyA6ZGlzYWJsZWQgc2VsZWN0b3IgZG9lcyBub3QgcGljayB1cCB0aGUgY2hpbGRyZW4gb2YgZGlzYWJsZWQgZmllbGRzZXRzXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MTA1KywgRmlyZWZveCA8PTEwNCssIFNhZmFyaSA8PTE1LjQrXG5cdFx0Ly8gSW4gc29tZSBvZiB0aGUgZG9jdW1lbnQga2luZHMsIHRoZXNlIHNlbGVjdG9ycyB3b3VsZG4ndCB3b3JrIG5hdGl2ZWx5LlxuXHRcdC8vIFRoaXMgaXMgcHJvYmFibHkgT0sgYnV0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3ZSB3YW50IHRvIG1haW50YWluXG5cdFx0Ly8gaGFuZGxpbmcgdGhlbSB0aHJvdWdoIGpRdWVyeSB0cmF2ZXJzYWwgaW4galF1ZXJ5IDMueC5cblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCI6ZGlzYWJsZWRcIiApLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHQvLyBJRSAxMS9FZGdlIGRvbid0IGZpbmQgZWxlbWVudHMgb24gYSBgW25hbWU9JyddYCBxdWVyeSBpbiBzb21lIGNhc2VzLlxuXHRcdC8vIEFkZGluZyBhIHRlbXBvcmFyeSBhdHRyaWJ1dGUgdG8gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgc2VsZWN0aW9uIHdvcmtzXG5cdFx0Ly8gYXJvdW5kIHRoZSBpc3N1ZS5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBJRSAxMCAmIG9sZGVyIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgaXNzdWUuXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIlwiICk7XG5cdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbmFtZT0nJ11cIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqbmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKj1cIiArXG5cdFx0XHRcdHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdH1cblx0fSApO1xuXG5cdGlmICggIXN1cHBvcnQuY3NzSGFzICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDEwNSAtIDExMCssIFNhZmFyaSAxNS40IC0gMTYuMytcblx0XHQvLyBPdXIgcmVndWxhciBgdHJ5LWNhdGNoYCBtZWNoYW5pc20gZmFpbHMgdG8gZGV0ZWN0IG5hdGl2ZWx5LXVuc3VwcG9ydGVkXG5cdFx0Ly8gcHNldWRvLWNsYXNzZXMgaW5zaWRlIGA6aGFzKClgIChzdWNoIGFzIGA6aGFzKDpjb250YWlucyhcIkZvb1wiKSlgKVxuXHRcdC8vIGluIGJyb3dzZXJzIHRoYXQgcGFyc2UgdGhlIGA6aGFzKClgIGFyZ3VtZW50IGFzIGEgZm9yZ2l2aW5nIHNlbGVjdG9yIGxpc3QuXG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL3NlbGVjdG9ycy8jcmVsYXRpb25hbCBub3cgcmVxdWlyZXMgdGhlIGFyZ3VtZW50XG5cdFx0Ly8gdG8gYmUgcGFyc2VkIHVuZm9yZ2l2aW5nbHksIGJ1dCBicm93c2VycyBoYXZlIG5vdCB5ZXQgZnVsbHkgYWRqdXN0ZWQuXG5cdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmhhc1wiICk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCBcInxcIiApICk7XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCAhc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlICkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRmaW5kLmNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGEgKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT0gcHJlZmVycmVkRG9jICYmXG5cdFx0XHRcdGZpbmQuY29udGFpbnMoIHByZWZlcnJlZERvYywgYiApICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBhICkgLSBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59XG5cbmZpbmQubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIGZpbmQoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5maW5kLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHRzZXREb2N1bWVudCggZWxlbSApO1xuXG5cdGlmICggZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblxuXHRcdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBleHByLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZpbmQoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5maW5kLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuXG5maW5kLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblxuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIHRyYWMtMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRpZiAoIHZhbCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcbn07XG5cbmZpbmQuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0Ly9cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCtcblx0Ly8gVGVzdGluZyBmb3IgZGV0ZWN0aW5nIGR1cGxpY2F0ZXMgaXMgdW5wcmVkaWN0YWJsZSBzbyBpbnN0ZWFkIGFzc3VtZSB3ZSBjYW4ndFxuXHQvLyBkZXBlbmQgb24gZHVwbGljYXRlIGRldGVjdGlvbiBpbiBhbGwgYnJvd3NlcnMgd2l0aG91dCBhIHN0YWJsZSBzb3J0LlxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5zb3J0U3RhYmxlO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHNsaWNlLmNhbGwoIHJlc3VsdHMsIDAgKTtcblx0c29ydC5jYWxsKCByZXN1bHRzLCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoICggZWxlbSA9IHJlc3VsdHNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHNwbGljZS5jYWxsKCByZXN1bHRzLCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbmpRdWVyeS5mbi51bmlxdWVTb3J0ID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZVNvcnQoIHNsaWNlLmFwcGx5KCB0aGlzICkgKSApO1xufTtcblxuRXhwciA9IGpRdWVyeS5leHByID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdEFUVFI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFsgMyBdID0gKCBtYXRjaFsgMyBdIHx8IG1hdGNoWyA0IF0gfHwgbWF0Y2hbIDUgXSB8fCBcIlwiIClcblx0XHRcdFx0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDIgXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFsgMyBdID0gXCIgXCIgKyBtYXRjaFsgMyBdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRDSElMRDogZnVuY3Rpb24oIG1hdGNoICkge1xuXG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbIDEgXSA9IG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsgMSBdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0XHRmaW5kLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFsgNCBdID0gKyggbWF0Y2hbIDQgXSA/XG5cdFx0XHRcdFx0bWF0Y2hbIDUgXSArICggbWF0Y2hbIDYgXSB8fCAxICkgOlxuXHRcdFx0XHRcdDIgKiAoIG1hdGNoWyAzIF0gPT09IFwiZXZlblwiIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRtYXRjaFsgNSBdID0gKyggKCBtYXRjaFsgNyBdICsgbWF0Y2hbIDggXSApIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRmaW5kLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0UFNFVURPOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFsgNiBdICYmIG1hdGNoWyAyIF07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByLkNISUxELnRlc3QoIG1hdGNoWyAwIF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSBtYXRjaFsgNCBdIHx8IG1hdGNoWyA1IF0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdCggZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkgKSAmJlxuXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoIGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWyAwIF0gPSBtYXRjaFsgMCBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbIDIgXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRUQUc6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIGV4cGVjdGVkTm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBlbGVtLCBleHBlY3RlZE5vZGVOYW1lICk7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdENMQVNTOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQoIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgY2xhc3NOYW1lICtcblx0XHRcdFx0XHRcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkgKSAmJlxuXHRcdFx0XHRjbGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoXG5cdFx0XHRcdFx0XHR0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHxcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8XG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdEFUVFI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBmaW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCI9XCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gY2hlY2s7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCIhPVwiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgIT09IGNoZWNrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiXj1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCIqPVwiICkge1xuXHRcdFx0XHRcdHJldHVybiBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiJD1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwifj1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiIClcblx0XHRcdFx0XHRcdC5pbmRleE9mKCBjaGVjayApID4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCJ8PVwiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Q0hJTEQ6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBfYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBub2RlWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlTmFtZSggbm9kZSwgbmFtZSApIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKCBwYXJlbnRbIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gb3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdCggZGlmZiA9IG5vZGVJbmRleCA9IDAgKSB8fCBzdGFydC5wb3AoKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoIGVsZW1bIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGVOYW1lKCBub2RlLCBuYW1lICkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0UFNFVURPOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblxuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0ZmluZC5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIGpRdWVyeSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbIGkgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblxuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdG5vdDogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSB1bm1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpIF0gPSAhKCBtYXRjaGVzWyBpIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0Ly8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9pc3N1ZXMvMjk5KVxuXHRcdFx0XHRcdGlucHV0WyAwIF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRoYXM6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZmluZCggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRjb250YWluczogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgalF1ZXJ5LnRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRsYW5nOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KCBsYW5nIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0ZmluZC5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcInhtbDpsYW5nXCIgKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSggXCJsYW5nXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKCBlbGVtID0gZWxlbS5wYXJlbnROb2RlICkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHR0YXJnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdHJvb3Q6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50RWxlbWVudDtcblx0XHR9LFxuXG5cdFx0Zm9jdXM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiZcblx0XHRcdFx0ZG9jdW1lbnQuaGFzRm9jdXMoKSAmJlxuXHRcdFx0XHQhISggZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCApO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRlbmFibGVkOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRkaXNhYmxlZDogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSxcblxuXHRcdGNoZWNrZWQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0cmV0dXJuICggbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmICEhZWxlbS5jaGVja2VkICkgfHxcblx0XHRcdFx0KCBub2RlTmFtZSggZWxlbSwgXCJvcHRpb25cIiApICYmICEhZWxlbS5zZWxlY3RlZCApO1xuXHRcdH0sXG5cblx0XHRzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcblx0XHRcdC8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byB0cmVhdCB0aGUgZGVmYXVsdCBvcHRpb24gYXNcblx0XHRcdC8vIHNlbGVjdGVkIHdoZW4gaW4gYW4gb3B0Z3JvdXAuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0ZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3MuZW1wdHkoIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdGhlYWRlcjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdGlucHV0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0YnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8XG5cdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICk7XG5cdFx0fSxcblxuXHRcdHRleHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8MTAgb25seVxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyXG5cdFx0XHRcdC8vIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoICggYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICkgPT0gbnVsbCB8fFxuXHRcdFx0XHRcdGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdGZpcnN0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9ICksXG5cblx0XHRsYXN0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0gKSxcblxuXHRcdGVxOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9ICksXG5cblx0XHRldmVuOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0b2RkOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0bHQ6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaTtcblxuXHRcdFx0aWYgKCBhcmd1bWVudCA8IDAgKSB7XG5cdFx0XHRcdGkgPSBhcmd1bWVudCArIGxlbmd0aDtcblx0XHRcdH0gZWxzZSBpZiAoIGFyZ3VtZW50ID4gbGVuZ3RoICkge1xuXHRcdFx0XHRpID0gbGVuZ3RoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aSA9IGFyZ3VtZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0Z3Q6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3MubnRoID0gRXhwci5wc2V1ZG9zLmVxO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbmZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKCBtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApICkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWyAwIF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKCB0b2tlbnMgPSBbXSApICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoICggbWF0Y2ggPSBybGVhZGluZ0NvbWJpbmF0b3IuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbIDAgXS5yZXBsYWNlKCBydHJpbUNTUywgXCIgXCIgKVxuXHRcdFx0fSApO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKCBtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkgKSAmJiAoICFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KCBtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSApICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRpZiAoIHBhcnNlT25seSApIHtcblx0XHRyZXR1cm4gc29GYXIubGVuZ3RoO1xuXHR9XG5cblx0cmV0dXJuIHNvRmFyID9cblx0XHRmaW5kLmVycm9yKCBzZWxlY3RvciApIDpcblxuXHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn1cblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1sgaSBdLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKCBlbGVtWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgbm9kZU5hbWUoIGVsZW0sIHNraXAgKSApIHtcblx0XHRcdFx0XHRcdFx0ZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAoIG9sZENhY2hlID0gb3V0ZXJDYWNoZVsga2V5IF0gKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAoIG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAoIG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICkge1xuXHRyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBpID0gbWF0Y2hlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggIW1hdGNoZXJzWyBpIF0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbIDAgXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRmaW5kKCBzZWxlY3RvciwgY29udGV4dHNbIGkgXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkge1xuXHRcdHZhciB0ZW1wLCBpLCBlbGVtLCBtYXRjaGVyT3V0LFxuXHRcdFx0cHJlTWFwID0gW10sXG5cdFx0XHRwb3N0TWFwID0gW10sXG5cdFx0XHRwcmVleGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBHZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dFxuXHRcdFx0ZWxlbXMgPSBzZWVkIHx8XG5cdFx0XHRcdG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yIHx8IFwiKlwiLFxuXHRcdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXM7XG5cblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyXG5cdFx0XHQvLyBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0bWF0Y2hlck91dCA9IHBvc3RGaW5kZXIgfHwgKCBzZWVkID8gcHJlRmlsdGVyIDogcHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID9cblxuXHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdC8vIC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseVxuXHRcdFx0XHRyZXN1bHRzO1xuXG5cdFx0XHQvLyBGaW5kIHByaW1hcnkgbWF0Y2hlc1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXJJbjtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICggZWxlbSA9IHRlbXBbIGkgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXJPdXRbIHBvc3RNYXBbIGkgXSBdID0gISggbWF0Y2hlckluWyBwb3N0TWFwWyBpIF0gXSA9IGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggc2VlZCApIHtcblx0XHRcdGlmICggcG9zdEZpbmRlciB8fCBwcmVGaWx0ZXIgKSB7XG5cdFx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblxuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IG1hdGNoZXJPdXRbIGkgXSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKCBtYXRjaGVySW5bIGkgXSA9IGVsZW0gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCAoIG1hdGNoZXJPdXQgPSBbXSApLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSAmJlxuXHRcdFx0XHRcdFx0KCB0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YuY2FsbCggc2VlZCwgZWxlbSApIDogcHJlTWFwWyBpIF0gKSA+IC0xICkge1xuXG5cdFx0XHRcdFx0XHRzZWVkWyB0ZW1wIF0gPSAhKCByZXN1bHRzWyB0ZW1wIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWRcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IGNvbmRlbnNlKFxuXHRcdFx0XHRtYXRjaGVyT3V0ID09PSByZXN1bHRzID9cblx0XHRcdFx0XHRtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOlxuXHRcdFx0XHRcdG1hdGNoZXJPdXRcblx0XHRcdCk7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgbWF0Y2hlck91dCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAwIF0udHlwZSBdLFxuXHRcdGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsgXCIgXCIgXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoXG5cdFx0XHRcdCggY2hlY2tDb250ZXh0ID0gY29udGV4dCApLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50XG5cdFx0XHQvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2lzc3Vlcy8yOTkpXG5cdFx0XHRjaGVja0NvbnRleHQgPSBudWxsO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IF07XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoIG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGkgXS50eXBlIF0gKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKCBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlciApIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zWyBpIF0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbIGkgXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHQvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmdcblx0XHRcdFx0aiA9ICsraTtcblx0XHRcdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGogXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3RvcihcblxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKVxuXHRcdFx0XHRcdFx0XHQuY29uY2F0KCB7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gXCIgXCIgPyBcIipcIiA6IFwiXCIgfSApXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbUNTUywgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAoIHRva2VucyA9IHRva2Vucy5zbGljZSggaiApICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7XG5cdHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0YnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0c3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkge1xuXHRcdFx0dmFyIGVsZW0sIGosIG1hdGNoZXIsXG5cdFx0XHRcdG1hdGNoZWRDb3VudCA9IDAsXG5cdFx0XHRcdGkgPSBcIjBcIixcblx0XHRcdFx0dW5tYXRjaGVkID0gc2VlZCAmJiBbXSxcblx0XHRcdFx0c2V0TWF0Y2hlZCA9IFtdLFxuXHRcdFx0XHRjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCxcblxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kLlRBRyggXCIqXCIsIG91dGVybW9zdCApLFxuXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoIGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1cCA9PSBudWxsID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgMC4xICksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgPT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBpT1MgPD03IC0gOSBvbmx5XG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmdcblx0XHRcdC8vIGVsZW1lbnRzIGJ5IGlkLiAoc2VlIHRyYWMtMTQxNDIpXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0XHRpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cHVzaC5jYWxsKCByZXN1bHRzLCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblxuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoICggZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0gKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IHNldE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISggdW5tYXRjaGVkWyBpIF0gfHwgc2V0TWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFsgaSBdID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5mdW5jdGlvbiBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblxuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFsgaSBdICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3Rvcixcblx0XHRcdG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufVxuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggalF1ZXJ5J3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBqUXVlcnkgc2VsZWN0b3IgY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbmZ1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKCBzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yICkgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3RvciBpbiB0aGUgbGlzdCBhbmQgbm8gc2VlZFxuXHQvLyAodGhlIGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpXG5cdGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xuXG5cdFx0Ly8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRpbmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSURcblx0XHR0b2tlbnMgPSBtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKCB0b2tlbiA9IHRva2Vuc1sgMCBdICkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAxIF0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmQuSUQoXG5cdFx0XHRcdHRva2VuLm1hdGNoZXNbIDAgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRjb250ZXh0XG5cdFx0XHQpIHx8IFtdIClbIDAgXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHIubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zWyBpIF07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKCB0eXBlID0gdG9rZW4udHlwZSApIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoIGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSApICkge1xuXG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoICggc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1sgMCBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWyAwIF0udHlwZSApICYmXG5cdFx0XHRcdFx0XHR0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpICkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIC0gNC4xK1xuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIFwiXCIgKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCBcIlwiICkgPT09IGV4cGFuZG87XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCAtIDQuMStcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZpZWxkc2V0XCIgKSApICYgMTtcbn0gKTtcblxualF1ZXJ5LmZpbmQgPSBmaW5kO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlID0galF1ZXJ5LnVuaXF1ZVNvcnQ7XG5cbi8vIFRoZXNlIGhhdmUgYWx3YXlzIGJlZW4gcHJpdmF0ZSwgYnV0IHRoZXkgdXNlZCB0byBiZSBkb2N1bWVudGVkIGFzIHBhcnQgb2Zcbi8vIFNpenpsZSBzbyBsZXQncyBtYWludGFpbiB0aGVtIGZvciBub3cgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuZmluZC5jb21waWxlID0gY29tcGlsZTtcbmZpbmQuc2VsZWN0ID0gc2VsZWN0O1xuZmluZC5zZXREb2N1bWVudCA9IHNldERvY3VtZW50O1xuZmluZC50b2tlbml6ZSA9IHRva2VuaXplO1xuXG5maW5kLmVzY2FwZSA9IGpRdWVyeS5lc2NhcGVTZWxlY3RvcjtcbmZpbmQuZ2V0VGV4dCA9IGpRdWVyeS50ZXh0O1xuZmluZC5pc1hNTCA9IGpRdWVyeS5pc1hNTERvYztcbmZpbmQuc2VsZWN0b3JzID0galF1ZXJ5LmV4cHI7XG5maW5kLnN1cHBvcnQgPSBqUXVlcnkuc3VwcG9ydDtcbmZpbmQudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWVTb3J0O1xuXG5cdC8qIGVzbGludC1lbmFibGUgKi9cblxufSApKCk7XG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKHRyYWMtOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKHRyYWMtMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIGpRdWVyeSNmaW5kXG5cdFx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBjdXIsIHNlbGVjdG9ycyApICkgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGNoZWQucHVzaCggY3VyICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yIClcblx0XHQpO1xuXHR9XG59ICk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoICggY3VyID0gY3VyWyBkaXIgXSApICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9XG5cdHJldHVybiBjdXI7XG59XG5cbmpRdWVyeS5lYWNoKCB7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiApO1xuXHR9LFxuXHRwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdGlmICggZWxlbS5jb250ZW50RG9jdW1lbnQgIT0gbnVsbCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMStcblx0XHRcdC8vIDxvYmplY3Q+IGVsZW1lbnRzIHdpdGggbm8gYGRhdGFgIGF0dHJpYnV0ZSBoYXMgYW4gb2JqZWN0XG5cdFx0XHQvLyBgY29udGVudERvY3VtZW50YCB3aXRoIGEgYG51bGxgIHByb3RvdHlwZS5cblx0XHRcdGdldFByb3RvKCBlbGVtLmNvbnRlbnREb2N1bWVudCApICkge1xuXG5cdFx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG5cdFx0Ly8gVHJlYXQgdGhlIHRlbXBsYXRlIGVsZW1lbnQgYXMgYSByZWd1bGFyIG9uZSBpbiBicm93c2VycyB0aGF0XG5cdFx0Ly8gZG9uJ3Qgc3VwcG9ydCBpdC5cblx0XHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcblx0XHRcdGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59ICk7XG52YXIgcm5vdGh0bWx3aGl0ZSA9ICggL1teXFx4MjBcXHRcXHJcXG5cXGZdKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gbG9ja2VkIHx8IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0b1R5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QsIG5vVmFsdWUgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUucHJvbWlzZSApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciB0aGVuYWJsZXNcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnRoZW4gKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIG5vbi10aGVuYWJsZXNcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb250cm9sIGByZXNvbHZlYCBhcmd1bWVudHMgYnkgbGV0dGluZyBBcnJheSNzbGljZSBjYXN0IGJvb2xlYW4gYG5vVmFsdWVgIHRvIGludGVnZXI6XG5cdFx0XHQvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApXG5cdFx0XHQvLyAqIHRydWU6IFsgdmFsdWUgXS5zbGljZSggMSApID0+IHJlc29sdmUoKVxuXHRcdFx0cmVzb2x2ZS5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0uc2xpY2UoIG5vVmFsdWUgKSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGNhbGxiYWNrcyxcblx0XHRcdFx0Ly8gLi4uIC50aGVuIGhhbmRsZXJzLCBhcmd1bWVudCBpbmRleCwgW2ZpbmFsIHN0YXRlXVxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSwgMiBdLFxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDAsIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMSwgXCJyZWplY3RlZFwiIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjYXRjaFwiOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2UudGhlbiggbnVsbCwgZm4gKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdHBpcGU6IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIF9pLCB0dXBsZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBNYXAgdHVwbGVzIChwcm9ncmVzcywgZG9uZSwgZmFpbCkgdG8gYXJndW1lbnRzIChkb25lLCBmYWlsLCBwcm9ncmVzcylcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0gaXNGdW5jdGlvbiggZm5zWyB0dXBsZVsgNCBdIF0gKSAmJiBmbnNbIHR1cGxlWyA0IF0gXTtcblxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5wcm9ncmVzcyhmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5ub3RpZnkgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmZhaWwoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVqZWN0IH0pXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5kb25lKCBuZXdEZWZlci5yZXNvbHZlIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmZhaWwoIG5ld0RlZmVyLnJlamVjdCApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0Zm5zID0gbnVsbDtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7XG5cdFx0XHRcdFx0dmFyIG1heERlcHRoID0gMDtcblx0XHRcdFx0XHRmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB0aGF0ID0gdGhpcyxcblx0XHRcdFx0XHRcdFx0XHRhcmdzID0gYXJndW1lbnRzLFxuXHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCwgdGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgZG91YmxlLXJlc29sdXRpb24gYXR0ZW1wdHNcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGVwdGggPCBtYXhEZXB0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCA9IGhhbmRsZXIuYXBwbHkoIHRoYXQsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNDhcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggXCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb25cIiApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9ucyAyLjMuMy4xLCAzLjVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU0XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmV0cmlldmUgYHRoZW5gIG9ubHkgb25jZVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhlbiA9IHJldHVybmVkICYmXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuNFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02NFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCB0eXBlb2YgcmV0dXJuZWQgPT09IFwib2JqZWN0XCIgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgcmV0dXJuZWQgPT09IFwiZnVuY3Rpb25cIiApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhIHJldHVybmVkIHRoZW5hYmxlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoZW4gKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTcGVjaWFsIHByb2Nlc3NvcnMgKG5vdGlmeSkganVzdCB3YWl0IGZvciByZXNvbHV0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBOb3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgYWxzbyBob29rIGludG8gcHJvZ3Jlc3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBkaXNyZWdhcmQgb2xkZXIgcmVzb2x1dGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtYXhEZXB0aCsrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGggKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBJZGVudGl0eSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIHJldHVybmVkIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBQcm9jZXNzIHRoZSB2YWx1ZShzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHNwZWNpYWwgfHwgZGVmZXJyZWQucmVzb2x2ZVdpdGggKSggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IG5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBjYXRjaCBhbmQgcmVqZWN0IGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzID0gc3BlY2lhbCA/XG5cdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93IDpcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MuZXJyb3IgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgZXJyb3IsIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0RXJyb3JIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5lcnJvciA9IGpRdWVyeS5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBkZXByZWNhdGVkIGFsaWFzIG9mIHRoZSBhYm92ZS4gV2hpbGUgdGhlIG5hbWUgc3VnZ2VzdHNcblx0XHRcdFx0XHRcdFx0XHQvLyByZXR1cm5pbmcgdGhlIHN0YWNrLCBub3QgYW4gZXJyb3IgaW5zdGFuY2UsIGpRdWVyeSBqdXN0IHBhc3Nlc1xuXHRcdFx0XHRcdFx0XHRcdC8vIGl0IGRpcmVjdGx5IHRvIGBjb25zb2xlLndhcm5gIHNvIGJvdGggd2lsbCB3b3JrOyBhbiBpbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHRcdC8vIGp1c3QgYmV0dGVyIGNvb3BlcmF0ZXMgd2l0aCBzb3VyY2UgbWFwcy5cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5lcnJvciA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBwcmltYXJ5IERlZmVycmVkXG5cdFx0XHRwcmltYXJ5ID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdHByaW1hcnkucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIHByaW1hcnkuZG9uZSggdXBkYXRlRnVuYyggaSApICkucmVzb2x2ZSwgcHJpbWFyeS5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBwcmltYXJ5LnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBwcmltYXJ5LnRoZW4oKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBNdWx0aXBsZSBhcmd1bWVudHMgYXJlIGFnZ3JlZ2F0ZWQgbGlrZSBQcm9taXNlLmFsbCBhcnJheSBlbGVtZW50c1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggcmVzb2x2ZVZhbHVlc1sgaSBdLCB1cGRhdGVGdW5jKCBpICksIHByaW1hcnkucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByaW1hcnkucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG4vLyBJZiBgalF1ZXJ5LkRlZmVycmVkLmdldEVycm9ySG9va2AgaXMgZGVmaW5lZCwgYGFzeW5jRXJyb3JgIGlzIGFuIGVycm9yXG4vLyBjYXB0dXJlZCBiZWZvcmUgdGhlIGFzeW5jIGJhcnJpZXIgdG8gZ2V0IHRoZSBvcmlnaW5hbCBlcnJvciBjYXVzZVxuLy8gd2hpY2ggbWF5IG90aGVyd2lzZSBiZSBoaWRkZW4uXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgYXN5bmNFcnJvciApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsXG5cdFx0XHRlcnJvci5zdGFjaywgYXN5bmNFcnJvciApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgdHJhYy02NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBfa2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBfYWxsLCBsZXR0ZXIgKSB7XG5cdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbn1cblxuLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKHRyYWMtOTU3MilcbmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkge1xuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcbn1cbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlIHRyYWMtODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKHRyYWMtMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG5cdHZhciBpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0XHR9LFxuXHRcdGNvbXBvc2VkID0geyBjb21wb3NlZDogdHJ1ZSB9O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCssIGlPUyAxMC4wIC0gMTAuMiBvbmx5XG5cdC8vIENoZWNrIGF0dGFjaG1lbnQgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlIChnaC0zNTA0KVxuXHQvLyBTdXBwb3J0OiBpT1MgMTAuMC0xMC4yIG9ubHlcblx0Ly8gRWFybHkgaU9TIDEwIHZlcnNpb25zIHN1cHBvcnQgYGF0dGFjaFNoYWRvd2AgYnV0IG5vdCBgZ2V0Um9vdE5vZGVgLFxuXHQvLyBsZWFkaW5nIHRvIGVycm9ycy4gV2UgbmVlZCB0byBjaGVjayBmb3IgYGdldFJvb3ROb2RlYC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQuZ2V0Um9vdE5vZGUgKSB7XG5cdFx0aXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRSb290Tm9kZSggY29tcG9zZWQgKSA9PT0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdH07XG5cdH1cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpc0F0dGFjaGVkKCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsIHNjYWxlLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9IGVsZW0ubm9kZVR5cGUgJiZcblx0XHRcdCggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0XHQvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpXG5cdFx0aW5pdGlhbCA9IGluaXRpYWwgLyAyO1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHR3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgYW5kIHVwZGF0ZSBvdXIgYmVzdCBndWVzcyAoZG91YmxpbmcgZ3Vlc3NlcyB0aGF0IHplcm8gb3V0KS5cblx0XHRcdC8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS5cblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblx0XHRcdGlmICggKCAxIC0gc2NhbGUgKSAqICggMSAtICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgfHwgMC41ICkgKSA8PSAwICkge1xuXHRcdFx0XHRtYXhJdGVyYXRpb25zID0gMDtcblx0XHRcdH1cblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cblx0XHR9XG5cblx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAqIDI7XG5cdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG52YXIgZGVmYXVsdERpc3BsYXlNYXAgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7XG5cdHZhciB0ZW1wLFxuXHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCxcblx0XHRub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUsXG5cdFx0ZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdO1xuXG5cdGlmICggZGlzcGxheSApIHtcblx0XHRyZXR1cm4gZGlzcGxheTtcblx0fVxuXG5cdHRlbXAgPSBkb2MuYm9keS5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICkgKTtcblx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsIFwiZGlzcGxheVwiICk7XG5cblx0dGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wICk7XG5cblx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRkaXNwbGF5ID0gXCJibG9ja1wiO1xuXHR9XG5cdGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdID0gZGlzcGxheTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSxcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdC8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZVxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdylcblx0XHRcdC8vIGNoZWNrIGlzIHJlcXVpcmVkIGluIHRoaXMgZmlyc3QgbG9vcCB1bmxlc3Mgd2UgaGF2ZSBhIG5vbmVtcHR5IGRpc3BsYXkgdmFsdWUgKGVpdGhlclxuXHRcdFx0Ly8gaW5saW5lIG9yIGFib3V0LXRvLWJlLXJlc3RvcmVkKVxuXHRcdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApIHx8IG51bGw7XG5cdFx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSApIHtcblx0XHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gXCJub25lXCI7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hhdCB3ZSdyZSBvdmVyd3JpdGluZ1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiZGlzcGxheVwiLCBkaXNwbGF5ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggdmFsdWVzWyBpbmRleCBdICE9IG51bGwgKSB7XG5cdFx0XHRlbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuV2l0aGluVHJlZSggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKHRyYWMtMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICh0cmFjLTE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSBvbmx5XG5cdC8vIE9sZGVyIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0Ly8gSUUgPD05IHJlcGxhY2VzIDxvcHRpb24+IHRhZ3Mgd2l0aCB0aGVpciBjb250ZW50cyB3aGVuIGluc2VydGVkIG91dHNpZGUgb2Zcblx0Ly8gdGhlIHNlbGVjdCBlbGVtZW50LlxuXHRkaXYuaW5uZXJIVE1MID0gXCI8b3B0aW9uPjwvb3B0aW9uPlwiO1xuXHRzdXBwb3J0Lm9wdGlvbiA9ICEhZGl2Lmxhc3RDaGlsZDtcbn0gKSgpO1xuXG5cbi8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICh0cmFjLTEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5pZiAoICFzdXBwb3J0Lm9wdGlvbiApIHtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uID0gWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdO1xufVxuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAodHJhYy0xNTE1MSlcblx0dmFyIHJldDtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2Uge1xuXHRcdHJldCA9IFtdO1xuXHR9XG5cblx0aWYgKCB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgbm9kZU5hbWUoIGNvbnRleHQsIHRhZyApICkge1xuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cblxuLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkXG5mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7LztcblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBhdHRhY2hlZCwgaixcblx0XHRmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRpZiAoIHRvVHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKHRyYWMtMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGF0dGFjaGVkID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBhdHRhY2hlZCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxudmFyIHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gT25seSBhdHRhY2ggZXZlbnRzIHRvIG9iamVjdHMgdGhhdCBhY2NlcHQgZGF0YVxuXHRcdGlmICggIWFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhhdCBpbnZhbGlkIHNlbGVjdG9ycyB0aHJvdyBleGNlcHRpb25zIGF0IGF0dGFjaCB0aW1lXG5cdFx0Ly8gRXZhbHVhdGUgYWdhaW5zdCBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBlbGVtIGlzIGEgbm9uLWVsZW1lbnQgbm9kZSAoZS5nLiwgZG9jdW1lbnQpXG5cdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlclxuXHRcdGlmICggIWhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSBPYmplY3QuY3JlYXRlKCBudWxsICk7XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLCBoYW5kbGVyUXVldWUsXG5cdFx0XHRhcmdzID0gbmV3IEFycmF5KCBhcmd1bWVudHMubGVuZ3RoICksXG5cblx0XHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApLFxuXG5cdFx0XHRoYW5kbGVycyA9IChcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcImV2ZW50c1wiICkgfHwgT2JqZWN0LmNyZWF0ZSggbnVsbCApXG5cdFx0XHQpWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZXZlbnQgaXMgbmFtZXNwYWNlZCwgdGhlbiBlYWNoIGhhbmRsZXIgaXMgb25seSBpbnZva2VkIGlmIGl0IGlzXG5cdFx0XHRcdC8vIHNwZWNpYWxseSB1bml2ZXJzYWwgb3IgaXRzIG5hbWVzcGFjZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIGV2ZW50J3MuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgaGFuZGxlT2JqLm5hbWVzcGFjZSA9PT0gZmFsc2UgfHxcblx0XHRcdFx0XHRldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycyxcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OVxuXHRcdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKHRyYWMtMTMxODApXG5cdFx0XHRjdXIubm9kZVR5cGUgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQyXG5cdFx0XHQvLyBTdXBwcmVzcyBzcGVjLXZpb2xhdGluZyBjbGlja3MgaW5kaWNhdGluZyBhIG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uICh0cmFjLTM4NjEpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHQvLyAuLi5idXQgbm90IGFycm93IGtleSBcImNsaWNrc1wiIG9mIHJhZGlvIGlucHV0cywgd2hpY2ggY2FuIGhhdmUgYGJ1dHRvbmAgLTEgKGdoLTIzNDMpXG5cdFx0XHQhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgZXZlbnQuYnV0dG9uID49IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICh0cmFjLTEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAodHJhYy02OTExLCB0cmFjLTgxNjUsIHRyYWMtMTEzODIsIHRyYWMtMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBjdXIuZGlzYWJsZWQgPT09IHRydWUgKSApIHtcblx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMgPSBbXTtcblx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzID0ge307XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAodHJhYy0xMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlZEhhbmRsZXJzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0Y3VyID0gdGhpcztcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBpc0Z1bmN0aW9uKCBob29rICkgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRjbGljazoge1xuXG5cdFx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCB0byBlbnN1cmUgY29ycmVjdCBzdGF0ZSBmb3IgY2hlY2thYmxlIGlucHV0c1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gQ2xhaW0gdGhlIGZpcnN0IGhhbmRsZXJcblx0XHRcdFx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbC50eXBlICkgJiZcblx0XHRcdFx0XHRlbC5jbGljayAmJiBub2RlTmFtZSggZWwsIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0Ly8gZGF0YVByaXYuc2V0KCBlbCwgXCJjbGlja1wiLCAuLi4gKVxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oIGRhdGEgKSB7XG5cblx0XHRcdFx0Ly8gRm9yIG11dHVhbCBjb21wcmVzc2liaWxpdHkgd2l0aCBfZGVmYXVsdCwgcmVwbGFjZSBgdGhpc2AgYWNjZXNzIHdpdGggYSBsb2NhbCB2YXIuXG5cdFx0XHRcdC8vIGB8fCBkYXRhYCBpcyBkZWFkIGNvZGUgbWVhbnQgb25seSB0byBwcmVzZXJ2ZSB0aGUgdmFyaWFibGUgdGhyb3VnaCBtaW5pZmljYXRpb24uXG5cdFx0XHRcdHZhciBlbCA9IHRoaXMgfHwgZGF0YTtcblxuXHRcdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlcmluZyBhIGNsaWNrXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIHN1cHByZXNzIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0Ly8gQWxzbyBwcmV2ZW50IGl0IGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRyZXR1cm4gcmNoZWNrYWJsZVR5cGUudGVzdCggdGFyZ2V0LnR5cGUgKSAmJlxuXHRcdFx0XHRcdHRhcmdldC5jbGljayAmJiBub2RlTmFtZSggdGFyZ2V0LCBcImlucHV0XCIgKSAmJlxuXHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGFyZ2V0LCBcImNsaWNrXCIgKSB8fFxuXHRcdFx0XHRcdG5vZGVOYW1lKCB0YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gRW5zdXJlIHRoZSBwcmVzZW5jZSBvZiBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgbWFudWFsbHktdHJpZ2dlcmVkXG4vLyBzeW50aGV0aWMgZXZlbnRzIGJ5IGludGVycnVwdGluZyBwcm9ncmVzcyB1bnRpbCByZWludm9rZWQgaW4gcmVzcG9uc2UgdG9cbi8vICpuYXRpdmUqIGV2ZW50cyB0aGF0IGl0IGZpcmVzIGRpcmVjdGx5LCBlbnN1cmluZyB0aGF0IHN0YXRlIGNoYW5nZXMgaGF2ZVxuLy8gYWxyZWFkeSBvY2N1cnJlZCBiZWZvcmUgb3RoZXIgbGlzdGVuZXJzIGFyZSBpbnZva2VkLlxuZnVuY3Rpb24gbGV2ZXJhZ2VOYXRpdmUoIGVsLCB0eXBlLCBpc1NldHVwICkge1xuXG5cdC8vIE1pc3NpbmcgYGlzU2V0dXBgIGluZGljYXRlcyBhIHRyaWdnZXIgY2FsbCwgd2hpY2ggbXVzdCBmb3JjZSBzZXR1cCB0aHJvdWdoIGpRdWVyeS5ldmVudC5hZGRcblx0aWYgKCAhaXNTZXR1cCApIHtcblx0XHRpZiAoIGRhdGFQcml2LmdldCggZWwsIHR5cGUgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHJldHVyblRydWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVnaXN0ZXIgdGhlIGNvbnRyb2xsZXIgYXMgYSBzcGVjaWFsIHVuaXZlcnNhbCBoYW5kbGVyIGZvciBhbGwgZXZlbnQgbmFtZXNwYWNlc1xuXHRkYXRhUHJpdi5zZXQoIGVsLCB0eXBlLCBmYWxzZSApO1xuXHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwge1xuXHRcdG5hbWVzcGFjZTogZmFsc2UsXG5cdFx0aGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJlc3VsdCxcblx0XHRcdFx0c2F2ZWQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0aWYgKCAoIGV2ZW50LmlzVHJpZ2dlciAmIDEgKSAmJiB0aGlzWyB0eXBlIF0gKSB7XG5cblx0XHRcdFx0Ly8gSW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgdGhlIG91dGVyIHN5bnRoZXRpYyAudHJpZ2dlcigpZWQgZXZlbnRcblx0XHRcdFx0aWYgKCAhc2F2ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBhcmd1bWVudHMgZm9yIHVzZSB3aGVuIGhhbmRsaW5nIHRoZSBpbm5lciBuYXRpdmUgZXZlbnRcblx0XHRcdFx0XHQvLyBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKGFuIGV2ZW50IG9iamVjdCksIHNvIHRoaXMgYXJyYXlcblx0XHRcdFx0XHQvLyB3aWxsIG5vdCBiZSBjb25mdXNlZCB3aXRoIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3QuXG5cdFx0XHRcdFx0c2F2ZWQgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIHNhdmVkICk7XG5cblx0XHRcdFx0XHQvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnQgYW5kIGNhcHR1cmUgaXRzIHJlc3VsdFxuXHRcdFx0XHRcdHRoaXNbIHR5cGUgXSgpO1xuXHRcdFx0XHRcdHJlc3VsdCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgZmFsc2UgKTtcblxuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBvdXRlciBzeW50aGV0aWMgZXZlbnRcblx0XHRcdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgZm9yIGFuIGV2ZW50IHdpdGggYSBidWJibGluZyBzdXJyb2dhdGVcblx0XHRcdFx0Ly8gKGZvY3VzIG9yIGJsdXIpLCBhc3N1bWUgdGhhdCB0aGUgc3Vycm9nYXRlIGFscmVhZHkgcHJvcGFnYXRlZCBmcm9tIHRyaWdnZXJpbmdcblx0XHRcdFx0Ly8gdGhlIG5hdGl2ZSBldmVudCBhbmQgcHJldmVudCB0aGF0IGZyb20gaGFwcGVuaW5nIGFnYWluIGhlcmUuXG5cdFx0XHRcdC8vIFRoaXMgdGVjaG5pY2FsbHkgZ2V0cyB0aGUgb3JkZXJpbmcgd3Jvbmcgdy5yLnQuIHRvIGAudHJpZ2dlcigpYCAoaW4gd2hpY2ggdGhlXG5cdFx0XHRcdC8vIGJ1YmJsaW5nIHN1cnJvZ2F0ZSBwcm9wYWdhdGVzICphZnRlciogdGhlIG5vbi1idWJibGluZyBiYXNlKSwgYnV0IHRoYXQgc2VlbXNcblx0XHRcdFx0Ly8gbGVzcyBiYWQgdGhhbiBkdXBsaWNhdGlvbi5cblx0XHRcdFx0fSBlbHNlIGlmICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9ICkuZGVsZWdhdGVUeXBlICkge1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBuYXRpdmUgZXZlbnQgdHJpZ2dlcmVkIGFib3ZlLCBldmVyeXRoaW5nIGlzIG5vdyBpbiBvcmRlclxuXHRcdFx0Ly8gRmlyZSBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgd2l0aCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBzYXZlZCApIHtcblxuXHRcdFx0XHQvLyAuLi5hbmQgY2FwdHVyZSB0aGUgcmVzdWx0XG5cdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoXG5cdFx0XHRcdFx0c2F2ZWRbIDAgXSxcblx0XHRcdFx0XHRzYXZlZC5zbGljZSggMSApLFxuXHRcdFx0XHRcdHRoaXNcblx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdC8vIEFib3J0IGhhbmRsaW5nIG9mIHRoZSBuYXRpdmUgZXZlbnQgYnkgYWxsIGpRdWVyeSBoYW5kbGVycyB3aGlsZSBhbGxvd2luZ1xuXHRcdFx0XHQvLyBuYXRpdmUgaGFuZGxlcnMgb24gdGhlIHNhbWUgZWxlbWVudCB0byBydW4uIE9uIHRhcmdldCwgdGhpcyBpcyBhY2hpZXZlZFxuXHRcdFx0XHQvLyBieSBzdG9wcGluZyBpbW1lZGlhdGUgcHJvcGFnYXRpb24ganVzdCBvbiB0aGUgalF1ZXJ5IGV2ZW50LiBIb3dldmVyLFxuXHRcdFx0XHQvLyB0aGUgbmF0aXZlIGV2ZW50IGlzIHJlLXdyYXBwZWQgYnkgYSBqUXVlcnkgb25lIG9uIGVhY2ggbGV2ZWwgb2YgdGhlXG5cdFx0XHRcdC8vIHByb3BhZ2F0aW9uIHNvIHRoZSBvbmx5IHdheSB0byBzdG9wIGl0IGZvciBqUXVlcnkgaXMgdG8gc3RvcCBpdCBmb3Jcblx0XHRcdFx0Ly8gZXZlcnlvbmUgdmlhIG5hdGl2ZSBgc3RvcFByb3BhZ2F0aW9uKClgLiBUaGlzIGlzIG5vdCBhIHByb2JsZW0gZm9yXG5cdFx0XHRcdC8vIGZvY3VzL2JsdXIgd2hpY2ggZG9uJ3QgYnViYmxlLCBidXQgaXQgZG9lcyBhbHNvIHN0b3AgY2xpY2sgb24gY2hlY2tib3hlc1xuXHRcdFx0XHQvLyBhbmQgcmFkaW9zLiBXZSBhY2NlcHQgdGhpcyBsaW1pdGF0aW9uLlxuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0ZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcblx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblxuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50ICkgKSB7XG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIEV2ZW50IG9iamVjdFxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcblx0XHR0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7XG5cdFx0dGhpcy50eXBlID0gc3JjLnR5cGU7XG5cblx0XHQvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuXHRcdC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHxcblx0XHRcdFx0c3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seVxuXHRcdFx0XHRzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlID9cblx0XHRcdHJldHVyblRydWUgOlxuXHRcdFx0cmV0dXJuRmFsc2U7XG5cblx0XHQvLyBDcmVhdGUgdGFyZ2V0IHByb3BlcnRpZXNcblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgPD02IC0gNyBvbmx5XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKHRyYWMtNTA0LCB0cmFjLTEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y29kZTogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cdHdoaWNoOiB0cnVlXG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG5qUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggdHlwZSwgZGVsZWdhdGVUeXBlICkge1xuXG5cdGZ1bmN0aW9uIGZvY3VzTWFwcGVkSGFuZGxlciggbmF0aXZlRXZlbnQgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExK1xuXHRcdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGZvY3VzaW4vZm9jdXNvdXQgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50c1xuXHRcdFx0Ly8gZm9jdXMvYmx1ci4gVGhpcyBpcyBiZWNhdXNlIHRoZSBmb3JtZXIgYXJlIHN5bmNocm9ub3VzIGluIElFIHdoaWxlIHRoZSBsYXR0ZXJcblx0XHRcdC8vIGFyZSBhc3luYy4gSW4gb3RoZXIgYnJvd3NlcnMsIGFsbCB0aG9zZSBoYW5kbGVycyBhcmUgaW52b2tlZCBzeW5jaHJvbm91c2x5LlxuXG5cdFx0XHQvLyBgaGFuZGxlYCBmcm9tIHByaXZhdGUgZGF0YSB3b3VsZCBhbHJlYWR5IHdyYXAgdGhlIGV2ZW50LCBidXQgd2UgbmVlZFxuXHRcdFx0Ly8gdG8gY2hhbmdlIHRoZSBgdHlwZWAgaGVyZS5cblx0XHRcdHZhciBoYW5kbGUgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiaGFuZGxlXCIgKSxcblx0XHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApO1xuXHRcdFx0ZXZlbnQudHlwZSA9IG5hdGl2ZUV2ZW50LnR5cGUgPT09IFwiZm9jdXNpblwiID8gXCJmb2N1c1wiIDogXCJibHVyXCI7XG5cdFx0XHRldmVudC5pc1NpbXVsYXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIEZpcnN0LCBoYW5kbGUgZm9jdXNpbi9mb2N1c291dFxuXHRcdFx0aGFuZGxlKCBuYXRpdmVFdmVudCApO1xuXG5cdFx0XHQvLyAuLi50aGVuLCBoYW5kbGUgZm9jdXMvYmx1clxuXHRcdFx0Ly9cblx0XHRcdC8vIGZvY3VzL2JsdXIgZG9uJ3QgYnViYmxlIHdoaWxlIGZvY3VzaW4vZm9jdXNvdXQgZG87IHNpbXVsYXRlIHRoZSBmb3JtZXIgYnkgb25seVxuXHRcdFx0Ly8gaW52b2tpbmcgdGhlIGhhbmRsZXIgYXQgdGhlIGxvd2VyIGxldmVsLlxuXHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIHNldHVwIHBhcnQgY2FsbHMgYGxldmVyYWdlTmF0aXZlYCwgd2hpY2gsIGluIHR1cm4sIGNhbGxzXG5cdFx0XHRcdC8vIGBqUXVlcnkuZXZlbnQuYWRkYCwgc28gZXZlbnQgaGFuZGxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gc2V0XG5cdFx0XHRcdC8vIGJ5IHRoaXMgcG9pbnQuXG5cdFx0XHRcdGhhbmRsZSggZXZlbnQgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3Igbm9uLUlFIGJyb3dzZXJzLCBhdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50XG5cdFx0XHQvLyB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQuXG5cdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGRlbGVnYXRlVHlwZSwgbmF0aXZlRXZlbnQudGFyZ2V0LFxuXHRcdFx0XHRqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApICk7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSA9IHtcblxuXHRcdC8vIFV0aWxpemUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0dmFyIGF0dGFjaGVzO1xuXG5cdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImZvY3VzXCIsIC4uLiApXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiYmx1clwiLCAuLi4gKVxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUsIHRydWUgKTtcblxuXHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExK1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIHNhbWUgbmF0aXZlIGhhbmRsZXIgZm9yIGZvY3VzaW4gJiBmb2N1cyAoYW5kIGZvY3Vzb3V0ICYgYmx1cilcblx0XHRcdFx0Ly8gc28gd2UgbmVlZCB0byBjb29yZGluYXRlIHNldHVwICYgdGVhcmRvd24gcGFydHMgYmV0d2VlbiB0aG9zZSBldmVudHMuXG5cdFx0XHRcdC8vIFVzZSBgZGVsZWdhdGVUeXBlYCBhcyB0aGUga2V5IGFzIGB0eXBlYCBpcyBhbHJlYWR5IHVzZWQgYnkgYGxldmVyYWdlTmF0aXZlYC5cblx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIGRlbGVnYXRlVHlwZSApO1xuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIGRlbGVnYXRlVHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBkZWxlZ2F0ZVR5cGUsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJcblx0XHRcdGxldmVyYWdlTmF0aXZlKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdC8vIFJldHVybiBub24tZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGV2ZW50LXBhdGggcHJvcGFnYXRpb25cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgYXR0YWNoZXM7XG5cblx0XHRcdGlmICggZG9jdW1lbnQuZG9jdW1lbnRNb2RlICkge1xuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggdGhpcywgZGVsZWdhdGVUeXBlICkgLSAxO1xuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGRlbGVnYXRlVHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCB0aGlzLCBkZWxlZ2F0ZVR5cGUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIGRlbGVnYXRlVHlwZSwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgc3RhbmRhcmQgdGVhcmRvd24gc2hvdWxkIGJlIGFwcGxpZWRcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBTdXBwcmVzcyBuYXRpdmUgZm9jdXMgb3IgYmx1ciBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlXG5cdFx0Ly8gYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGV2ZW50LnRhcmdldCwgdHlwZSApO1xuXHRcdH0sXG5cblx0XHRkZWxlZ2F0ZVR5cGU6IGRlbGVnYXRlVHlwZVxuXHR9O1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuXHQvLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG5cdC8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3Nzg3XG5cdC8vXG5cdC8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuXHQvLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcblx0Ly8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG5cdC8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5cdC8vXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0Ly8gVG8gcHJlc2VydmUgcmVsYXRpdmUgZm9jdXNpbi9mb2N1cyAmIGZvY3Vzb3V0L2JsdXIgZXZlbnQgb3JkZXIgZ3VhcmFudGVlZCBvbiB0aGUgMy54IGJyYW5jaCxcblx0Ly8gYXR0YWNoIGEgc2luZ2xlIGhhbmRsZXIgZm9yIGJvdGggZXZlbnRzIGluIElFLlxuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZGVsZWdhdGVUeXBlIF0gPSB7XG5cdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBIYW5kbGU6IHJlZ3VsYXIgbm9kZXMgKHZpYSBgdGhpcy5vd25lckRvY3VtZW50YCksIHdpbmRvd1xuXHRcdFx0Ly8gKHZpYSBgdGhpcy5kb2N1bWVudGApICYgZG9jdW1lbnQgKHZpYSBgdGhpc2ApLlxuXHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdGRhdGFIb2xkZXIgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyB0aGlzIDogZG9jLFxuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0XHRcdC8vIFdlIHVzZSB0aGUgc2FtZSBuYXRpdmUgaGFuZGxlciBmb3IgZm9jdXNpbiAmIGZvY3VzIChhbmQgZm9jdXNvdXQgJiBibHVyKVxuXHRcdFx0Ly8gc28gd2UgbmVlZCB0byBjb29yZGluYXRlIHNldHVwICYgdGVhcmRvd24gcGFydHMgYmV0d2VlbiB0aG9zZSBldmVudHMuXG5cdFx0XHQvLyBVc2UgYGRlbGVnYXRlVHlwZWAgYXMgdGhlIGtleSBhcyBgdHlwZWAgaXMgYWxyZWFkeSB1c2VkIGJ5IGBsZXZlcmFnZU5hdGl2ZWAuXG5cdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5hZGRFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRvYy5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBmb2N1c01hcHBlZEhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YVByaXYuc2V0KCBkYXRhSG9sZGVyLCBkZWxlZ2F0ZVR5cGUsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdH0sXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdGRhdGFIb2xkZXIgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyB0aGlzIDogZG9jLFxuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlICkgLSAxO1xuXG5cdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBmb2N1c01hcHBlZEhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRhdGFIb2xkZXIsIGRlbGVnYXRlVHlwZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCBkYXRhSG9sZGVyLCBkZWxlZ2F0ZVR5cGUsIGF0dGFjaGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufSApO1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7XG5cdH0sXG5cdG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7XG5cdFx0dmFyIGhhbmRsZU9iaiwgdHlwZTtcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcblxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDpcblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUsXG5cdFx0XHRcdGhhbmRsZU9iai5zZWxlY3Rvcixcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbnZhclxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHlcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8IVxcW0NEQVRBXFxbfFxcXVxcXT5cXHMqJC9nO1xuXG4vLyBQcmVmZXIgYSB0Ym9keSBvdmVyIGl0cyBwYXJlbnQgdGFibGUgZm9yIGNvbnRhaW5pbmcgbmV3IHJvd3NcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSApIHtcblxuXHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggXCJ0Ym9keVwiIClbIDAgXSB8fCBlbGVtO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdGlmICggKCBlbGVtLnR5cGUgfHwgXCJcIiApLnNsaWNlKCAwLCA1ICkgPT09IFwidHJ1ZS9cIiApIHtcblx0XHRlbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuZ2V0KCBzcmMgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZGVzdCwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGZsYXQoIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAodHJhYy04MDcwKS5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHQvLyBSZS1lbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCBcIlwiICkudG9Mb3dlckNhc2UoKSAgIT09IFwibW9kdWxlXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgJiYgIW5vZGUubm9Nb2R1bGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYywge1xuXHRcdFx0XHRcdFx0XHRcdFx0bm9uY2U6IG5vZGUubm9uY2UgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoIFwibm9uY2VcIiApXG5cdFx0XHRcdFx0XHRcdFx0fSwgZG9jICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVW53cmFwIGEgQ0RBVEEgc2VjdGlvbiBjb250YWluaW5nIHNjcmlwdCBjb250ZW50cy4gVGhpcyBzaG91bGRuJ3QgYmVcblx0XHRcdFx0XHRcdFx0Ly8gbmVlZGVkIGFzIGluIFhNTCBkb2N1bWVudHMgdGhleSdyZSBhbHJlYWR5IG5vdCB2aXNpYmxlIHdoZW5cblx0XHRcdFx0XHRcdFx0Ly8gaW5zcGVjdGluZyBlbGVtZW50IGNvbnRlbnRzIGFuZCBpbiBIVE1MIGRvY3VtZW50cyB0aGV5IGhhdmUgbm9cblx0XHRcdFx0XHRcdFx0Ly8gbWVhbmluZyBidXQgd2UncmUgcHJlc2VydmluZyB0aGF0IGxvZ2ljIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgY29tcGxldGVseSBpbiA0LjAuIFNlZSBnaC00OTA0LlxuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBub2RlLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGlzQXR0YWNoZWQoIG5vZGUgKSApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdH1cblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHJldHVybiBodG1sO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBpc0F0dGFjaGVkKCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IGpRdWVyeSNmaW5kIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6XG5cdFx0XHQvLyBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciByY3VzdG9tUHJvcCA9IC9eLS0vO1xuXG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICh0cmFjLTE1MDk4LCB0cmFjLTE0MTUwKVxuXHRcdC8vIElFIHRocm93cyBvbiBlbGVtZW50cyBjcmVhdGVkIGluIHBvcHVwc1xuXHRcdC8vIEZGIG1lYW53aGlsZSB0aHJvd3Mgb24gZnJhbWUgZWxlbWVudHMgdGhyb3VnaCBcImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGVcIlxuXHRcdHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXG5cdFx0aWYgKCAhdmlldyB8fCAhdmlldy5vcGVuZXIgKSB7XG5cdFx0XHR2aWV3ID0gd2luZG93O1xuXHRcdH1cblxuXHRcdHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTtcblx0fTtcblxudmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5jYWxsKCBlbGVtICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD02NFxuXHRcdC8vIERvbid0IGdldCB0cmlja2VkIHdoZW4gem9vbSBhZmZlY3RzIG9mZnNldFdpZHRoIChnaC00MDI5KVxuXHRcdGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRzY3JvbGxib3hTaXplVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXYub2Zmc2V0V2lkdGggLyAzICkgPT09IDEyO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsLCByZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBTdHlsZSBvZiBjbG9uZWQgZWxlbWVudCBhZmZlY3RzIHNvdXJjZSBlbGVtZW50IGNsb25lZCAodHJhYy04OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7XG5cdFx0fSxcblx0XHRwaXhlbEJveFN0eWxlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRzY3JvbGxib3hTaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDtcblx0XHR9LFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gQmVoYXZpb3IgaW4gSUUgOSBpcyBtb3JlIHN1YnRsZSB0aGFuIGluIG5ld2VyIHZlcnNpb25zICYgaXQgcGFzc2VzXG5cdFx0Ly8gc29tZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3Q7IG1ha2Ugc3VyZSBub3QgdG8gbWFrZSBpdCBwYXNzIHRoZXJlIVxuXHRcdC8vXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA3MCtcblx0XHQvLyBPbmx5IEZpcmVmb3ggaW5jbHVkZXMgYm9yZGVyIHdpZHRoc1xuXHRcdC8vIGluIGNvbXB1dGVkIGRpbWVuc2lvbnMuIChnaC00NTI5KVxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0YWJsZSwgdHIsIHRyQ2hpbGQsIHRyU3R5bGU7XG5cdFx0XHRpZiAoIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0YWJsZVwiICk7XG5cdFx0XHRcdHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0clwiICk7XG5cdFx0XHRcdHRyQ2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0XHRcdFx0dGFibGUuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGVcIjtcblx0XHRcdFx0dHIuc3R5bGUuY3NzVGV4dCA9IFwiYm94LXNpemluZzpjb250ZW50LWJveDtib3JkZXI6MXB4IHNvbGlkXCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDg2K1xuXHRcdFx0XHQvLyBIZWlnaHQgc2V0IHRocm91Z2ggY3NzVGV4dCBkb2VzIG5vdCBnZXQgYXBwbGllZC5cblx0XHRcdFx0Ly8gQ29tcHV0ZWQgaGVpZ2h0IHRoZW4gY29tZXMgYmFjayBhcyAwLlxuXHRcdFx0XHR0ci5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuXHRcdFx0XHR0ckNoaWxkLnN0eWxlLmhlaWdodCA9IFwiOXB4XCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA4IENocm9tZSA4Nitcblx0XHRcdFx0Ly8gSW4gb3VyIGJvZHlCYWNrZ3JvdW5kLmh0bWwgaWZyYW1lLFxuXHRcdFx0XHQvLyBkaXNwbGF5IGZvciBhbGwgZGl2IGVsZW1lbnRzIGlzIHNldCB0byBcImlubGluZVwiLFxuXHRcdFx0XHQvLyB3aGljaCBjYXVzZXMgYSBwcm9ibGVtIG9ubHkgaW4gQW5kcm9pZCA4IENocm9tZSA4Ni5cblx0XHRcdFx0Ly8gRW5zdXJpbmcgdGhlIGRpdiBpcyBgZGlzcGxheTogYmxvY2tgXG5cdFx0XHRcdC8vIGdldHMgYXJvdW5kIHRoaXMgaXNzdWUuXG5cdFx0XHRcdHRyQ2hpbGQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuXHRcdFx0XHRkb2N1bWVudEVsZW1lbnRcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRhYmxlIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyQ2hpbGQgKTtcblxuXHRcdFx0XHR0clN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIHRyICk7XG5cdFx0XHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID0gKCBwYXJzZUludCggdHJTdHlsZS5oZWlnaHQsIDEwICkgK1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0clN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCApICtcblx0XHRcdFx0XHRwYXJzZUludCggdHJTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTAgKSApID09PSB0ci5vZmZzZXRIZWlnaHQ7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCB0YWJsZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDUxK1xuXHRcdC8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3dcblx0XHQvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzXG5cdFx0Ly8gb24gZGV0YWNoZWQgZWxlbWVudHNcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6XG5cdC8vICAgLmNzcygnZmlsdGVyJykgKElFIDkgb25seSwgdHJhYy0xMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoZ2gtMzE0NClcblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuXHRcdC8vIElFIG9ubHkgc3VwcG9ydHMgYFwiZmxvYXRcImAgaW4gYGdldFByb3BlcnR5VmFsdWVgOyBpbiBjb21wdXRlZCBzdHlsZXNcblx0XHQvLyBpdCdzIG9ubHkgYXZhaWxhYmxlIGFzIGBcImNzc0Zsb2F0XCJgLiBXZSBubyBsb25nZXIgbW9kaWZ5IHByb3BlcnRpZXNcblx0XHQvLyBzZW50IHRvIGAuY3NzKClgIGFwYXJ0IGZyb20gY2FtZWxDYXNpbmcsIHNvIHdlIG5lZWQgdG8gY2hlY2sgYm90aC5cblx0XHQvLyBOb3JtYWxseSwgdGhpcyB3b3VsZCBjcmVhdGUgZGlmZmVyZW5jZSBpbiBiZWhhdmlvcjogaWZcblx0XHQvLyBgZ2V0UHJvcGVydHlWYWx1ZWAgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHRoZSB2YWx1ZSByZXR1cm5lZFxuXHRcdC8vIGJ5IGAuY3NzKClgIHdvdWxkIGJlIGB1bmRlZmluZWRgLiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2UgZm9yXG5cdFx0Ly8gZGlzY29ubmVjdGVkIGVsZW1lbnRzLiBIb3dldmVyLCBpbiBJRSBldmVuIGRpc2Nvbm5lY3RlZCBlbGVtZW50c1xuXHRcdC8vIHdpdGggbm8gc3R5bGVzIHJldHVybiBgXCJub25lXCJgIGZvciBgZ2V0UHJvcGVydHlWYWx1ZSggXCJmbG9hdFwiIClgXG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cblx0XHRpZiAoIGlzQ3VzdG9tUHJvcCAmJiByZXQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMTA1KywgQ2hyb21lIDw9MTA1K1xuXHRcdFx0Ly8gU3BlYyByZXF1aXJlcyB0cmltbWluZyB3aGl0ZXNwYWNlIGZvciBjdXN0b20gcHJvcGVydGllcyAoZ2gtNDkyNikuXG5cdFx0XHQvLyBGaXJlZm94IG9ubHkgdHJpbXMgbGVhZGluZyB3aGl0ZXNwYWNlLiBDaHJvbWUganVzdCBjb2xsYXBzZXNcblx0XHRcdC8vIGJvdGggbGVhZGluZyAmIHRyYWlsaW5nIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gRmFsbCBiYWNrIHRvIGB1bmRlZmluZWRgIGlmIGVtcHR5IHN0cmluZyByZXR1cm5lZC5cblx0XHRcdC8vIFRoaXMgY29sbGFwc2VzIGEgbWlzc2luZyBkZWZpbml0aW9uIHdpdGggcHJvcGVydHkgZGVmaW5lZFxuXHRcdFx0Ly8gYW5kIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgYnV0IHRoZXJlJ3Mgbm8gc3RhbmRhcmQgQVBJXG5cdFx0XHQvLyBhbGxvd2luZyB1cyB0byBkaWZmZXJlbnRpYXRlIHRoZW0gd2l0aG91dCBhIHBlcmZvcm1hbmNlIHBlbmFsdHlcblx0XHRcdC8vIGFuZCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgYWxpZ25zIHdpdGggb2xkZXIgalF1ZXJ5LlxuXHRcdFx0Ly9cblx0XHRcdC8vIHJ0cmltQ1NTIHRyZWF0cyBVKzAwMEQgQ0FSUklBR0UgUkVUVVJOIGFuZCBVKzAwMEMgRk9STSBGRUVEXG5cdFx0XHQvLyBhcyB3aGl0ZXNwYWNlIHdoaWxlIENTUyBkb2VzIG5vdCwgYnV0IHRoaXMgaXMgbm90IGEgcHJvYmxlbVxuXHRcdFx0Ly8gYmVjYXVzZSBDU1MgcHJlcHJvY2Vzc2luZyByZXBsYWNlcyB0aGVtIHdpdGggVSswMDBBIExJTkUgRkVFRFxuXHRcdFx0Ly8gKHdoaWNoICppcyogQ1NTIHdoaXRlc3BhY2UpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNpbnB1dC1wcmVwcm9jZXNzaW5nXG5cdFx0XHRyZXQgPSByZXQucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApIHx8IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhaXNBdHRhY2hlZCggZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIHNvbWUgdmFsdWVzLFxuXHRcdC8vIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMuXG5cdFx0Ly8gVGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOlxuXHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbEJveFN0eWxlcygpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiByYm94U3R5bGUudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXIgY3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlLFxuXHR2ZW5kb3JQcm9wcyA9IHt9O1xuXG4vLyBSZXR1cm4gYSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgb3IgdW5kZWZpbmVkXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcG90ZW50aWFsbHktbWFwcGVkIGpRdWVyeS5jc3NQcm9wcyBvciB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciBmaW5hbCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IHZlbmRvclByb3BzWyBuYW1lIF07XG5cblx0aWYgKCBmaW5hbCApIHtcblx0XHRyZXR1cm4gZmluYWw7XG5cdH1cblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblx0cmV0dXJuIHZlbmRvclByb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH07XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBfZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgYm94LCBpc0JvcmRlckJveCwgc3R5bGVzLCBjb21wdXRlZFZhbCApIHtcblx0dmFyIGkgPSBkaW1lbnNpb24gPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXHRcdGV4dHJhID0gMCxcblx0XHRkZWx0YSA9IDAsXG5cdFx0bWFyZ2luRGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdC8vIENvdW50IG1hcmdpbiBkZWx0YSBzZXBhcmF0ZWx5IHRvIG9ubHkgYWRkIGl0IGFmdGVyIHNjcm9sbCBndXR0ZXIgYWRqdXN0bWVudC5cblx0XHQvLyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIG5lZ2F0aXZlIG1hcmdpbnMgd29yayB3aXRoIGBvdXRlckhlaWdodCggdHJ1ZSApYCAoZ2gtMzk4MikuXG5cdFx0aWYgKCBib3ggPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRtYXJnaW5EZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGNvbnRlbnQtYm94LCB3ZSdyZSBzZWVraW5nIFwicGFkZGluZ1wiIG9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIlxuXHRcdGlmICggIWlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBBZGQgcGFkZGluZ1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEZvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCIsIGFkZCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQnV0IHN0aWxsIGtlZXAgdHJhY2sgb2YgaXQgb3RoZXJ3aXNlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRyYSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGJvcmRlci1ib3ggKGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyKSwgd2UncmUgc2Vla2luZyBcImNvbnRlbnRcIiBvclxuXHRcdC8vIFwicGFkZGluZ1wiIG9yIFwibWFyZ2luXCJcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIsIHN1YnRyYWN0IHBhZGRpbmdcblx0XHRcdGlmICggYm94ID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiBvciBcInBhZGRpbmdcIiwgc3VidHJhY3QgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBY2NvdW50IGZvciBwb3NpdGl2ZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyIHdoZW4gcmVxdWVzdGVkIGJ5IHByb3ZpZGluZyBjb21wdXRlZFZhbFxuXHRpZiAoICFpc0JvcmRlckJveCAmJiBjb21wdXRlZFZhbCA+PSAwICkge1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIGEgcm91bmRlZCBzdW0gb2YgY29udGVudCwgcGFkZGluZywgc2Nyb2xsIGd1dHRlciwgYW5kIGJvcmRlclxuXHRcdC8vIEFzc3VtaW5nIGludGVnZXIgc2Nyb2xsIGd1dHRlciwgc3VidHJhY3QgdGhlIHJlc3QgYW5kIHJvdW5kIGRvd25cblx0XHRkZWx0YSArPSBNYXRoLm1heCggMCwgTWF0aC5jZWlsKFxuXHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdGNvbXB1dGVkVmFsIC1cblx0XHRcdGRlbHRhIC1cblx0XHRcdGV4dHJhIC1cblx0XHRcdDAuNVxuXG5cdFx0Ly8gSWYgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIHVua25vd24sIHRoZW4gd2UgY2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXJcblx0XHQvLyBVc2UgYW4gZXhwbGljaXQgemVybyB0byBhdm9pZCBOYU4gKGdoLTM5NjQpXG5cdFx0KSApIHx8IDA7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGEgKyBtYXJnaW5EZWx0YTtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIGNvbXB1dGVkIHN0eWxlXG5cdHZhciBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTQzMjIpLlxuXHRcdC8vIEZha2UgY29udGVudC1ib3ggdW50aWwgd2Uga25vdyBpdCdzIG5lZWRlZCB0byBrbm93IHRoZSB0cnVlIHZhbHVlLlxuXHRcdGJveFNpemluZ05lZWRlZCA9ICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgZXh0cmEsXG5cdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94LFxuXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdG9mZnNldFByb3AgPSBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApO1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHQvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS5cblx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0aWYgKCAhZXh0cmEgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblx0XHR2YWwgPSBcImF1dG9cIjtcblx0fVxuXG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gVXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3Igd2hlbiBib3ggc2l6aW5nIGlzIHVucmVsaWFibGUuXG5cdC8vIEluIHRob3NlIGNhc2VzLCB0aGUgY29tcHV0ZWQgdmFsdWUgY2FuIGJlIHRydXN0ZWQgdG8gYmUgYm9yZGVyLWJveC5cblx0aWYgKCAoICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgJiYgaXNCb3JkZXJCb3ggfHxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDEwIC0gMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBtaXNyZXBvcnQgYGdldENvbXB1dGVkU3R5bGVgIG9mIHRhYmxlIHJvd3Mgd2l0aCB3aWR0aC9oZWlnaHRcblx0XHQvLyBzZXQgaW4gQ1NTIHdoaWxlIGBvZmZzZXQqYCBwcm9wZXJ0aWVzIHJlcG9ydCBjb3JyZWN0IHZhbHVlcy5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBpbiBzb21lIGNhc2VzIElFIDkgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGlzIGlzc3VlLlxuXHRcdCFzdXBwb3J0LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkgJiYgbm9kZU5hbWUoIGVsZW0sIFwidHJcIiApIHx8XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0XHQvLyBUaGlzIGhhcHBlbnMgZm9yIGlubGluZSBlbGVtZW50cyB3aXRoIG5vIGV4cGxpY2l0IHNldHRpbmcgKGdoLTM1NzEpXG5cdFx0dmFsID09PSBcImF1dG9cIiB8fFxuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSAtIDQuMyBvbmx5XG5cdFx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0XHQhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJpbmxpbmVcIiApICYmXG5cblx0XHQvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSAmIGNvbm5lY3RlZFxuXHRcdGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0XHQvLyBXaGVyZSBhdmFpbGFibGUsIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBhcHByb3hpbWF0ZSBib3JkZXIgYm94IGRpbWVuc2lvbnMuXG5cdFx0Ly8gV2hlcmUgbm90IGF2YWlsYWJsZSAoZS5nLiwgU1ZHKSwgYXNzdW1lIHVucmVsaWFibGUgYm94LXNpemluZyBhbmQgaW50ZXJwcmV0IHRoZVxuXHRcdC8vIHJldHJpZXZlZCB2YWx1ZSBhcyBhIGNvbnRlbnQgYm94IGRpbWVuc2lvbi5cblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gb2Zmc2V0UHJvcCBpbiBlbGVtO1xuXHRcdGlmICggdmFsdWVJc0JvcmRlckJveCApIHtcblx0XHRcdHZhbCA9IGVsZW1bIG9mZnNldFByb3AgXTtcblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgXCJcIiBhbmQgYXV0b1xuXHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXG5cdC8vIEFkanVzdCBmb3IgdGhlIGVsZW1lbnQncyBib3ggbW9kZWxcblx0cmV0dXJuICggdmFsICtcblx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRlbGVtLFxuXHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlcyxcblxuXHRcdFx0Ly8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSlcblx0XHRcdHZhbFxuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdFxuXHQvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHlcblx0Y3NzSG9va3M6IHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XG5cdFx0XHRcdFx0dmFyIHJldCA9IGN1ckNTUyggZWxlbSwgXCJvcGFjaXR5XCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmV0ID09PSBcIlwiID8gXCIxXCIgOiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgXCJweFwiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXNcblx0Y3NzTnVtYmVyOiB7XG5cdFx0YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG5cdFx0YXNwZWN0UmF0aW86IHRydWUsXG5cdFx0Ym9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcblx0XHRjb2x1bW5Db3VudDogdHJ1ZSxcblx0XHRmbGV4R3JvdzogdHJ1ZSxcblx0XHRmbGV4U2hyaW5rOiB0cnVlLFxuXHRcdGZvbnRXZWlnaHQ6IHRydWUsXG5cdFx0Z3JpZEFyZWE6IHRydWUsXG5cdFx0Z3JpZENvbHVtbjogdHJ1ZSxcblx0XHRncmlkQ29sdW1uRW5kOiB0cnVlLFxuXHRcdGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcblx0XHRncmlkUm93OiB0cnVlLFxuXHRcdGdyaWRSb3dFbmQ6IHRydWUsXG5cdFx0Z3JpZFJvd1N0YXJ0OiB0cnVlLFxuXHRcdGxpbmVIZWlnaHQ6IHRydWUsXG5cdFx0b3BhY2l0eTogdHJ1ZSxcblx0XHRvcmRlcjogdHJ1ZSxcblx0XHRvcnBoYW5zOiB0cnVlLFxuXHRcdHNjYWxlOiB0cnVlLFxuXHRcdHdpZG93czogdHJ1ZSxcblx0XHR6SW5kZXg6IHRydWUsXG5cdFx0em9vbTogdHJ1ZSxcblxuXHRcdC8vIFNWRy1yZWxhdGVkXG5cdFx0ZmlsbE9wYWNpdHk6IHRydWUsXG5cdFx0Zmxvb2RPcGFjaXR5OiB0cnVlLFxuXHRcdHN0b3BPcGFjaXR5OiB0cnVlLFxuXHRcdHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG5cdFx0c3Ryb2tlT3BhY2l0eTogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge30sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBxdWVyeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAodHJhYy03MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgdHJhYy05MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKHRyYWMtNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHQvLyBUaGUgaXNDdXN0b21Qcm9wIGNoZWNrIGNhbiBiZSByZW1vdmVkIGluIGpRdWVyeSA0LjAgd2hlbiB3ZSBvbmx5IGF1dG8tYXBwZW5kXG5cdFx0XHQvLyBcInB4XCIgdG8gYSBmZXcgaGFyZGNvZGVkIHZhbHVlcy5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiAmJiAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHRcdHN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBtb2RpZnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBfaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXG5cdFx0XHRcdC8vIE9ubHkgcmVhZCBzdHlsZXMucG9zaXRpb24gaWYgdGhlIHRlc3QgaGFzIGEgY2hhbmNlIHRvIGZhaWxcblx0XHRcdFx0Ly8gdG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdy5cblx0XHRcdFx0c2Nyb2xsYm94U2l6ZUJ1Z2d5ID0gIXN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpICYmXG5cdFx0XHRcdFx0c3R5bGVzLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIsXG5cblx0XHRcdFx0Ly8gVG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdywgb25seSBmZXRjaCBib3hTaXppbmcgaWYgd2UgbmVlZCBpdCAoZ2gtMzk5MSlcblx0XHRcdFx0Ym94U2l6aW5nTmVlZGVkID0gc2Nyb2xsYm94U2l6ZUJ1Z2d5IHx8IGV4dHJhLFxuXHRcdFx0XHRpc0JvcmRlckJveCA9IGJveFNpemluZ05lZWRlZCAmJlxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdHN1YnRyYWN0ID0gZXh0cmEgP1xuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudChcblx0XHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRcdGlzQm9yZGVyQm94LFxuXHRcdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdFx0KSA6XG5cdFx0XHRcdFx0MDtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdW5yZWxpYWJsZSBib3JkZXItYm94IGRpbWVuc2lvbnMgYnkgY29tcGFyaW5nIG9mZnNldCogdG8gY29tcHV0ZWQgYW5kXG5cdFx0XHQvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KVxuXHRcdFx0aWYgKCBpc0JvcmRlckJveCAmJiBzY3JvbGxib3hTaXplQnVnZ3kgKSB7XG5cdFx0XHRcdHN1YnRyYWN0IC09IE1hdGguY2VpbChcblx0XHRcdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0XHRcdHBhcnNlRmxvYXQoIHN0eWxlc1sgZGltZW5zaW9uIF0gKSAtXG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIFwiYm9yZGVyXCIsIGZhbHNlLCBzdHlsZXMgKSAtXG5cdFx0XHRcdFx0MC41XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1lbnQgaXMgbmVlZGVkXG5cdFx0XHRpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmXG5cdFx0XHRcdCggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApICE9PSBcInB4XCIgKSB7XG5cblx0XHRcdFx0ZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBkaW1lbnNpb24gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCBwcmVmaXggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9XG59ICk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHQ7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpO1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdH0sXG5cdGN1cjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdHJldHVybiBob29rcyAmJiBob29rcy5nZXQgP1xuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyApO1xuXHR9LFxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xuXHRcdHZhciBlYXNlZCxcblx0XHRcdGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdbIHRoaXMuZWFzaW5nIF0oXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XG5cdFx0fVxuXHRcdHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7XG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlO1xuXG5Ud2Vlbi5wcm9wSG9va3MgPSB7XG5cdF9kZWZhdWx0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0XHQvLyBVc2UgYSBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSB3aGVuIGl0IGlzIG5vdCBhIERPTSBlbGVtZW50LFxuXHRcdFx0Ly8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy5cblx0XHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAhPT0gMSB8fFxuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cblx0XHRcdC8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LlxuXHRcdFx0Ly8gVXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlLlxuXHRcdFx0Ly8gVXNlIC5zdHlsZSBpZiBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZS5cblx0XHRcdGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHtcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcblx0XHRcdH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSB8fFxuXHRcdFx0XHRcdHR3ZWVuLmVsZW0uc3R5bGVbIGZpbmFsUHJvcE5hbWUoIHR3ZWVuLnByb3AgKSBdICE9IG51bGwgKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0XHQvLyBUaGUgZmluYWwgc3RlcCBvZiBhIFwiaGlkZVwiIGFuaW1hdGlvbiBpcyBhY3R1YWxseSBoaWRpbmcgdGhlIGVsZW1lbnRcblx0XHRcdFx0aWYgKCAhaGlkZGVuICkge1xuXHRcdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIFBlci1wcm9wZXJ0eSBzZXR1cFxuXHRcdHByb3BUd2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApO1xuXHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0ZGF0YVNob3dbIHByb3AgXSA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRwcm9wVHdlZW4uZW5kID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRwcm9wVHdlZW4uc3RhcnQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICh0cmFjLTEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRyZXN1bHQuc3RvcC5iaW5kKCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7XG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XG5cdH1cblxuXHQvLyBBdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRhbmltYXRpb25cblx0XHQucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcblxuXHRqUXVlcnkuZngudGltZXIoXG5cdFx0alF1ZXJ5LmV4dGVuZCggdGljaywge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcblx0XHRcdHF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZVxuXHRcdH0gKVxuXHQpO1xuXG5cdHJldHVybiBhbmltYXRpb247XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0aXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFpc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHQvLyBHbyB0byB0aGUgZW5kIHN0YXRlIGlmIGZ4IGFyZSBvZmZcblx0aWYgKCBqUXVlcnkuZngub2ZmICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLlxuXHRcdFx0Ly8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaFxuXHRcdFx0Ly8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLlxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBEYXRlLm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gUnVuIHRoZSB0aW1lciBhbmQgc2FmZWx5IHJlbW92ZSBpdCB3aGVuIGRvbmUgKGFsbG93aW5nIGZvciBleHRlcm5hbCByZW1vdmFsKVxuXHRcdGlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkge1xuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhdGltZXJzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZnguc3RvcCgpO1xuXHR9XG5cdGZ4Tm93ID0gdW5kZWZpbmVkO1xufTtcblxualF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkge1xuXHRqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7XG5cdGpRdWVyeS5meC5zdGFydCgpO1xufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCBpblByb2dyZXNzICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluUHJvZ3Jlc3MgPSB0cnVlO1xuXHRzY2hlZHVsZSgpO1xufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aW5Qcm9ncmVzcyA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjMgb25seVxuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE11c3QgYWNjZXNzIHNlbGVjdGVkSW5kZXggdG8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgc2VsZWN0XG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnZhbHVlID0gXCJ0XCI7XG5cdGlucHV0LnR5cGUgPSBcInJhZGlvXCI7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTtcblx0XHR9XG5cblx0XHQvLyBBdHRyaWJ1dGUgaG9va3MgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uXG5cdFx0Ly8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlLFxuXHRcdFx0bG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdGxvd2VyY2FzZU5hbWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSApO1xuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0XHRcdC8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZVxuXHRcdFx0XHQvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXRcblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsICh0cmFjLTEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY3VyLCBjdXJWYWx1ZSwgY2xhc3NOYW1lLCBpLCBmaW5hbFZhbHVlO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzTmFtZXMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0Y3VyID0gdGhpcy5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXNzTmFtZSArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY3VyLCBjdXJWYWx1ZSwgY2xhc3NOYW1lLCBpLCBmaW5hbFZhbHVlO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXR0ciggXCJjbGFzc1wiLCBcIlwiICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NOYW1lcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc05hbWVzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCB0aGlzICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gdGhpcy5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXNzTmFtZSArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhc3NOYW1lICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gc3RyaXBBbmRDb2xsYXBzZSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY2xhc3NOYW1lLCBpLCBzZWxmLFxuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZSxcblx0XHRcdGlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBpc1ZhbGlkVmFsdWUgKSB7XG5cblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpIF07XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIHZhbHVlSXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdGlmICggdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHQvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZ1xuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHlcblx0XHRcdFx0XHQvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAodHJhYy0xNDY4NiwgdHJhYy0xNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0c3RyaXBBbmRDb2xsYXBzZSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbiwgaSxcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCAwICkge1xuXHRcdFx0XHRcdGkgPSBtYXg7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdC8vIElFOC05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKHRyYWMtMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCFvcHRpb24uZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXG5cdFx0XHRcdFx0aWYgKCBvcHRpb24uc2VsZWN0ZWQgPVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbmQtYXNzaWduICovXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXJcbmpRdWVyeS5lYWNoKCBbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSB7IGd1aWQ6IERhdGUubm93KCkgfTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sLCBwYXJzZXJFcnJvckVsZW07XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC5cblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHt9XG5cblx0cGFyc2VyRXJyb3JFbGVtID0geG1sICYmIHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiIClbIDAgXTtcblx0aWYgKCAheG1sIHx8IHBhcnNlckVycm9yRWxlbSApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgKFxuXHRcdFx0cGFyc2VyRXJyb3JFbGVtID9cblx0XHRcdFx0alF1ZXJ5Lm1hcCggcGFyc2VyRXJyb3JFbGVtLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWwudGV4dENvbnRlbnQ7XG5cdFx0XHRcdH0gKS5qb2luKCBcIlxcblwiICkgOlxuXHRcdFx0XHRkYXRhXG5cdFx0KSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0c3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZXZlbnQsIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsIGxhc3RFbGVtZW50LFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPiAtMSApIHtcblxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIFwiLlwiICk7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgJiYgXCJvblwiICsgdHlwZTtcblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xuXHRcdGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0ZXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSBcIm9iamVjdFwiICYmIGV2ZW50ICk7XG5cblx0XHQvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpXG5cdFx0ZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7XG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xuXHRcdGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgP1xuXHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICh0cmFjLTk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICh0cmFjLTk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0bGFzdEVsZW1lbnQgPSBjdXI7XG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKSApWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fFxuXHRcdFx0XHRzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKHRyYWMtNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxudmFyXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiB0b1R5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlT3JGdW5jdGlvbiApIHtcblxuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCB1c2UgaXRzIHJldHVybiB2YWx1ZVxuXHRcdFx0dmFyIHZhbHVlID0gaXNGdW5jdGlvbiggdmFsdWVPckZ1bmN0aW9uICkgP1xuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb24oKSA6XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbjtcblxuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArXG5cdFx0XHRcdGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdH07XG5cblx0aWYgKCBhID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKS5tYXAoIGZ1bmN0aW9uKCBfaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbnZhclxuXHRyMjAgPSAvJTIwL2csXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRyYW50aUNhY2hlID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cblx0Ly8gdHJhYy03NjUzLCB0cmFjLTgxMjUsIHRyYWMtODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxuXHRycHJvdG9jb2wgPSAvXlxcL1xcLy8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAodHJhYy0xMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cbm9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyB0cmFjLTk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdID1cblx0XHRcdFx0XHRcdFx0XHRcdCggcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdIHx8IFtdIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNvbmNhdCggbWF0Y2hbIDIgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaC5qb2luKCBcIiwgXCIgKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICh0cmFjLTEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0IHRyYWMtMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICh0cmFjLTE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gdHJhYy05NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnlcblx0XHRcdFx0ZGVsZXRlIHMuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9yIHVwZGF0ZSBhbnRpLWNhY2hlIHBhcmFtIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSBjYWNoZVVSTC5yZXBsYWNlKCByYW50aUNhY2hlLCBcIiQxXCIgKTtcblx0XHRcdFx0dW5jYWNoZWQgPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgKCBub25jZS5ndWlkKysgKSArXG5cdFx0XHRcdFx0dW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZSBhIG5vb3AgY29udmVydGVyIGZvciBtaXNzaW5nIHNjcmlwdCBidXQgbm90IGlmIGpzb25wXG5cdFx0XHRpZiAoICFpc1N1Y2Nlc3MgJiZcblx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIFwic2NyaXB0XCIsIHMuZGF0YVR5cGVzICkgPiAtMSAmJlxuXHRcdFx0XHRqUXVlcnkuaW5BcnJheSggXCJqc29uXCIsIHMuZGF0YVR5cGVzICkgPCAwICkge1xuXHRcdFx0XHRzLmNvbnZlcnRlcnNbIFwidGV4dCBzY3JpcHRcIiBdID0gZnVuY3Rpb24oKSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggX2ksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHR2YXIgaTtcblx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0aWYgKCBpLnRvTG93ZXJDYXNlKCkgPT09IFwiY29udGVudC10eXBlXCIgKSB7XG5cdFx0XHRzLmNvbnRlbnRUeXBlID0gcy5oZWFkZXJzWyBpIF0gfHwgXCJcIjtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsLCBvcHRpb25zLCBkb2MgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICh0cmFjLTExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cblx0XHQvLyBPbmx5IGV2YWx1YXRlIHRoZSByZXNwb25zZSBpZiBpdCBpcyBzdWNjZXNzZnVsIChnaC00MTI2KVxuXHRcdC8vIGRhdGFGaWx0ZXIgaXMgbm90IGludm9rZWQgZm9yIGZhaWx1cmUgcmVzcG9uc2VzLCBzbyB1c2luZyBpdCBpbnN0ZWFkXG5cdFx0Ly8gb2YgdGhlIGRlZmF1bHQgY29udmVydGVyIGlzIGtsdWRneSBidXQgaXQgd29ya3MuXG5cdFx0Y29udmVydGVyczoge1xuXHRcdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbigpIHt9XG5cdFx0fSxcblx0XHRkYXRhRmlsdGVyOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggcmVzcG9uc2UsIG9wdGlvbnMsIGRvYyApO1xuXHRcdH1cblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyB0cmFjLTE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSB0cmFjLTg2MDUsIHRyYWMtMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vIHRyYWMtMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gb3IgZm9yY2VkLWJ5LWF0dHJzIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiB8fCBzLnNjcmlwdEF0dHJzICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiIClcblx0XHRcdFx0XHQuYXR0ciggcy5zY3JpcHRBdHRycyB8fCB7fSApXG5cdFx0XHRcdFx0LnByb3AoIHsgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LCBzcmM6IHMudXJsIH0gKVxuXHRcdFx0XHRcdC5vbiggXCJsb2FkIGVycm9yXCIsIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZS5ndWlkKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBpc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBTdXBwb3J0OiBTYWZhcmkgOCBvbmx5XG4vLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50XG4vLyBjb2xsYXBzZSBzaWJsaW5nIGZvcm1zOiB0aGUgc2Vjb25kIG9uZSBiZWNvbWVzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IG9uZS5cbi8vIEJlY2F1c2Ugb2YgdGhhdCwgdGhpcyBzZWN1cml0eSBtZWFzdXJlIGhhcyB0byBiZSBkaXNhYmxlZCBpbiBTYWZhcmkgOC5cbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzdcbnN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ID0gKCBmdW5jdGlvbigpIHtcblx0dmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKS5ib2R5O1xuXHRib2R5LmlubmVySFRNTCA9IFwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIjtcblx0cmV0dXJuIGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPT09IDI7XG59ICkoKTtcblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoIHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cblx0dmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0cztcblxuXHRpZiAoICFjb250ZXh0ICkge1xuXG5cdFx0Ly8gU3RvcCBzY3JpcHRzIG9yIGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGltbWVkaWF0ZWx5XG5cdFx0Ly8gYnkgdXNpbmcgZG9jdW1lbnQuaW1wbGVtZW50YXRpb25cblx0XHRpZiAoIHN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ICkge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApO1xuXG5cdFx0XHQvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHNvIGFueSBwYXJzZWQgZWxlbWVudHMgd2l0aCBVUkxzXG5cdFx0XHQvLyBhcmUgYmFzZWQgb24gdGhlIGRvY3VtZW50J3MgVVJMIChnaC0yOTY1KVxuXHRcdFx0YmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJiYXNlXCIgKTtcblx0XHRcdGJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHRjb250ZXh0LmhlYWQuYXBwZW5kQ2hpbGQoIGJhc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50O1xuXHRcdH1cblx0fVxuXG5cdHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApO1xuXHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbIDEgXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBidWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApO1xuXG5cdGlmICggc2NyaXB0cyAmJiBzY3JpcHRzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApO1xufTtcblxuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdG9mZiA9IHVybC5pbmRleE9mKCBcIiBcIiApO1xuXG5cdGlmICggb2ZmID4gLTEgKSB7XG5cdFx0c2VsZWN0b3IgPSBzdHJpcEFuZENvbGxhcHNlKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHQvLyBvZmZzZXQoKSByZWxhdGVzIGFuIGVsZW1lbnQncyBib3JkZXIgYm94IHRvIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHRcdC8vIFByZXNlcnZlIGNoYWluaW5nIGZvciBzZXR0ZXJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciByZWN0LCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gemVyb3MgZm9yIGRpc2Nvbm5lY3RlZCBhbmQgaGlkZGVuIChkaXNwbGF5OiBub25lKSBlbGVtZW50cyAoZ2gtMjMxMClcblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdC8vIEdldCBkb2N1bWVudC1yZWxhdGl2ZSBwb3NpdGlvbiBieSBhZGRpbmcgdmlld3BvcnQgc2Nyb2xsIHRvIHZpZXdwb3J0LXJlbGF0aXZlIGdCQ1Jcblx0XHRyZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG5cdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcblx0XHR9O1xuXHR9LFxuXG5cdC8vIHBvc2l0aW9uKCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgbWFyZ2luIGJveCB0byBpdHMgb2Zmc2V0IHBhcmVudCdzIHBhZGRpbmcgYm94XG5cdC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGJlaGF2aW9yIG9mIENTUyBhYnNvbHV0ZSBwb3NpdGlvbmluZ1xuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwgZG9jLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBwb3NpdGlvbjpmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gdGhlIHZpZXdwb3J0LCB3aGljaCBpdHNlbGYgYWx3YXlzIGhhcyB6ZXJvIG9mZnNldFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblxuXHRcdFx0Ly8gQXNzdW1lIHBvc2l0aW9uOmZpeGVkIGltcGxpZXMgYXZhaWxhYmlsaXR5IG9mIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB0aGUgKnJlYWwqIG9mZnNldCBwYXJlbnQsIHdoaWNoIGNhbiBiZSB0aGUgZG9jdW1lbnQgb3IgaXRzIHJvb3QgZWxlbWVudFxuXHRcdFx0Ly8gd2hlbiBhIHN0YXRpY2FsbHkgcG9zaXRpb25lZCBlbGVtZW50IGlzIGlkZW50aWZpZWRcblx0XHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHRcdG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJlxuXHRcdFx0XHQoIG9mZnNldFBhcmVudCA9PT0gZG9jLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2MuZG9jdW1lbnRFbGVtZW50ICkgJiZcblx0XHRcdFx0alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luXG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IGpRdWVyeSggb2Zmc2V0UGFyZW50ICkub2Zmc2V0KCk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cblx0XHRcdC8vIENvYWxlc2NlIGRvY3VtZW50cyBhbmQgd2luZG93c1xuXHRcdFx0dmFyIHdpbjtcblx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0d2luID0gZWxlbTtcblx0XHRcdH0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgLSA5LjEsIENocm9tZSA8PTM3IC0gNDlcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTg5MzQ3XG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBfaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCgge1xuXHRcdHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsXG5cdFx0Y29udGVudDogdHlwZSxcblx0XHRcIlwiOiBcIm91dGVyXCIgKyBuYW1lXG5cdH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIF9pLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5vbiggXCJtb3VzZWVudGVyXCIsIGZuT3ZlciApXG5cdFx0XHQub24oIFwibW91c2VsZWF2ZVwiLCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaChcblx0KCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblxuXHRcdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdFx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7XG5cdFx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XG5cdFx0fTtcblx0fVxuKTtcblxuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG4vLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcbi8vIFJlcXVpcmUgdGhhdCB0aGUgXCJ3aGl0ZXNwYWNlIHJ1blwiIHN0YXJ0cyBmcm9tIGEgbm9uLXdoaXRlc3BhY2Vcbi8vIHRvIGF2b2lkIE8oTl4yKSBiZWhhdmlvciB3aGVuIHRoZSBlbmdpbmUgd291bGQgdHJ5IG1hdGNoaW5nIFwiXFxzKyRcIiBhdCBlYWNoIHNwYWNlIHBvc2l0aW9uLlxudmFyIHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8KFteXFxzXFx1RkVGRlxceEEwXSlbXFxzXFx1RkVGRlxceEEwXSskL2c7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cbmpRdWVyeS50cmltID0gZnVuY3Rpb24oIHRleHQgKSB7XG5cdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFwiXCIgOlxuXHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICk7XG59O1xuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICh0cmFjLTcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICh0cmFjLTEzNTY2KVxuaWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxuXG5cblxucmV0dXJuIGpRdWVyeTtcbn0gKTtcbiIsImltcG9ydCB7IElBY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCAnLi9ib290c3RyYXAuc2NzcydcbmV4cG9ydCBjb25zdCBhY3Rpb25BZGRpbnMgOlJlY29yZDxzdHJpbmcsSUFjdGlvbj49e307XG4iLCJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5cbmludGVyZmFjZSBJTXVzdElucHV0UHJvcHN7XG4gICAgZmllbGQ6SUZpZWxkO1xuICAgIG1lc3NhZ2U6c3RyaW5nOyBcbn1cblxuZXhwb3J0IGNsYXNzIE11c3RJbnB1dEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb257XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcbiAgICBwcm9wczpJTXVzdElucHV0UHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5b+F6aCI44OB44Kn44OD44KvXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBtZXNzYWdlOicnXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnbWVzc2FnZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJTXVzdElucHV0UHJvcHM7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODiVske3RoaXMucHJvcHMuZmllbGQuY29kZX1d44GM6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CCYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgICAgICAgaWYodmFsdWU9PT11bmRlZmluZWQgfHwgdmFsdWU9PT0nJyl7XG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3I9dGhpcy5wcm9wcy5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbiAgICBcbn1cbm5ldyBNdXN0SW5wdXRBY3Rpb24oKTsiLCJleHBvcnQgY2xhc3MgRm9ybWF0dGVye1xuICAgIHN0YXRpYyBudW1iZXJGb3JtYXQobnVtOm51bWJlcixmb3JtYXQ6c3RyaW5nKTpzdHJpbmd7XG4gICAgICAgIGxldCBpbnRlZ2VyUGFydCA9IE1hdGguZmxvb3IoTWF0aC5hYnMobnVtKSkudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IGZyYWN0aW9uUGFydCA9IE1hdGguYWJzKG51bSkudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdIHx8ICcnO1xuICAgICAgICBsZXQgaXNOZWdhdGl2ZSA9IG51bSA8IDA7XG4gICAgICAgIGxldCBpc1BlcmNlbnQgPSBmb3JtYXQuaW5jbHVkZXMoJyUnKTsgICAgICAgXG4gICAgICAgIC8vICVcbiAgICAgICAgaWYgKGlzUGVyY2VudCkge1xuICAgICAgICAgICAgbnVtICo9IDEwMDtcbiAgICAgICAgICAgIGludGVnZXJQYXJ0ID0gTWF0aC5mbG9vcihNYXRoLmFicyhudW0pKS50b1N0cmluZygpO1xuICAgICAgICAgICAgZnJhY3Rpb25QYXJ0ID0gTWF0aC5hYnMobnVtKS50b1N0cmluZygpLnNwbGl0KCcuJylbMV0gfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIOWwj+aVsOOBqOaVtOaVsOmDqOWIhuOBruWHpueQhlxuICAgICAgICBsZXQgW2ludGVnZXJGb3JtYXQsIGZyYWN0aW9uRm9ybWF0XSA9IGZvcm1hdC5zcGxpdCgnLicpO1xuICAgICAgICBpbnRlZ2VyUGFydCA9IGludGVnZXJGb3JtYXQgPyBpbnRlZ2VyUGFydC5wYWRTdGFydChpbnRlZ2VyRm9ybWF0LnJlcGxhY2UoL1teMF0vZywgJycpLmxlbmd0aCwgJzAnKSA6IGludGVnZXJQYXJ0O1xuICAgICAgICBmcmFjdGlvblBhcnQgPSBmcmFjdGlvblBhcnQucGFkRW5kKGZyYWN0aW9uRm9ybWF0ID8gZnJhY3Rpb25Gb3JtYXQubGVuZ3RoIDogMCwgJzAnKTtcblxuICAgICAgICAvLyDjgqvjg57ljLrliIdcbiAgICAgICAgaWYgKC8sLy50ZXN0KGludGVnZXJGb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGludGVnZXJQYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcGFydHMudW5zaGlmdChpbnRlZ2VyUGFydC5zbGljZSgtMykpO1xuICAgICAgICAgICAgaW50ZWdlclBhcnQgPSBpbnRlZ2VyUGFydC5zbGljZSgwLCAtMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnRlZ2VyUGFydCA9IHBhcnRzLmpvaW4oJywnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOOBmeOBueOBpue1hOWQiOOCj+OBm1xuICAgICAgICBsZXQgcmVzdWx0ID0gZnJhY3Rpb25Gb3JtYXQgPyBgJHtpbnRlZ2VyUGFydH0uJHtmcmFjdGlvblBhcnR9YCA6IGludGVnZXJQYXJ0O1xuICAgICAgICByZXN1bHQgPSBpc05lZ2F0aXZlID8gYC0ke3Jlc3VsdH1gIDogcmVzdWx0O1xuICAgICAgICByZXR1cm4gaXNQZXJjZW50ID8gYCR7cmVzdWx0fSVgIDogcmVzdWx0O1xuICAgIH1cbiAgICAgIFxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgY29uc3QgaG91ciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIGNvbnN0IHNlY29uZCA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICBjb25zdCBtaWxsaXNlY29uZCA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgICAgIGNvbnN0IHRpbWVab25lT2Zmc2V0ID0gLWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwO1xuICAgICAgXG4gICAgICAgIGNvbnN0IHJlcGxhY2VtZW50cyA9IHtcbiAgICAgICAgICAneXl5eSc6IHllYXIudG9TdHJpbmcoKSxcbiAgICAgICAgICAneXknOiB5ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLFxuICAgICAgICAgICdNTSc6IG1vbnRoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgICAnTSc6IG1vbnRoLnRvU3RyaW5nKCksXG4gICAgICAgICAgJ2RkJzogZGF5LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgICAnZCc6IGRheS50b1N0cmluZygpLFxuICAgICAgICAgICdISCc6IGhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxuICAgICAgICAgICdIJzogaG91ci50b1N0cmluZygpLFxuICAgICAgICAgICdoaCc6IChob3VyID4gMTIgPyBob3VyIC0gMTIgOiBob3VyKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXG4gICAgICAgICAgJ2gnOiAoaG91ciA+IDEyID8gaG91ciAtIDEyIDogaG91cikudG9TdHJpbmcoKSxcbiAgICAgICAgICAnbW0nOiBtaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxuICAgICAgICAgICdtJzogbWludXRlLnRvU3RyaW5nKCksXG4gICAgICAgICAgJ3NzJzogc2Vjb25kLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgICAncyc6IHNlY29uZC50b1N0cmluZygpLFxuICAgICAgICAgICdmZmYnOiBtaWxsaXNlY29uZC50b1N0cmluZygpLnBhZFN0YXJ0KDMsICcwJyksXG4gICAgICAgICAgJ3p6eic6ICh0aW1lWm9uZU9mZnNldCA+PSAwID8gJysnIDogJy0nKSArIE1hdGguYWJzKHRpbWVab25lT2Zmc2V0KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnOjAwJ1xuICAgICAgICB9O1xuICAgICAgXG4gICAgICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgveXl5eXx5eXxNTXxNfGRkfGR8SEh8SHxoaHxofG1tfG18c3N8c3xmZmZ8enp6L2csIChtYXRjaCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudHNbbWF0Y2ggYXMga2V5b2YgdHlwZW9mIHJlcGxhY2VtZW50c10gfHwgbWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICBcblxufSIsIlxuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IElGaWVsZCwgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJQ29udGV4dCwgSVZhck5hbWUgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IEZvcm1hdHRlciB9IGZyb20gXCIuLi91dGlsL2Zvcm1hdFwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7ICRmb3JtYXQ6IGFueTsgfSAgXG59XG5cbmludGVyZmFjZSBJQXV0b051bWJlcmluZ1Byb3Bze1xuICAgIC8v5paH5pu455Wq5Y+344KS5qC857SN44GZ44KLXG4gICAgZmllbGQ6SUZpZWxkO1xuICAgIGZvcm1hdDpzdHJpbmc7XG4gICAgcHJlZml4OnN0cmluZztcbiAgICBzdWZmaXg6c3RyaW5nO1xuICAgIHZlck5hbWU6SVZhck5hbWU7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRvTnVtYmVyaW5nIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklBdXRvTnVtYmVyaW5nUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi6Ieq5YuV5o6h55Wq44GZ44KLXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBmb3JtYXQ6JycsXG4gICAgICAgICAgICBwcmVmaXg6JycsXG4gICAgICAgICAgICBzdWZmaXg6JycsXG4gICAgICAgICAgICB2ZXJOYW1lOntuYW1lOicnfVxuICAgICAgICB9XG4gICAgICAgIGdsb2JhbFRoaXMud2luZG93LiRmb3JtYXQ9dGhpcy5mb3JtYXQ7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWHpueQhuOCkuWun+ijheOBmeOCi1xuICogQHBhcmFtIGFjdGlvbk5vZGUg44Ki44Kv44K344On44Oz44OO44O844OJXG4gKiBAcGFyYW0gZXZlbnQgS2ludG9uZeOBruOCpOODmeODs+ODiFxuICogQHBhcmFtIGNvbnRleHQg44Kz44Oz44OG44Kt44K544OI77yI44Os44Kz44O844OJ44CB5aSJ5pWw5oOF5aCx44KS5oyB44Gj44Gm44GE44KL77yJXG4gKiBAcmV0dXJucyBcbiAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDpmYWxzZSxcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2Zvcm1hdCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQXV0b051bWJlcmluZ1Byb3BzO1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgICAgICAgICAgY29uc3QgZG9jTnVtID0gYXdhaXQgdGhpcy5jcmVhdGVOdW1iZXIodGhpcy5wcm9wcyk7XG4gICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS52YWx1ZT1kb2NOdW07XG4gICAgICAgICAgICAvL+WkieaVsOioreWumlxuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lICYmIHRoaXMucHJvcHMudmVyTmFtZS5uYW1lIT09Jycpe1xuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT1kb2NOdW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjYW5OZXh0OmZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY1RlbXBsYXRlKHRlbXBsYXRlOnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBpZih0ZW1wbGF0ZT09PXVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCByZWdleCA9IC9cXCRcXHsoW159XSspXFx9L2c7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHJlZ2V4LChtYXRjaCxleHByKT0+e1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY0V2YWwobWF0Y2gsZXhwcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGV4ZWNFdmFsKG1hdGNoOnN0cmluZyxleHByOnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBjb25zb2xlLmxvZyhtYXRjaCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGV2YWwoZXhwcik7XG4gICAgfVxuXG4gICAgZm9ybWF0KHBhdHRlcm46c3RyaW5nKTpzdHJpbmd7XG4gICAgICAgIGNvbnN0IG5vdz1uZXcgRGF0ZSgpO1xuICAgICAgICByZXR1cm4gRm9ybWF0dGVyLmRhdGVGb3JtYXQobm93LCBwYXR0ZXJuKTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVOdW1iZXIocHJvcHM6SUF1dG9OdW1iZXJpbmdQcm9wcyl7XG4gICAgICAgIGxldCBudW1iZXIgOnN0cmluZz0nJztcbiAgICAgICAgbGV0IHByZWZpeDpzdHJpbmc9Jyc7XG4gICAgICAgIGxldCBzdWZmaXg6c3RyaW5nPScnO1xuICAgICAgICBsZXQgbm89MTsgICAgIFxuICAgICAgICB0cnl7XG4gICAgICAgICAgICBubyA9IGF3YWl0IHRoaXMuZmV0Y2hObygpO1xuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHByb3BzLmZvcm1hdCE9PXVuZGVmaW5lZCAmJiBwcm9wcy5mb3JtYXQhPT0nJyl7XG4gICAgICAgICAgICBudW1iZXI9Rm9ybWF0dGVyLm51bWJlckZvcm1hdChubywgcHJvcHMuZm9ybWF0KTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBudW1iZXI9bm8udG9TdHJpbmcoMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocHJvcHMucHJlZml4IT09dW5kZWZpbmVkICYmIHByb3BzLnByZWZpeCE9PScnKXtcbiAgICAgICAgICAgIHByZWZpeD10aGlzLmV4ZWNUZW1wbGF0ZShwcm9wcy5wcmVmaXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocHJvcHMuc3VmZml4IT09dW5kZWZpbmVkICYmIHByb3BzLnN1ZmZpeCE9PScnKXtcbiAgICAgICAgICAgIHN1ZmZpeD10aGlzLmV4ZWNUZW1wbGF0ZShwcm9wcy5zdWZmaXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtudW1iZXJ9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaE5vKCk6UHJvbWlzZTxudW1iZXI+e1xuICAgICAgICBsZXQgcmVjTm89MTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IGtpbnRvbmUuUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLHJlamVjdCk9PntcbiAgICAgICAgICAgIGNvbnN0IGFwcHVybCA9IGtpbnRvbmUuYXBpLnVybCgnL2svdjEvcmVjb3JkcycsdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbXM9e1xuICAgICAgICAgICAgICAgIGFwcDpraW50b25lLmFwcC5nZXRJZCgpLFxuICAgICAgICAgICAgICAgIGZpZWxkczpbJyRpZCddLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OidsaW1pdCAxJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBraW50b25lLmFwaShhcHB1cmwsJ0dFVCcscGFyYW1zKS50aGVuKChyZXNwKT0+e1xuICAgICAgICAgICAgICAgIGlmKHJlc3AucmVjb3Jkc1swXSE9PW51bGwpe1xuICAgICAgICAgICAgICAgICAgICByZWNObyA9IHBhcnNlSW50KHJlc3AucmVjb3Jkc1swXS4kaWQudmFsdWUsMTApKzE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVjTm8pO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKT0+e1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxuICAgIFxufVxubmV3IEF1dG9OdW1iZXJpbmcoKTsiLCJpbXBvcnQgeyBJQ29udGV4dCxJQ29kZVZhbHVlIH0gZnJvbSBcIi4vQWN0aW9uVHlwZXNcIjtcblxuLy/jg47jg7zjg4nnqK7liKVcbmV4cG9ydCBlbnVtIE5vZGVUeXBle1xuICBSb290ID0gJ3Jvb3QnLFxuICBMb2dpY0dyb3VwID0nbG9naWNncm91cCcsXG4gIENvbmRpdGlvbiA9J2NvbmRpdGlvbidcbn1cblxuLy/jg63jgrjjg4Pjgq/jgqrjg5rjg6zjg7zjgr/jg7xcbmV4cG9ydCBlbnVtIExvZ2ljYWxPcGVyYXRvcntcbiAgQU5EID0gJ0FORCcsXG4gIE9SID0gJ09SJ1xufVxuXG4vL+adoeS7tuOCquODmuODrOODvOOCv+ODvFxuZXhwb3J0IGVudW0gT3BlcmF0b3J7XG4gIEVxdWFsID0gJz0nLFxuICBOb3RFcXVhbD0nIT0nLFxuICBHcmVhdGVyID0gJz4nLFxuICBHcmVhdGVyT3JFcXVhbCA9ICc+PScsXG4gIExlc3MgPSAnPCcsXG4gIExlc3NPckVxdWFsID0gJzw9JyxcbiAgQ29udGFpbnMgPSAnY29udGFpbnMnLFxuICBOb3RDb250YWlucyA9ICdub3QgY29udGFpbnMnLFxuICBTdGFydFdpdGggPSAnc3RhcnQgV2l0aCcsXG4gIEVuZFdpdGggPSAnZW5kIHdpdGgnLFxuICBOb3RTdGFydFdpdGggPSAnbm90IHN0YXJ0IHdpdGgnLFxuICBOb3RFbmRXaXRoID0gJ25vdCBlbmQgd2l0aCdcbn1cblxuXG4vLyBJTm9kZVxuZXhwb3J0IGludGVyZmFjZSBJTm9kZSB7XG4gIGluZGV4Om51bWJlcjtcbiAgdHlwZTogTm9kZVR5cGU7XG4gIGhlYWRlcjpzdHJpbmc7XG4gIHBhcmVudDogSU5vZGUgfCBudWxsO1xuICBsb2dpY2FsT3BlcmF0b3I6TG9naWNhbE9wZXJhdG9yXG59XG5cbi8vIOODreOCuOODg+OCr+ODjuODvOODiVxuZXhwb3J0IGNsYXNzIEdyb3VwTm9kZSBpbXBsZW1lbnRzIElOb2RlIHtcbiAgaW5kZXg6bnVtYmVyO1xuICB0eXBlOiBOb2RlVHlwZTtcbiAgY2hpbGRyZW46IElOb2RlW107XG4gIHBhcmVudDogSU5vZGUgfCBudWxsO1xuICBsb2dpY2FsT3BlcmF0b3I6IExvZ2ljYWxPcGVyYXRvcjtcbiAgZ2V0IGxhYmVsKCk6c3RyaW5ne1xuICAgIHJldHVybiB0aGlzLmxvZ2ljYWxPcGVyYXRvcjtcbiAgfVxuICBnZXQgaGVhZGVyKCk6c3RyaW5ne1xuICAgIHJldHVybiB0aGlzLnR5cGU9PT1Ob2RlVHlwZS5Sb290Pydyb290JzonZ2VuZXJpYyc7XG4gIH1cbiAgZ2V0IGV4cGFuZGVkKCk6Ym9vbGVhbntcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg+MDtcbiAgfVxuICBjb25zdHJ1Y3Rvcihsb2dpY09wOkxvZ2ljYWxPcGVyYXRvciwgcGFyZW50OiBJTm9kZSB8IG51bGwpIHtcbiAgICB0aGlzLmluZGV4PTA7XG4gICAgdGhpcy50eXBlID0gcGFyZW50PT1udWxsP05vZGVUeXBlLlJvb3Q6IE5vZGVUeXBlLkxvZ2ljR3JvdXA7XG4gICAgdGhpcy5sb2dpY2FsT3BlcmF0b3IgPSBsb2dpY09wO1xuICAgIHRoaXMucGFyZW50PXBhcmVudDtcbiAgICB0aGlzLmNoaWxkcmVuPVtdO1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb246IGFueSwgcGFyZW50OiBJTm9kZSB8IG51bGwgPSBudWxsKTogR3JvdXBOb2RlIHtcbiAgICBjb25zdCBub2RlID0gbmV3IEdyb3VwTm9kZShqc29uLmxvZ2ljYWxPcGVyYXRvciwgcGFyZW50KTtcbiAgICBub2RlLmluZGV4PWpzb24uaW5kZXg7XG4gICAgbm9kZS5jaGlsZHJlbiA9IGpzb24uY2hpbGRyZW4ubWFwKChjaGlsZEpzb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGNoaWxkSnNvbi50eXBlID09PSBOb2RlVHlwZS5Mb2dpY0dyb3VwXG4gICAgICAgID8gR3JvdXBOb2RlLmZyb21KU09OKGNoaWxkSnNvbiwgbm9kZSlcbiAgICAgICAgOiBDb25kaXRpb25Ob2RlLmZyb21KU09OKGNoaWxkSnNvbiwgbm9kZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxufVxuXG4vLyDmnaHku7blvI/jg47jg7zjg4lcbmV4cG9ydCBjbGFzcyBDb25kaXRpb25Ob2RlIGltcGxlbWVudHMgSU5vZGUge1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBOb2RlVHlwZTtcbiAgcGFyZW50OklOb2RlO1xuICBnZXQgbG9naWNhbE9wZXJhdG9yKCk6IExvZ2ljYWxPcGVyYXRvcntcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQubG9naWNhbE9wZXJhdG9yO1xuICB9O1xuICBvYmplY3Q6IGFueTsgLy8g5q+U6LyD5YWDXG4gIG9wZXJhdG9yOiBPcGVyYXRvcjsgLy8g5q+U6LyD5a2QXG4gIHZhbHVlOiBhbnk7XG4gIGdldCBoZWFkZXIoKTpzdHJpbmd7XG4gICAgcmV0dXJuICdnZW5lcmljJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9iamVjdDogYW55LCBvcGVyYXRvcjogT3BlcmF0b3IsIHZhbHVlOiBhbnksIHBhcmVudDogR3JvdXBOb2RlKSB7XG4gICAgdGhpcy5pbmRleD0wO1xuICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkNvbmRpdGlvbjtcbiAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMucGFyZW50PXBhcmVudDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBhbnksIHBhcmVudDogR3JvdXBOb2RlKTogQ29uZGl0aW9uTm9kZSB7XG4gICAgY29uc3Qgbm9kZT0gbmV3IENvbmRpdGlvbk5vZGUoXG4gICAgICBqc29uLm9iamVjdCxcbiAgICAgIGpzb24ub3BlcmF0b3IsXG4gICAgICBqc29uLnZhbHVlLFxuICAgICAgcGFyZW50XG4gICAgKTtcbiAgICBub2RlLmluZGV4PWpzb24uaW5kZXg7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiDmnaHku7blvI/jga7nrqHnkIbjgq/jg6njgrlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvblRyZWUge1xuICByb290OiBHcm91cE5vZGU7XG4gIG1heEluZGV4Om51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1heEluZGV4PTA7XG4gICAgdGhpcy5yb290ID0gbmV3IEdyb3VwTm9kZShMb2dpY2FsT3BlcmF0b3IuQU5ELCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg47jg7zjg4nov73liqBcbiAgICogQHBhcmFtIHBhcmVudCBcbiAgICogQHBhcmFtIG5vZGUgXG4gICAqL1xuICBhZGROb2RlKHBhcmVudDogR3JvdXBOb2RlLCBub2RlOiBJTm9kZSk6IHZvaWQge1xuICAgIHRoaXMubWF4SW5kZXgrKztcbiAgICBub2RlLmluZGV4PXRoaXMubWF4SW5kZXg7XG4gICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gIH1cblxuICAvKipcbiAgICogIOODjuODvOODieWJiumZpFxuICAgKiBAcGFyYW0gbm9kZSBcbiAgICovXG4gIHJlbW92ZU5vZGUobm9kZTogSU5vZGUpOiB2b2lkIHtcbiAgICBpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcign44Or44O844OI44OO44O844OJ5YmK6Zmk44Gn44GN44G+44Gb44KTJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50IGFzIEdyb3VwTm9kZTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuLyoqXG4gKiDmnaHku7bjg4Tjg6rjg7zjgYvjgonjgqTjg7Pjg4fjgqPjgq/jgrnlgKTjgafmnaHku7bjg47jg7zjg4njgpLmpJzntKLjgZnjgotcbiAqIEBwYXJhbSBpbmRleCBcbiAqIEByZXR1cm5zIFxuICovXG4gIGZpbmRCeUluZGV4KGluZGV4Om51bWJlcik6SU5vZGV8dW5kZWZpbmVke1xuICAgIHJldHVybiB0aGlzLmZpbmRDaGlsZHJlbih0aGlzLnJvb3QsaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaMh+WumuOBruODjuODvOODieOCsOODq+ODvOODl+OBi+OCieOCpOODs+ODh+OCo+OCr+OCueWApOOBp+adoeS7tuODjuODvOODieOCkuaknOe0ouOBmeOCi1xuICAgKiBAcGFyYW0gcGFyZW50IFxuICAgKiBAcGFyYW0gaW5kZXggXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZmluZENoaWxkcmVuKHBhcmVudDogR3JvdXBOb2RlLCBpbmRleDogbnVtYmVyKTogSU5vZGUgfCB1bmRlZmluZWQge1xuICAgIGlmIChwYXJlbnQuaW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50LmNoaWxkcmVuKSB7XG4gICAgICBpZiAobm9kZS5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS50eXBlICE9PSBOb2RlVHlwZS5Db25kaXRpb24pIHtcbiAgICAgICAgY29uc3QgZm91bmROb2RlID0gdGhpcy5maW5kQ2hpbGRyZW4obm9kZSBhcyBHcm91cE5vZGUsIGluZGV4KTtcbiAgICAgICAgaWYgKGZvdW5kTm9kZSkge1xuICAgICAgICAgIHJldHVybiBmb3VuZE5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIG5vZGUg5pyA5aSn44Gu44Kk44Oz44OH44Kj44Kv44K55YCk44KS5Y+W5b6X44GZ44KLXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZ2V0TWF4SW5kZXgobm9kZTpJTm9kZSk6bnVtYmVye1xuICAgIGxldCBtYXhJbmRleDpudW1iZXI9bm9kZS5pbmRleDtcbiAgICBpZihub2RlLnR5cGUhPT1Ob2RlVHlwZS5Db25kaXRpb24pe1xuICAgICAgY29uc3QgZ3JvdXBOb2RlID0gbm9kZSBhcyBHcm91cE5vZGU7XG4gICAgICBncm91cE5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpPT57XG4gICAgICAgICAgY29uc3QgY2hpbGRNYXggPSB0aGlzLmdldE1heEluZGV4KGNoaWxkKTtcbiAgICAgICAgICBpZihjaGlsZE1heD5tYXhJbmRleCl7XG4gICAgICAgICAgICBtYXhJbmRleD1jaGlsZE1heDtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1heEluZGV4O1xufVxuXG4gIC8qKlxuICAgKiDmnaHku7blvI/jgpLooajnpLrjgZnjgotcbiAgICogQHBhcmFtIG5vZGUg5p2h5Lu244OO44O844OJXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgYnVpbGRDb25kaXRpb25TdHJpbmcobm9kZTpJTm9kZSl7XG4gICAgaWYgKG5vZGUudHlwZSAhPT0gTm9kZVR5cGUuQ29uZGl0aW9uKSB7XG4gICAgICBsZXQgY29uZGl0aW9uU3RyaW5nID0gJygnO1xuICAgICAgY29uc3QgZ3JvdXBOb2RlID0gbm9kZSBhcyBHcm91cE5vZGU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwTm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZENvbmRpdGlvblN0cmluZyA9IHRoaXMuYnVpbGRDb25kaXRpb25TdHJpbmcoZ3JvdXBOb2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgaWYgKGNoaWxkQ29uZGl0aW9uU3RyaW5nICE9PSAnJykge1xuICAgICAgICAgIGNvbmRpdGlvblN0cmluZyArPSBjaGlsZENvbmRpdGlvblN0cmluZztcbiAgICAgICAgICBpZiAoaSA8IGdyb3VwTm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBjb25kaXRpb25TdHJpbmcgKz0gYCAke2dyb3VwTm9kZS5sb2dpY2FsT3BlcmF0b3J9IGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25kaXRpb25TdHJpbmcgKz0gJyknO1xuICAgICAgcmV0dXJuIGNvbmRpdGlvblN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29uZE5vZGU9bm9kZSBhcyBDb25kaXRpb25Ob2RlO1xuICAgICAgaWYgKGNvbmROb2RlLm9iamVjdCAmJiBjb25kTm9kZS5vcGVyYXRvciApIHtcbiAgICAgICAgbGV0IHZhbHVlPWNvbmROb2RlLnZhbHVlO1xuICAgICAgICBpZih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09J29iamVjdCcgJiYgKCdsYWJlbCcgaW4gdmFsdWUpKXtcbiAgICAgICAgICAgIHZhbHVlID1jb25kTm9kZS52YWx1ZS5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Y29uZE5vZGUub2JqZWN0Lm5hbWV9ICR7Y29uZE5vZGUub3BlcmF0b3J9ICcke3ZhbHVlfSdgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICog44GZ44G544Gm5p2h5Lu25byP44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBnZXRDb25kaXRpb25zKHBhcmVudDpHcm91cE5vZGUpOkNvbmRpdGlvbk5vZGVbXXtcbiAgICBjb25zdCBjb25kaU5vZGVzOkNvbmRpdGlvbk5vZGVbXT1bXTtcbiAgICBwYXJlbnQuY2hpbGRyZW4uZm9yRWFjaCgobm9kZSk9PntcbiAgICAgIGlmKG5vZGUudHlwZT09PU5vZGVUeXBlLkNvbmRpdGlvbil7XG4gICAgICAgIGNvbmRpTm9kZXMucHVzaChub2RlIGFzIENvbmRpdGlvbk5vZGUpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGNvbmRpTm9kZXMucHVzaCguLi50aGlzLmdldENvbmRpdGlvbnMobm9kZSBhcyBHcm91cE5vZGUpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29uZGlOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHBhcmVudCDjgZnjgbnjgabmnaHku7bjgrDjg6vjg7zjg5fjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBnZXRHcm91cHMocGFyZW50Okdyb3VwTm9kZSk6bnVtYmVyW117XG4gICAgY29uc3QgZ3JvdXBzOm51bWJlcltdPVtdO1xuICAgIGdyb3Vwcy5wdXNoKHBhcmVudC5pbmRleCk7XG4gICAgcGFyZW50LmNoaWxkcmVuLmZvckVhY2goKG5vZGUpPT57XG4gICAgICBpZihub2RlLnR5cGUhPT1Ob2RlVHlwZS5Db25kaXRpb24pe1xuICAgICAgICBncm91cHMucHVzaCguLi50aGlzLmdldEdyb3Vwcyhub2RlIGFzIEdyb3VwTm9kZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICAvKipcbiAgICogSnNvbuOBi+OCieW+qeWFg1xuICAgKiBAcGFyYW0ganNvblN0cmluZyBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBmcm9tSnNvbihqc29uU3RyaW5nOiBzdHJpbmcpOiBJTm9kZSB7XG4gICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XG4gICAgdGhpcy5yb290ID0gR3JvdXBOb2RlLmZyb21KU09OKGpzb24pIGFzIEdyb3VwTm9kZTtcbiAgICB0aGlzLm1heEluZGV4PXRoaXMuZ2V0TWF4SW5kZXgodGhpcy5yb290KTtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG4gIC8qKlxuICAgKiBKU09O5paH5a2X5YiX44Gr5aSJ5o+b44GZ44KLXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgdG9Kc29uKCk6c3RyaW5ne1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3QsIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAncGFyZW50Jykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPyB2YWx1ZS50eXBlIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnaHku7blvI/jgpLoqIjnrpfjgZnjgotcbiAgICogQHBhcmFtIG5vZGUgXG4gICAqIEBwYXJhbSBjb250ZXh0IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIGV2YWx1YXRlKG5vZGU6IElOb2RlLCBjb250ZXh0OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZS5Db25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKG5vZGUgYXMgQ29uZGl0aW9uTm9kZSwgY29udGV4dCk7XG4gICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlLkxvZ2ljR3JvdXAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZS5Sb290KSB7XG4gICAgICBjb25zdCBncm91cE5vZGUgPSBub2RlIGFzIEdyb3VwTm9kZTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBncm91cE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHRoaXMuZXZhbHVhdGUoY2hpbGQsIGNvbnRleHQpKTtcbiAgXG4gICAgICBpZiAoZ3JvdXBOb2RlLmxvZ2ljYWxPcGVyYXRvciA9PT0gTG9naWNhbE9wZXJhdG9yLkFORCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeShyZXN1bHQgPT4gcmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXBOb2RlLmxvZ2ljYWxPcGVyYXRvciA9PT0gTG9naWNhbE9wZXJhdG9yLk9SKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzLnNvbWUocmVzdWx0ID0+IHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGxvZ2ljYWwgb3BlcmF0b3InKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBub2RlIHR5cGUnKTtcbiAgICB9XG4gIH1cblxuXG4gIGdldENvZGVWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnY29kZScgaW4gdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5jb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElDb2RlVmFsdWXlnovjga5jb2Rl44Gr5aSJ5o+b44GZ44KLXG4gICAqIEBwYXJhbSB2YWx1ZSBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBjb252ZXJ0Q29kZVZhbHVlKHZhbHVlOmFueSk6YW55e1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHRoaXMuZ2V0Q29kZVZhbHVlKHYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29kZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0gdmFycyDlpInmlbDlgKTjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIHBhdGggXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZ2V0Q29udGV4dFZhckJ5UGF0aCAodmFyczoge1trZXk6c3RyaW5nXTphbnl9LCBwYXRoOiBzdHJpbmcpe1xuICAgIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgdmFycyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbmRpdGlvbiBvYmplY3Tjga7lgKTjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIG9iamVjdCBcbiAgICogQHBhcmFtIGNvbnRleHQgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZ2V0T2JqZWN0VmFsdWUob2JqZWN0OmFueSxjb250ZXh0OklDb250ZXh0KXtcbiAgICBpZighb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QhPT1cIm9iamVjdFwiIHx8ICEoXCJvYmplY3RUeXBlXCIgaW4gb2JqZWN0KSl7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmKG9iamVjdC5vYmplY3RUeXBlPT09J2ZpZWxkJyl7XG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gY29udGV4dC5yZWNvcmRbb2JqZWN0LmNvZGVdO1xuICAgICAgaWYoZmllbGRWYWx1ZS50eXBlPT09J05VTUJFUicgJiYgZmllbGRWYWx1ZS52YWx1ZSE9PXVuZGVmaW5lZCl7XG4gICAgICAgIHJldHVybiBOdW1iZXIoZmllbGRWYWx1ZS52YWx1ZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydENvZGVWYWx1ZShmaWVsZFZhbHVlLnZhbHVlKTtcbiAgICAgIH0gICAgICBcbiAgICB9ZWxzZSBpZihvYmplY3Qub2JqZWN0VHlwZT09PSd2YXJpYWJsZScpe1xuICAgICAgY29uc3QgdmFyVmFsdWUgPSB0aGlzLmdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMsb2JqZWN0Lm5hbWUubmFtZSk7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Q29kZVZhbHVlKHZhclZhbHVlKTtcbiAgICB9ZWxzZSBpZihvYmplY3Qub2JqZWN0VHlwZT09PSd0ZXh0Jyl7XG4gICAgICByZXR1cm4gb2JqZWN0LnNoYXJlZFRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOavlOi8g+OCquODluOCuOOCp+OCr+ODiOOBruWApOOCkuWPluW+l1xuICAgKiBAcGFyYW0gb2JqZWN0IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIGdldENvbmRpdGlvblZhbHVlKG9iamVjdDphbnksY29udGV4dDpJQ29udGV4dCl7XG4gICAgaWYoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0IT09XCJvYmplY3RcIil7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cbiAgICBpZihcIm9iamVjdFR5cGVcIiBpbiBvYmplY3Qpe1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0VmFsdWUob2JqZWN0LGNvbnRleHQpO1xuICAgIH1cbiAgICBpZihcInNoYXJlZFRleHRcIiBpbiBvYmplY3Qpe1xuICAgICAgcmV0dXJuIG9iamVjdC5zaGFyZWRUZXh0O1xuICAgIH1cbiAgICBpZihcImxhYmVsXCIgaW4gb2JqZWN0KXtcbiAgICAgIHJldHVybiBvYmplY3QubGFiZWw7XG4gICAgfVxuICAgIGlmKFwidmFsdWVcIiBpbiBvYmplY3Qpe1xuICAgICAgcmV0dXJuIG9iamVjdC52YWx1ZTtcbiAgICB9XG4gICAgaWYoXCJuYW1lXCIgaW4gb2JqZWN0KXtcbiAgICAgIHJldHVybiBvYmplY3QubmFtZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5p2h5Lu25byP44KS6KiI566X44GZ44KLXG4gICAqIEBwYXJhbSBjb25kaXRpb24gXG4gICAqIEBwYXJhbSBjb250ZXh0IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIGV2YWx1YXRlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uTm9kZSwgY29udGV4dDogSUNvbnRleHQpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IG9iamVjdCwgb3BlcmF0b3IsIHZhbHVlIH0gPSBjb25kaXRpb247XG4gICAgY29uc3QgdGFyZ2V0T2JqZWN0ID0gdGhpcy5nZXRPYmplY3RWYWx1ZShvYmplY3QsY29udGV4dCk7XG4gICAgY29uc3QgY29uZGl0aW9uT2JqZWN0ID0gdGhpcy5nZXRDb25kaXRpb25WYWx1ZSh2YWx1ZSxjb250ZXh0KTtcbiAgICBjb25zdCBpc0FycmF5VGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh0YXJnZXRPYmplY3QpO1xuICAgIGNvbnN0IGlzQXJyYXlWYWx1ZSA9IEFycmF5LmlzQXJyYXkoY29uZGl0aW9uT2JqZWN0KTtcbiAgICAvL+mFjeWIl+OBruavlOi8g1xuICAgIGlmKChpc0FycmF5VGFyZ2V0ICYmIHRhcmdldE9iamVjdC5sZW5ndGggPiAxKXx8KGlzQXJyYXlWYWx1ZSAmJiBjb25kaXRpb25PYmplY3QubGVuZ3RoPjEpKXtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVBcnJheShvcGVyYXRvcix0YXJnZXRPYmplY3QsY29uZGl0aW9uT2JqZWN0KVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IGlzQXJyYXlUYXJnZXQ/dGFyZ2V0T2JqZWN0WzBdOnRhcmdldE9iamVjdDtcbiAgICBjb25zdCBjb25kaXRpb25WYWx1ZSA9IGlzQXJyYXlWYWx1ZT9jb25kaXRpb25PYmplY3RbMF06Y29uZGl0aW9uT2JqZWN0O1xuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgT3BlcmF0b3IuRXF1YWw6XG4gICAgICBjYXNlIE9wZXJhdG9yLk5vdEVxdWFsOlxuICAgICAgY2FzZSBPcGVyYXRvci5HcmVhdGVyOlxuICAgICAgY2FzZSBPcGVyYXRvci5HcmVhdGVyT3JFcXVhbDpcbiAgICAgIGNhc2UgT3BlcmF0b3IuTGVzczpcbiAgICAgIGNhc2UgT3BlcmF0b3IuTGVzc09yRXF1YWw6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUob3BlcmF0b3IsdGFyZ2V0VmFsdWUsIGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuQ29udGFpbnM6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zKHRhcmdldFZhbHVlLGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuTm90Q29udGFpbnM6XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250YWlucyh0YXJnZXRWYWx1ZSxjb25kaXRpb25WYWx1ZSk7XG4gICAgICBjYXNlIE9wZXJhdG9yLlN0YXJ0V2l0aDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRXaXRoKHRhcmdldFZhbHVlLGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuTm90U3RhcnRXaXRoOlxuICAgICAgICByZXR1cm4gIXRoaXMuc3RhcnRXaXRoKHRhcmdldFZhbHVlLGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuRW5kV2l0aDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kc1dpdGgodGFyZ2V0VmFsdWUsY29uZGl0aW9uVmFsdWUpO1xuICAgICAgY2FzZSBPcGVyYXRvci5Ob3RFbmRXaXRoOlxuICAgICAgICByZXR1cm4gdGhpcy5lbmRzV2l0aCh0YXJnZXRWYWx1ZSxjb25kaXRpb25WYWx1ZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdG9yJyk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICog5q+U6LyD44KS5a6f6KGM44GZ44KLXG4gICAqIEBwYXJhbSBvcGVyYXRvciBcbiAgICogQHBhcmFtIHRhcmdldFZhbHVlIFxuICAgKiBAcGFyYW0gdmFsdWUgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgY29tcGFyZShvcGVyYXRvcjogT3BlcmF0b3IsIHRhcmdldFZhbHVlOiBhbnksIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyB0YXJnZXRWYWx1ZSDjga/ml6XmnJ/ml7bvvIx2YWx1ZSDjgoLml6XmnJ/jgavlpInmj5vjgZfjgabmr5TovIPjgZnjgotcbiAgICBpZih0YXJnZXRWYWx1ZT09PXVuZGVmaW5lZCB8fCB0YXJnZXRWYWx1ZT09PW51bGx8fHRhcmdldFZhbHVlPT09Jycpe1xuICAgICAgaWYodmFsdWU9PT11bmRlZmluZWQgfHwgdmFsdWU9PT1udWxsfHx2YWx1ZT09PScnKXtcbiAgICAgICAgdGFyZ2V0VmFsdWU9Jyc7XG4gICAgICAgIHZhbHVlPScnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBjb25zdCBkYXRlVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKGRhdGVWYWx1ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHZhbHVlID0gZGF0ZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvL3RhcmdldFZhbHVl44Gv5pWw5YCk5pmC77yMdmFsdWUg44KS5pWw5YCk44Gr5aSJ5o+b44GZ44KLXG4gICAgZWxzZSBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgbnVtYmVyVmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKCFpc05hTihudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBudW1iZXJWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlIE9wZXJhdG9yLkVxdWFsOlxuICAgICAgICByZXR1cm4gdGFyZ2V0VmFsdWUgPT09IHZhbHVlO1xuICAgICAgY2FzZSBPcGVyYXRvci5Ob3RFcXVhbDpcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlICE9PSB2YWx1ZTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuR3JlYXRlcjpcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlID4gdmFsdWU7XG4gICAgICBjYXNlIE9wZXJhdG9yLkdyZWF0ZXJPckVxdWFsOlxuICAgICAgICByZXR1cm4gdGFyZ2V0VmFsdWUgPj0gdmFsdWU7XG4gICAgICBjYXNlIE9wZXJhdG9yLkxlc3M6XG4gICAgICAgIHJldHVybiB0YXJnZXRWYWx1ZSA8IHZhbHVlO1xuICAgICAgY2FzZSBPcGVyYXRvci5MZXNzT3JFcXVhbDpcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlIDw9IHZhbHVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBvcGVyYXRvciBmb3IgY29tcGFyaXNvbicpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIOmFjeWIl+WApOOBruavlOi8g1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgXG4gICAqIEBwYXJhbSB0YXJnZXRWYWx1ZSBcbiAgICogQHBhcmFtIHZhbHVlIFxuICAgKi9cbiAvKipcbiAqIOmFjeWIl+WApOOBruavlOi8g1xuICogQHBhcmFtIG9wZXJhdG9yIFxuICogQHBhcmFtIHRhcmdldFZhbHVlIFxuICogQHBhcmFtIHZhbHVlIFxuICovXG4gY29tcGFyZUFycmF5KG9wZXJhdG9yOiBPcGVyYXRvciwgdGFyZ2V0VmFsdWU6IGFueSwgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBpc0FycmF5VGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh0YXJnZXRWYWx1ZSk7XG4gIGNvbnN0IGlzQXJyYXlWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICBjb25zdCBzb3J0QXJyYXkgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLnNsaWNlKCkuc29ydCgpO1xuICB0YXJnZXRWYWx1ZSA9IGlzQXJyYXlUYXJnZXQ/dGFyZ2V0VmFsdWU6W3RhcmdldFZhbHVlXTtcbiAgdmFsdWU9IGlzQXJyYXlWYWx1ZT92YWx1ZTpbdmFsdWVdO1xuICBjb25zdCB0YXJnZXRBcnJheT1zb3J0QXJyYXkodGFyZ2V0VmFsdWUpO1xuICBjb25zdCB2YWx1ZUFycmF5PXNvcnRBcnJheSh2YWx1ZSk7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlIE9wZXJhdG9yLkVxdWFsOlxuICAgICAgcmV0dXJuICB0YXJnZXRBcnJheS5sZW5ndGg9PT12YWx1ZUFycmF5Lmxlbmd0aCAmJiB0YXJnZXRBcnJheS5ldmVyeSgodiwgaSkgPT4gdiA9PT0gdmFsdWVBcnJheVtpXSk7XG4gICAgY2FzZSBPcGVyYXRvci5Ob3RFcXVhbDpcbiAgICAgIHJldHVybiB0YXJnZXRBcnJheS5sZW5ndGghPT12YWx1ZUFycmF5Lmxlbmd0aCB8fCAhdGFyZ2V0QXJyYXkuZXZlcnkoKHYsIGkpID0+IHYgPT09IHZhbHVlQXJyYXlbaV0pO1xuICAgIGNhc2UgT3BlcmF0b3IuQ29udGFpbnM6XG4gICAgICByZXR1cm4gdmFsdWVBcnJheS5sZW5ndGg+MCAmJiB2YWx1ZUFycmF5LmV2ZXJ5KHYgPT4gdGFyZ2V0QXJyYXkuaW5jbHVkZXModikpO1xuICAgIGNhc2UgT3BlcmF0b3IuTm90Q29udGFpbnM6XG4gICAgICByZXR1cm4gdmFsdWVBcnJheS5sZW5ndGg9PT0wIHx8ICF2YWx1ZUFycmF5LmV2ZXJ5KHYgPT4gdGFyZ2V0QXJyYXkuaW5jbHVkZXModikpO1xuICAgIGRlZmF1bHQ6XG4gICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4gIC8qKlxuICAgKiDlkKvjgoDoqIjnrpdcbiAgICogQHBhcmFtIHRhcmdldFZhbHVlIFxuICAgKiBAcGFyYW0gdmFsdWUgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgY29udGFpbnModGFyZ2V0VmFsdWU6IGFueSwgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0YXJnZXRWYWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAgLyoqXG4gICAqIFN0YXJ0V2l0aOioiOeul1xuICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgXG4gICAqIEBwYXJhbSB2YWx1ZSBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdGFydFdpdGgodGFyZ2V0VmFsdWU6IGFueSwgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0YXJnZXRWYWx1ZS5zdGFydHNXaXRoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBFbmRzV2l0aOioiOeul1xuICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgXG4gICAqIEBwYXJhbSB2YWx1ZSBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBlbmRzV2l0aCh0YXJnZXRWYWx1ZTogYW55LCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRWYWx1ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRhcmdldFZhbHVlLmVuZHNXaXRoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSVNob3duUHJvcHN7XG4gICAgZmllbGQ6SUZpZWxkO1xuICAgIHNob3c6c3RyaW5nOyBcbiAgICBjb25kaXRpb246c3RyaW5nO1xufVxuLyoqXG4gKiDooajnpLrvvI/pnZ7ooajnpLrjgqLjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIEZpZWxkU2hvd25BY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gICAgcHJvcHM6SVNob3duUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi6KGo56S677yP6Z2e6KGo56S6XCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBzaG93OicnLFxuICAgICAgICAgICAgY29uZGl0aW9uOicnXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnc2hvdycgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJU2hvd25Qcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLmdldENvbmRpdGlvblJlc3VsdChjb250ZXh0KTtcbiAgICAgICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5zaG93PT09J+ihqOekuicpe1xuICAgICAgICAgICAgICAgICAgICBraW50b25lLmFwcC5yZWNvcmQuc2V0RmllbGRTaG93bih0aGlzLnByb3BzLmZpZWxkLmNvZGUsdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKHRoaXMucHJvcHMuc2hvdz09PSfpnZ7ooajnpLonKXtcbiAgICAgICAgICAgICAgICAgICAga2ludG9uZS5hcHAucmVjb3JkLnNldEZpZWxkU2hvd24odGhpcy5wcm9wcy5maWVsZC5jb2RlLGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH1cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IOadoeS7tuW8j+OCkuWun+ihjOOBmeOCi1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQ6YW55KTpib29sZWFue1xuICAgICAgICBjb25zdCB0cmVlID10aGlzLmdldENvbmRpdGlvbih0aGlzLnByb3BzLmNvbmRpdGlvbik7XG4gICAgICAgIGlmKCF0cmVlKXtcbiAgICAgICAgICAgIC8v5p2h5Lu244KS6Kit5a6a44GV44KM44Gm44GE44G+44Gb44KTXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZSh0cmVlLnJvb3QsY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiDmnaHku7blvI/jg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldENvbmRpdGlvbihjb25kaXRpb246c3RyaW5nKTpDb25kaXRpb25UcmVlfG51bGx7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgQ29uZGl0aW9uVHJlZSgpO1xuICAgICAgICAgICAgdHJlZS5mcm9tSnNvbihjb25kaXRpb24pO1xuICAgICAgICAgICAgaWYodHJlZS5nZXRDb25kaXRpb25zKHRyZWUucm9vdCkubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbn1cbm5ldyBGaWVsZFNob3duQWN0aW9uKCk7IiwiXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgSUFjdGlvbiwgSUFjdGlvblByb3BlcnR5LCBJQWN0aW9uTm9kZSwgSUNvbnRleHQsIElBY3Rpb25SZXN1bHQgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IENvbmRpdGlvblRyZWUgfSBmcm9tICcuLi90eXBlcy9Db25kaXRpb25zJztcbi8qKlxuICog44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXG4gKi9cbmludGVyZmFjZSBJRXJyb3JTaG93UHJvcHMge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBjb25kaXRpb246IHN0cmluZztcbn0gICBcblxuZXhwb3J0IGNsYXNzIEVycm9yU2hvd0FjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xuICAgIG5hbWU6IHN0cmluZzsgXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdOyAvL+iwg+eUqOS7jmltcG9ydOWvvOWFpeWFs+S6juaYvuekuuexu+eahOWumuS5iVxuICAgIHByb3BzOiBJRXJyb3JTaG93UHJvcHM7Ly/ku47kuIrmlrnnmoRpbnRlcmZhY2Ug5a6a5LmJ6L+Z5LiqcHJvcHPmiYDpnIDopoHmjqXlj5fnmoTlsZ7mgKdcbiAgICBjb25zdHJ1Y3RvcigpIHsgLy/op6PmnoTlh73mlbDlrprkuYnpnIDopoHnmoTnsbvlkI1cbiAgICAgICAgdGhpcy5uYW1lID0gXCLjgqjjg6njg7zooajnpLpcIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xuICAgICAgICB0aGlzLnByb3BzID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgICAgICBjb25kaXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcigpOyAvL+mHjee9ruS7peS4iuazqOWGjOihqFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxuICAgICAqIEBwYXJhbSBldmVudCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LCBjb250ZXh0OiBJQ29udGV4dCk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4geyBcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgXG4gICAgICAgICAgICBjYW5OZXh0OiB0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnkgeyBcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2NvbmRpdGlvbicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHsgLy/lpoLmnpxtZXNzYWdl5Lul5Y+KY29uZGl0aW9u5Lik6ICF6YO95LiN5a2Y5Zyo55qE5oOF5Ya15LiLcmV0dXJuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUVycm9yU2hvd1Byb3BzOyBcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQpOyBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5p2h5Lu257WQ5p6c77yaXCIsY29uZGl0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25SZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5lcnJvciA9IHRoaXMucHJvcHMubWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICB9XG4gICAgLyoqXG4gICAgKiBcbiAgICAqIEBwYXJhbSBjb250ZXh0IOadoeS7tuW8j+OCkuWun+ihjOOBmeOCi1xuICAgICogQHJldHVybnMgXG4gICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLmdldENvbmRpdGlvbih0aGlzLnByb3BzLmNvbmRpdGlvbik7XG4gICAgICAgIGlmICghdHJlZSkge1xuICAgICAgICAgICAgLy/mnaHku7bjgpLoqK3lrprjgZXjgozjgabjgYTjgb7jgZvjgpNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmVlLmV2YWx1YXRlKHRyZWUucm9vdCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiDmnaHku7blvI/jg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb24oY29uZGl0aW9uOiBzdHJpbmcpOiBDb25kaXRpb25UcmVlIHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0cmVlID0gbmV3IENvbmRpdGlvblRyZWUoKTtcbiAgICAgICAgICAgIHRyZWUuZnJvbUpzb24oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIGlmICh0cmVlLmdldENvbmRpdGlvbnModHJlZS5yb290KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xuICAgIH1cblxufVxubmV3IEVycm9yU2hvd0FjdGlvbigpOyIsIlxuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBJQWN0aW9uLCBJQWN0aW9uUHJvcGVydHksIElBY3Rpb25Ob2RlLCBJQWN0aW9uUmVzdWx0LCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IFwiLi9idXR0b24tYWRkLmNzc1wiO1xuXG4vKipcbiAqIOODnOOCv+ODs+mFjee9ruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSUJ1dHRvbkFkZFByb3BzIHtcbiAgICAvL+ODnOOCv+ODs+ihqOekuuWQjVxuICAgIGJ1dHRvbk5hbWU6IHN0cmluZztcbiAgICBzcGFjZT86SVNwYWNlO1xuICAgIC8v6YWN572u5L2N572uXG4gICAgcG9zaXRpb246IHN0cmluZztcbiAgICAvL+OCpOODmeODs+ODiOWQjVxuICAgIGV2ZW50TmFtZTpzdHJpbmdcbn0gICBcblxuaW50ZXJmYWNlIElTcGFjZXtcbiAgICB0eXBlOnN0cmluZyxcbiAgICBlbGVtZW50SWQ6c3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBCdXR0b25BZGRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcbiAgICBuYW1lOiBzdHJpbmc7IFxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTsgXG4gICAgcHJvcHM6IElCdXR0b25BZGRQcm9wcztcbiAgICBjb25zdHJ1Y3RvcigpIHsgXG4gICAgICAgIHRoaXMubmFtZSA9IFwi44Oc44K/44Oz44Gu6YWN572uXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcbiAgICAgICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgICAgICAgIGJ1dHRvbk5hbWU6ICcnLFxuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxuICAgICAgICAgICAgZXZlbnROYW1lOicnXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxuICAgICAqIEBwYXJhbSBldmVudCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LGNvbnRleHQ6SUNvbnRleHQpOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHsgXG4gICAgICAgIGxldCByZXN1bHQgPSB7IFxuICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHsgXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzID0gYWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdidXR0b25OYW1lJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSAmJiAhKCdwb3NpdGlvbicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHsgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUJ1dHRvbkFkZFByb3BzOyBcbiAgICAgICAgICAgIC8v44Oc44K/44Oz44KS6YWN572u44GZ44KLXG4gICAgICAgICAgICBsZXQgYnV0dG9uU3BhY2U7XG4gICAgICAgICAgICBpZih0aGlzLnByb3BzLnNwYWNlICYmIHRoaXMucHJvcHMuc3BhY2UuZWxlbWVudElkKXtcbiAgICAgICAgICAgICAgICBidXR0b25TcGFjZSA9IGtpbnRvbmUuYXBwLnJlY29yZC5nZXRTcGFjZUVsZW1lbnQodGhpcy5wcm9wcy5zcGFjZS5lbGVtZW50SWQpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgYnV0dG9uU3BhY2UgPSBraW50b25lLmFwcC5yZWNvcmQuZ2V0SGVhZGVyTWVudVNwYWNlRWxlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIWJ1dHRvblNwYWNlKSByZXR1cm4gcmVzdWx0O1xuICBcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9JChgPGJ1dHRvbiBpZD0nJHt0aGlzLnByb3BzLmV2ZW50TmFtZX0nIGNsYXNzPSdhbGMtYnV0dG9uLW5vcm1hbCcgPiR7dGhpcy5wcm9wcy5idXR0b25OYW1lfTwvYnV0dG9uPmApO1xuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5wb3NpdGlvbj09PVwi5LiA55Wq5bem44Gr6L+95Yqg44GZ44KLXCIpe1xuICAgICAgICAgICAgICAgICQoYnV0dG9uU3BhY2UpLnByZXBlbmQoYnV0dG9uKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICQoYnV0dG9uU3BhY2UpLmFwcGVuZChidXR0b24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2xpY2tFdmVudE5hbWUgPSBgJHtldmVudC50eXBlfS5jdXN0b21CdXR0b25DbGljay4ke3RoaXMucHJvcHMuZXZlbnROYW1lfWA7XG4gICAgICAgICAgICBidXR0b24ub24oXCJjbGlja1wiLCgpPT57XG4gICAgICAgICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcihjbGlja0V2ZW50TmFtZSxldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICBcblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgfVxuXG59XG5uZXcgQnV0dG9uQWRkQWN0aW9uKCk7IiwiXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUNvbnRleHQsIElWYXJOYW1lIH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSUNvbmRpdGlvbntcbiAgICBjb25kaXRpb246c3RyaW5nO1xuICAgIHZlck5hbWU6SVZhck5hbWU7XG59XG4vKipcbiAqIOadoeS7tuWIhuWykOOCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklDb25kaXRpb247XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5p2h5Lu25byPXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgY29uZGl0aW9uOicnLFxuICAgICAgICAgICAgdmVyTmFtZTp7bmFtZTonJ31cbiAgICAgICAgfVxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxuICAgICAqIEBwYXJhbSBldmVudCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0PXtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDonJ1xuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2NvbmRpdGlvbicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQ29uZGl0aW9uO1xuICAgICAgICAgICAgLy/mnaHku7blvI/jga7oqIjnrpfntZDmnpzjgpLlj5blvpdcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnaHku7boqIjnrpfntZDmnpw6XCIsY29uZGl0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCl7XG4gICAgICAgICAgICAgICAgcmVzdWx0PSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Oifjga/jgYQnXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6J+OBhOOBhOOBiCdcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV09cmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY29udGV4dCDmnaHku7blvI/jgpLlrp/ooYzjgZnjgotcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDphbnkpOmJvb2xlYW57XG4gICAgICAgIGNvbnN0IHRyZWUgPXRoaXMuZ2V0Q29uZGl0aW9uKHRoaXMucHJvcHMuY29uZGl0aW9uKTtcbiAgICAgICAgaWYoIXRyZWUpe1xuICAgICAgICAgICAgLy/mnaHku7bjgpLoqK3lrprjgZXjgozjgabjgYTjgb7jgZvjgpNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmVlLmV2YWx1YXRlKHRyZWUucm9vdCxjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uIOadoeS7tuW8j+ODhOODquODvOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldENvbmRpdGlvbihjb25kaXRpb246c3RyaW5nKTpDb25kaXRpb25UcmVlfG51bGx7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgQ29uZGl0aW9uVHJlZSgpO1xuICAgICAgICAgICAgdHJlZS5mcm9tSnNvbihjb25kaXRpb24pO1xuICAgICAgICAgICAgaWYodHJlZS5nZXRDb25kaXRpb25zKHRyZWUucm9vdCkubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG4gICAgXG59XG5uZXcgQ29uZGl0aW9uQWN0aW9uKCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmluamVjdFBsYXRmb3JtRGVwcyA9IGV4cG9ydHMucGxhdGZvcm1EZXBzID0gdm9pZCAwO1xuZXhwb3J0cy5wbGF0Zm9ybURlcHMgPSB7XG4gICAgcmVhZEZpbGVGcm9tUGF0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBnZXRSZXF1ZXN0VG9rZW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG4gICAgZ2V0RGVmYXVsdEF1dGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG4gICAgYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBidWlsZEhlYWRlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG4gICAgYnVpbGRGb3JtRGF0YVZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxuICAgIGJ1aWxkQmFzZVVybDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBnZXRWZXJzaW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxufTtcbnZhciBpbmplY3RQbGF0Zm9ybURlcHMgPSBmdW5jdGlvbiAoZGVwcykge1xuICAgIGlmIChkZXBzLnJlYWRGaWxlRnJvbVBhdGgpIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMucmVhZEZpbGVGcm9tUGF0aCA9IGRlcHMucmVhZEZpbGVGcm9tUGF0aDtcbiAgICB9XG4gICAgaWYgKGRlcHMuZ2V0UmVxdWVzdFRva2VuKSB7XG4gICAgICAgIGV4cG9ydHMucGxhdGZvcm1EZXBzLmdldFJlcXVlc3RUb2tlbiA9IGRlcHMuZ2V0UmVxdWVzdFRva2VuO1xuICAgIH1cbiAgICBpZiAoZGVwcy5nZXREZWZhdWx0QXV0aCkge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5nZXREZWZhdWx0QXV0aCA9IGRlcHMuZ2V0RGVmYXVsdEF1dGg7XG4gICAgfVxuICAgIGlmIChkZXBzLmJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWcpIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyA9XG4gICAgICAgICAgICBkZXBzLmJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWc7XG4gICAgfVxuICAgIGlmIChkZXBzLmJ1aWxkSGVhZGVycykge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5idWlsZEhlYWRlcnMgPSBkZXBzLmJ1aWxkSGVhZGVycztcbiAgICB9XG4gICAgaWYgKGRlcHMuYnVpbGRGb3JtRGF0YVZhbHVlKSB7XG4gICAgICAgIGV4cG9ydHMucGxhdGZvcm1EZXBzLmJ1aWxkRm9ybURhdGFWYWx1ZSA9IGRlcHMuYnVpbGRGb3JtRGF0YVZhbHVlO1xuICAgIH1cbiAgICBpZiAoZGVwcy5idWlsZEJhc2VVcmwpIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuYnVpbGRCYXNlVXJsID0gZGVwcy5idWlsZEJhc2VVcmw7XG4gICAgfVxuICAgIGlmIChkZXBzLmdldFZlcnNpb24pIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuZ2V0VmVyc2lvbiA9IGRlcHMuZ2V0VmVyc2lvbjtcbiAgICB9XG59O1xuZXhwb3J0cy5pbmplY3RQbGF0Zm9ybURlcHMgPSBpbmplY3RQbGF0Zm9ybURlcHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvciA9IHZvaWQgMDtcbnZhciBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IocGxhdGZvcm0pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIlRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBcIi5jb25jYXQocGxhdGZvcm0sIFwiIGVudmlyb25tZW50XCIpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UpIHx8IHRoaXM7XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0N1c3RvbV9FcnJvcl9UeXBlc1xuICAgICAgICAvLyBNYWludGFpbnMgcHJvcGVyIHN0YWNrIHRyYWNlIGZvciB3aGVyZSBvdXIgZXJyb3Igd2FzIHRocm93biAob25seSBhdmFpbGFibGUgb24gVjgpXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoX3RoaXMsIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMubmFtZSA9IFwiVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXCI7XG4gICAgICAgIF90aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC93aWtpL0JyZWFraW5nLUNoYW5nZXMjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydHMuVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yID0gVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0gdHlwZU1hcCBbT2JqZWN0XSBNYXAgb2YgTUlNRSB0eXBlIC0+IEFycmF5W2V4dGVuc2lvbnNdXG4gKiBAcGFyYW0gLi4uXG4gKi9cbmZ1bmN0aW9uIE1pbWUoKSB7XG4gIHRoaXMuX3R5cGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fZXh0ZW5zaW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLmRlZmluZShhcmd1bWVudHNbaV0pO1xuICB9XG5cbiAgdGhpcy5kZWZpbmUgPSB0aGlzLmRlZmluZS5iaW5kKHRoaXMpO1xuICB0aGlzLmdldFR5cGUgPSB0aGlzLmdldFR5cGUuYmluZCh0aGlzKTtcbiAgdGhpcy5nZXRFeHRlbnNpb24gPSB0aGlzLmdldEV4dGVuc2lvbi5iaW5kKHRoaXMpO1xufVxuXG4vKipcbiAqIERlZmluZSBtaW1ldHlwZSAtPiBleHRlbnNpb24gbWFwcGluZ3MuICBFYWNoIGtleSBpcyBhIG1pbWUtdHlwZSB0aGF0IG1hcHNcbiAqIHRvIGFuIGFycmF5IG9mIGV4dGVuc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlLiAgVGhlIGZpcnN0IGV4dGVuc2lvbiBpc1xuICogdXNlZCBhcyB0aGUgZGVmYXVsdCBleHRlbnNpb24gZm9yIHRoZSB0eXBlLlxuICpcbiAqIGUuZy4gbWltZS5kZWZpbmUoeydhdWRpby9vZ2cnLCBbJ29nYScsICdvZ2cnLCAnc3B4J119KTtcbiAqXG4gKiBJZiBhIHR5cGUgZGVjbGFyZXMgYW4gZXh0ZW5zaW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLCBhbiBlcnJvciB3aWxsXG4gKiBiZSB0aHJvd24uICBUbyBzdXBwcmVzcyB0aGlzIGVycm9yIGFuZCBmb3JjZSB0aGUgZXh0ZW5zaW9uIHRvIGJlIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhlIG5ldyB0eXBlLCBwYXNzIGBmb3JjZWA9dHJ1ZS4gIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgcHJlZml4IHRoZVxuICogZXh0ZW5zaW9uIHdpdGggXCIqXCIgdG8gbWFwIHRoZSB0eXBlIHRvIGV4dGVuc2lvbiwgd2l0aG91dCBtYXBwaW5nIHRoZVxuICogZXh0ZW5zaW9uIHRvIHRoZSB0eXBlLlxuICpcbiAqIGUuZy4gbWltZS5kZWZpbmUoeydhdWRpby93YXYnLCBbJ3dhdiddfSwgeydhdWRpby94LXdhdicsIFsnKndhdiddfSk7XG4gKlxuICpcbiAqIEBwYXJhbSBtYXAgKE9iamVjdCkgdHlwZSBkZWZpbml0aW9uc1xuICogQHBhcmFtIGZvcmNlIChCb29sZWFuKSBpZiB0cnVlLCBmb3JjZSBvdmVycmlkaW5nIG9mIGV4aXN0aW5nIGRlZmluaXRpb25zXG4gKi9cbk1pbWUucHJvdG90eXBlLmRlZmluZSA9IGZ1bmN0aW9uKHR5cGVNYXAsIGZvcmNlKSB7XG4gIGZvciAobGV0IHR5cGUgaW4gdHlwZU1hcCkge1xuICAgIGxldCBleHRlbnNpb25zID0gdHlwZU1hcFt0eXBlXS5tYXAoZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcbiAgICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldO1xuXG4gICAgICAvLyAnKicgcHJlZml4ID0gbm90IHRoZSBwcmVmZXJyZWQgdHlwZSBmb3IgdGhpcyBleHRlbnNpb24uICBTbyBmaXh1cCB0aGVcbiAgICAgIC8vIGV4dGVuc2lvbiwgYW5kIHNraXAgaXQuXG4gICAgICBpZiAoZXh0WzBdID09PSAnKicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZm9yY2UgJiYgKGV4dCBpbiB0aGlzLl90eXBlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdBdHRlbXB0IHRvIGNoYW5nZSBtYXBwaW5nIGZvciBcIicgKyBleHQgK1xuICAgICAgICAgICdcIiBleHRlbnNpb24gZnJvbSBcIicgKyB0aGlzLl90eXBlc1tleHRdICsgJ1wiIHRvIFwiJyArIHR5cGUgK1xuICAgICAgICAgICdcIi4gUGFzcyBgZm9yY2U9dHJ1ZWAgdG8gYWxsb3cgdGhpcywgb3RoZXJ3aXNlIHJlbW92ZSBcIicgKyBleHQgK1xuICAgICAgICAgICdcIiBmcm9tIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgZm9yIFwiJyArIHR5cGUgKyAnXCIuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90eXBlc1tleHRdID0gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBVc2UgZmlyc3QgZXh0ZW5zaW9uIGFzIGRlZmF1bHRcbiAgICBpZiAoZm9yY2UgfHwgIXRoaXMuX2V4dGVuc2lvbnNbdHlwZV0pIHtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbMF07XG4gICAgICB0aGlzLl9leHRlbnNpb25zW3R5cGVdID0gKGV4dFswXSAhPT0gJyonKSA/IGV4dCA6IGV4dC5zdWJzdHIoMSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIExvb2t1cCBhIG1pbWUgdHlwZSBiYXNlZCBvbiBleHRlbnNpb25cbiAqL1xuTWltZS5wcm90b3R5cGUuZ2V0VHlwZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcGF0aCA9IFN0cmluZyhwYXRoKTtcbiAgbGV0IGxhc3QgPSBwYXRoLnJlcGxhY2UoL14uKlsvXFxcXF0vLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgbGV0IGV4dCA9IGxhc3QucmVwbGFjZSgvXi4qXFwuLywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgbGV0IGhhc1BhdGggPSBsYXN0Lmxlbmd0aCA8IHBhdGgubGVuZ3RoO1xuICBsZXQgaGFzRG90ID0gZXh0Lmxlbmd0aCA8IGxhc3QubGVuZ3RoIC0gMTtcblxuICByZXR1cm4gKGhhc0RvdCB8fCAhaGFzUGF0aCkgJiYgdGhpcy5fdHlwZXNbZXh0XSB8fCBudWxsO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gZmlsZSBleHRlbnNpb24gYXNzb2NpYXRlZCB3aXRoIGEgbWltZSB0eXBlXG4gKi9cbk1pbWUucHJvdG90eXBlLmdldEV4dGVuc2lvbiA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdHlwZSA9IC9eXFxzKihbXjtcXHNdKikvLnRlc3QodHlwZSkgJiYgUmVnRXhwLiQxO1xuICByZXR1cm4gdHlwZSAmJiB0aGlzLl9leHRlbnNpb25zW3R5cGUudG9Mb3dlckNhc2UoKV0gfHwgbnVsbDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTWltZTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1wiYXBwbGljYXRpb24vYW5kcmV3LWluc2V0XCI6W1wiZXpcIl0sXCJhcHBsaWNhdGlvbi9hcHBsaXh3YXJlXCI6W1wiYXdcIl0sXCJhcHBsaWNhdGlvbi9hdG9tK3htbFwiOltcImF0b21cIl0sXCJhcHBsaWNhdGlvbi9hdG9tY2F0K3htbFwiOltcImF0b21jYXRcIl0sXCJhcHBsaWNhdGlvbi9hdG9tZGVsZXRlZCt4bWxcIjpbXCJhdG9tZGVsZXRlZFwiXSxcImFwcGxpY2F0aW9uL2F0b21zdmMreG1sXCI6W1wiYXRvbXN2Y1wiXSxcImFwcGxpY2F0aW9uL2F0c2MtZHdkK3htbFwiOltcImR3ZFwiXSxcImFwcGxpY2F0aW9uL2F0c2MtaGVsZCt4bWxcIjpbXCJoZWxkXCJdLFwiYXBwbGljYXRpb24vYXRzYy1yc2F0K3htbFwiOltcInJzYXRcIl0sXCJhcHBsaWNhdGlvbi9iZG9jXCI6W1wiYmRvY1wiXSxcImFwcGxpY2F0aW9uL2NhbGVuZGFyK3htbFwiOltcInhjc1wiXSxcImFwcGxpY2F0aW9uL2NjeG1sK3htbFwiOltcImNjeG1sXCJdLFwiYXBwbGljYXRpb24vY2RmeCt4bWxcIjpbXCJjZGZ4XCJdLFwiYXBwbGljYXRpb24vY2RtaS1jYXBhYmlsaXR5XCI6W1wiY2RtaWFcIl0sXCJhcHBsaWNhdGlvbi9jZG1pLWNvbnRhaW5lclwiOltcImNkbWljXCJdLFwiYXBwbGljYXRpb24vY2RtaS1kb21haW5cIjpbXCJjZG1pZFwiXSxcImFwcGxpY2F0aW9uL2NkbWktb2JqZWN0XCI6W1wiY2RtaW9cIl0sXCJhcHBsaWNhdGlvbi9jZG1pLXF1ZXVlXCI6W1wiY2RtaXFcIl0sXCJhcHBsaWNhdGlvbi9jdS1zZWVtZVwiOltcImN1XCJdLFwiYXBwbGljYXRpb24vZGFzaCt4bWxcIjpbXCJtcGRcIl0sXCJhcHBsaWNhdGlvbi9kYXZtb3VudCt4bWxcIjpbXCJkYXZtb3VudFwiXSxcImFwcGxpY2F0aW9uL2RvY2Jvb2sreG1sXCI6W1wiZGJrXCJdLFwiYXBwbGljYXRpb24vZHNzYytkZXJcIjpbXCJkc3NjXCJdLFwiYXBwbGljYXRpb24vZHNzYyt4bWxcIjpbXCJ4ZHNzY1wiXSxcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHRcIjpbXCJlc1wiLFwiZWNtYVwiXSxcImFwcGxpY2F0aW9uL2VtbWEreG1sXCI6W1wiZW1tYVwiXSxcImFwcGxpY2F0aW9uL2Vtb3Rpb25tbCt4bWxcIjpbXCJlbW90aW9ubWxcIl0sXCJhcHBsaWNhdGlvbi9lcHViK3ppcFwiOltcImVwdWJcIl0sXCJhcHBsaWNhdGlvbi9leGlcIjpbXCJleGlcIl0sXCJhcHBsaWNhdGlvbi9leHByZXNzXCI6W1wiZXhwXCJdLFwiYXBwbGljYXRpb24vZmR0K3htbFwiOltcImZkdFwiXSxcImFwcGxpY2F0aW9uL2ZvbnQtdGRwZnJcIjpbXCJwZnJcIl0sXCJhcHBsaWNhdGlvbi9nZW8ranNvblwiOltcImdlb2pzb25cIl0sXCJhcHBsaWNhdGlvbi9nbWwreG1sXCI6W1wiZ21sXCJdLFwiYXBwbGljYXRpb24vZ3B4K3htbFwiOltcImdweFwiXSxcImFwcGxpY2F0aW9uL2d4ZlwiOltcImd4ZlwiXSxcImFwcGxpY2F0aW9uL2d6aXBcIjpbXCJnelwiXSxcImFwcGxpY2F0aW9uL2hqc29uXCI6W1wiaGpzb25cIl0sXCJhcHBsaWNhdGlvbi9oeXBlcnN0dWRpb1wiOltcInN0a1wiXSxcImFwcGxpY2F0aW9uL2lua21sK3htbFwiOltcImlua1wiLFwiaW5rbWxcIl0sXCJhcHBsaWNhdGlvbi9pcGZpeFwiOltcImlwZml4XCJdLFwiYXBwbGljYXRpb24vaXRzK3htbFwiOltcIml0c1wiXSxcImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZVwiOltcImphclwiLFwid2FyXCIsXCJlYXJcIl0sXCJhcHBsaWNhdGlvbi9qYXZhLXNlcmlhbGl6ZWQtb2JqZWN0XCI6W1wic2VyXCJdLFwiYXBwbGljYXRpb24vamF2YS12bVwiOltcImNsYXNzXCJdLFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiOltcImpzXCIsXCJtanNcIl0sXCJhcHBsaWNhdGlvbi9qc29uXCI6W1wianNvblwiLFwibWFwXCJdLFwiYXBwbGljYXRpb24vanNvbjVcIjpbXCJqc29uNVwiXSxcImFwcGxpY2F0aW9uL2pzb25tbCtqc29uXCI6W1wianNvbm1sXCJdLFwiYXBwbGljYXRpb24vbGQranNvblwiOltcImpzb25sZFwiXSxcImFwcGxpY2F0aW9uL2xncit4bWxcIjpbXCJsZ3JcIl0sXCJhcHBsaWNhdGlvbi9sb3N0K3htbFwiOltcImxvc3R4bWxcIl0sXCJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDBcIjpbXCJocXhcIl0sXCJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHByb1wiOltcImNwdFwiXSxcImFwcGxpY2F0aW9uL21hZHMreG1sXCI6W1wibWFkc1wiXSxcImFwcGxpY2F0aW9uL21hbmlmZXN0K2pzb25cIjpbXCJ3ZWJtYW5pZmVzdFwiXSxcImFwcGxpY2F0aW9uL21hcmNcIjpbXCJtcmNcIl0sXCJhcHBsaWNhdGlvbi9tYXJjeG1sK3htbFwiOltcIm1yY3hcIl0sXCJhcHBsaWNhdGlvbi9tYXRoZW1hdGljYVwiOltcIm1hXCIsXCJuYlwiLFwibWJcIl0sXCJhcHBsaWNhdGlvbi9tYXRobWwreG1sXCI6W1wibWF0aG1sXCJdLFwiYXBwbGljYXRpb24vbWJveFwiOltcIm1ib3hcIl0sXCJhcHBsaWNhdGlvbi9tZWRpYXNlcnZlcmNvbnRyb2wreG1sXCI6W1wibXNjbWxcIl0sXCJhcHBsaWNhdGlvbi9tZXRhbGluayt4bWxcIjpbXCJtZXRhbGlua1wiXSxcImFwcGxpY2F0aW9uL21ldGFsaW5rNCt4bWxcIjpbXCJtZXRhNFwiXSxcImFwcGxpY2F0aW9uL21ldHMreG1sXCI6W1wibWV0c1wiXSxcImFwcGxpY2F0aW9uL21tdC1hZWkreG1sXCI6W1wibWFlaVwiXSxcImFwcGxpY2F0aW9uL21tdC11c2QreG1sXCI6W1wibXVzZFwiXSxcImFwcGxpY2F0aW9uL21vZHMreG1sXCI6W1wibW9kc1wiXSxcImFwcGxpY2F0aW9uL21wMjFcIjpbXCJtMjFcIixcIm1wMjFcIl0sXCJhcHBsaWNhdGlvbi9tcDRcIjpbXCJtcDRzXCIsXCJtNHBcIl0sXCJhcHBsaWNhdGlvbi9tc3dvcmRcIjpbXCJkb2NcIixcImRvdFwiXSxcImFwcGxpY2F0aW9uL214ZlwiOltcIm14ZlwiXSxcImFwcGxpY2F0aW9uL24tcXVhZHNcIjpbXCJucVwiXSxcImFwcGxpY2F0aW9uL24tdHJpcGxlc1wiOltcIm50XCJdLFwiYXBwbGljYXRpb24vbm9kZVwiOltcImNqc1wiXSxcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiOltcImJpblwiLFwiZG1zXCIsXCJscmZcIixcIm1hclwiLFwic29cIixcImRpc3RcIixcImRpc3R6XCIsXCJwa2dcIixcImJwa1wiLFwiZHVtcFwiLFwiZWxjXCIsXCJkZXBsb3lcIixcImV4ZVwiLFwiZGxsXCIsXCJkZWJcIixcImRtZ1wiLFwiaXNvXCIsXCJpbWdcIixcIm1zaVwiLFwibXNwXCIsXCJtc21cIixcImJ1ZmZlclwiXSxcImFwcGxpY2F0aW9uL29kYVwiOltcIm9kYVwiXSxcImFwcGxpY2F0aW9uL29lYnBzLXBhY2thZ2UreG1sXCI6W1wib3BmXCJdLFwiYXBwbGljYXRpb24vb2dnXCI6W1wib2d4XCJdLFwiYXBwbGljYXRpb24vb21kb2MreG1sXCI6W1wib21kb2NcIl0sXCJhcHBsaWNhdGlvbi9vbmVub3RlXCI6W1wib25ldG9jXCIsXCJvbmV0b2MyXCIsXCJvbmV0bXBcIixcIm9uZXBrZ1wiXSxcImFwcGxpY2F0aW9uL294cHNcIjpbXCJveHBzXCJdLFwiYXBwbGljYXRpb24vcDJwLW92ZXJsYXkreG1sXCI6W1wicmVsb1wiXSxcImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWxcIjpbXCJ4ZXJcIl0sXCJhcHBsaWNhdGlvbi9wZGZcIjpbXCJwZGZcIl0sXCJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkXCI6W1wicGdwXCJdLFwiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZVwiOltcImFzY1wiLFwic2lnXCJdLFwiYXBwbGljYXRpb24vcGljcy1ydWxlc1wiOltcInByZlwiXSxcImFwcGxpY2F0aW9uL3BrY3MxMFwiOltcInAxMFwiXSxcImFwcGxpY2F0aW9uL3BrY3M3LW1pbWVcIjpbXCJwN21cIixcInA3Y1wiXSxcImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZVwiOltcInA3c1wiXSxcImFwcGxpY2F0aW9uL3BrY3M4XCI6W1wicDhcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LWF0dHItY2VydFwiOltcImFjXCJdLFwiYXBwbGljYXRpb24vcGtpeC1jZXJ0XCI6W1wiY2VyXCJdLFwiYXBwbGljYXRpb24vcGtpeC1jcmxcIjpbXCJjcmxcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LXBraXBhdGhcIjpbXCJwa2lwYXRoXCJdLFwiYXBwbGljYXRpb24vcGtpeGNtcFwiOltcInBraVwiXSxcImFwcGxpY2F0aW9uL3Bscyt4bWxcIjpbXCJwbHNcIl0sXCJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0XCI6W1wiYWlcIixcImVwc1wiLFwicHNcIl0sXCJhcHBsaWNhdGlvbi9wcm92ZW5hbmNlK3htbFwiOltcInByb3Z4XCJdLFwiYXBwbGljYXRpb24vcHNrYyt4bWxcIjpbXCJwc2tjeG1sXCJdLFwiYXBwbGljYXRpb24vcmFtbCt5YW1sXCI6W1wicmFtbFwiXSxcImFwcGxpY2F0aW9uL3JkZit4bWxcIjpbXCJyZGZcIixcIm93bFwiXSxcImFwcGxpY2F0aW9uL3JlZ2luZm8reG1sXCI6W1wicmlmXCJdLFwiYXBwbGljYXRpb24vcmVsYXgtbmctY29tcGFjdC1zeW50YXhcIjpbXCJybmNcIl0sXCJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cyt4bWxcIjpbXCJybFwiXSxcImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzLWRpZmYreG1sXCI6W1wicmxkXCJdLFwiYXBwbGljYXRpb24vcmxzLXNlcnZpY2VzK3htbFwiOltcInJzXCJdLFwiYXBwbGljYXRpb24vcm91dGUtYXBkK3htbFwiOltcInJhcGRcIl0sXCJhcHBsaWNhdGlvbi9yb3V0ZS1zLXRzaWQreG1sXCI6W1wic2xzXCJdLFwiYXBwbGljYXRpb24vcm91dGUtdXNkK3htbFwiOltcInJ1c2RcIl0sXCJhcHBsaWNhdGlvbi9ycGtpLWdob3N0YnVzdGVyc1wiOltcImdiclwiXSxcImFwcGxpY2F0aW9uL3Jwa2ktbWFuaWZlc3RcIjpbXCJtZnRcIl0sXCJhcHBsaWNhdGlvbi9ycGtpLXJvYVwiOltcInJvYVwiXSxcImFwcGxpY2F0aW9uL3JzZCt4bWxcIjpbXCJyc2RcIl0sXCJhcHBsaWNhdGlvbi9yc3MreG1sXCI6W1wicnNzXCJdLFwiYXBwbGljYXRpb24vcnRmXCI6W1wicnRmXCJdLFwiYXBwbGljYXRpb24vc2JtbCt4bWxcIjpbXCJzYm1sXCJdLFwiYXBwbGljYXRpb24vc2N2cC1jdi1yZXF1ZXN0XCI6W1wic2NxXCJdLFwiYXBwbGljYXRpb24vc2N2cC1jdi1yZXNwb25zZVwiOltcInNjc1wiXSxcImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVxdWVzdFwiOltcInNwcVwiXSxcImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVzcG9uc2VcIjpbXCJzcHBcIl0sXCJhcHBsaWNhdGlvbi9zZHBcIjpbXCJzZHBcIl0sXCJhcHBsaWNhdGlvbi9zZW5tbCt4bWxcIjpbXCJzZW5tbHhcIl0sXCJhcHBsaWNhdGlvbi9zZW5zbWwreG1sXCI6W1wic2Vuc21seFwiXSxcImFwcGxpY2F0aW9uL3NldC1wYXltZW50LWluaXRpYXRpb25cIjpbXCJzZXRwYXlcIl0sXCJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb25cIjpbXCJzZXRyZWdcIl0sXCJhcHBsaWNhdGlvbi9zaGYreG1sXCI6W1wic2hmXCJdLFwiYXBwbGljYXRpb24vc2lldmVcIjpbXCJzaXZcIixcInNpZXZlXCJdLFwiYXBwbGljYXRpb24vc21pbCt4bWxcIjpbXCJzbWlcIixcInNtaWxcIl0sXCJhcHBsaWNhdGlvbi9zcGFycWwtcXVlcnlcIjpbXCJycVwiXSxcImFwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbFwiOltcInNyeFwiXSxcImFwcGxpY2F0aW9uL3NyZ3NcIjpbXCJncmFtXCJdLFwiYXBwbGljYXRpb24vc3Jncyt4bWxcIjpbXCJncnhtbFwiXSxcImFwcGxpY2F0aW9uL3NydSt4bWxcIjpbXCJzcnVcIl0sXCJhcHBsaWNhdGlvbi9zc2RsK3htbFwiOltcInNzZGxcIl0sXCJhcHBsaWNhdGlvbi9zc21sK3htbFwiOltcInNzbWxcIl0sXCJhcHBsaWNhdGlvbi9zd2lkK3htbFwiOltcInN3aWR0YWdcIl0sXCJhcHBsaWNhdGlvbi90ZWkreG1sXCI6W1widGVpXCIsXCJ0ZWljb3JwdXNcIl0sXCJhcHBsaWNhdGlvbi90aHJhdWQreG1sXCI6W1widGZpXCJdLFwiYXBwbGljYXRpb24vdGltZXN0YW1wZWQtZGF0YVwiOltcInRzZFwiXSxcImFwcGxpY2F0aW9uL3RvbWxcIjpbXCJ0b21sXCJdLFwiYXBwbGljYXRpb24vdHJpZ1wiOltcInRyaWdcIl0sXCJhcHBsaWNhdGlvbi90dG1sK3htbFwiOltcInR0bWxcIl0sXCJhcHBsaWNhdGlvbi91Ympzb25cIjpbXCJ1YmpcIl0sXCJhcHBsaWNhdGlvbi91cmMtcmVzc2hlZXQreG1sXCI6W1wicnNoZWV0XCJdLFwiYXBwbGljYXRpb24vdXJjLXRhcmdldGRlc2MreG1sXCI6W1widGRcIl0sXCJhcHBsaWNhdGlvbi92b2ljZXhtbCt4bWxcIjpbXCJ2eG1sXCJdLFwiYXBwbGljYXRpb24vd2FzbVwiOltcIndhc21cIl0sXCJhcHBsaWNhdGlvbi93aWRnZXRcIjpbXCJ3Z3RcIl0sXCJhcHBsaWNhdGlvbi93aW5obHBcIjpbXCJobHBcIl0sXCJhcHBsaWNhdGlvbi93c2RsK3htbFwiOltcIndzZGxcIl0sXCJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWxcIjpbXCJ3c3BvbGljeVwiXSxcImFwcGxpY2F0aW9uL3hhbWwreG1sXCI6W1wieGFtbFwiXSxcImFwcGxpY2F0aW9uL3hjYXAtYXR0K3htbFwiOltcInhhdlwiXSxcImFwcGxpY2F0aW9uL3hjYXAtY2Fwcyt4bWxcIjpbXCJ4Y2FcIl0sXCJhcHBsaWNhdGlvbi94Y2FwLWRpZmYreG1sXCI6W1wieGRmXCJdLFwiYXBwbGljYXRpb24veGNhcC1lbCt4bWxcIjpbXCJ4ZWxcIl0sXCJhcHBsaWNhdGlvbi94Y2FwLW5zK3htbFwiOltcInhuc1wiXSxcImFwcGxpY2F0aW9uL3hlbmMreG1sXCI6W1wieGVuY1wiXSxcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiOltcInhodG1sXCIsXCJ4aHRcIl0sXCJhcHBsaWNhdGlvbi94bGlmZit4bWxcIjpbXCJ4bGZcIl0sXCJhcHBsaWNhdGlvbi94bWxcIjpbXCJ4bWxcIixcInhzbFwiLFwieHNkXCIsXCJybmdcIl0sXCJhcHBsaWNhdGlvbi94bWwtZHRkXCI6W1wiZHRkXCJdLFwiYXBwbGljYXRpb24veG9wK3htbFwiOltcInhvcFwiXSxcImFwcGxpY2F0aW9uL3hwcm9jK3htbFwiOltcInhwbFwiXSxcImFwcGxpY2F0aW9uL3hzbHQreG1sXCI6W1wiKnhzbFwiLFwieHNsdFwiXSxcImFwcGxpY2F0aW9uL3hzcGYreG1sXCI6W1wieHNwZlwiXSxcImFwcGxpY2F0aW9uL3h2K3htbFwiOltcIm14bWxcIixcInhodm1sXCIsXCJ4dm1sXCIsXCJ4dm1cIl0sXCJhcHBsaWNhdGlvbi95YW5nXCI6W1wieWFuZ1wiXSxcImFwcGxpY2F0aW9uL3lpbit4bWxcIjpbXCJ5aW5cIl0sXCJhcHBsaWNhdGlvbi96aXBcIjpbXCJ6aXBcIl0sXCJhdWRpby8zZ3BwXCI6W1wiKjNncHBcIl0sXCJhdWRpby9hZHBjbVwiOltcImFkcFwiXSxcImF1ZGlvL2FtclwiOltcImFtclwiXSxcImF1ZGlvL2Jhc2ljXCI6W1wiYXVcIixcInNuZFwiXSxcImF1ZGlvL21pZGlcIjpbXCJtaWRcIixcIm1pZGlcIixcImthclwiLFwicm1pXCJdLFwiYXVkaW8vbW9iaWxlLXhtZlwiOltcIm14bWZcIl0sXCJhdWRpby9tcDNcIjpbXCIqbXAzXCJdLFwiYXVkaW8vbXA0XCI6W1wibTRhXCIsXCJtcDRhXCJdLFwiYXVkaW8vbXBlZ1wiOltcIm1wZ2FcIixcIm1wMlwiLFwibXAyYVwiLFwibXAzXCIsXCJtMmFcIixcIm0zYVwiXSxcImF1ZGlvL29nZ1wiOltcIm9nYVwiLFwib2dnXCIsXCJzcHhcIixcIm9wdXNcIl0sXCJhdWRpby9zM21cIjpbXCJzM21cIl0sXCJhdWRpby9zaWxrXCI6W1wic2lsXCJdLFwiYXVkaW8vd2F2XCI6W1wid2F2XCJdLFwiYXVkaW8vd2F2ZVwiOltcIip3YXZcIl0sXCJhdWRpby93ZWJtXCI6W1wid2ViYVwiXSxcImF1ZGlvL3htXCI6W1wieG1cIl0sXCJmb250L2NvbGxlY3Rpb25cIjpbXCJ0dGNcIl0sXCJmb250L290ZlwiOltcIm90ZlwiXSxcImZvbnQvdHRmXCI6W1widHRmXCJdLFwiZm9udC93b2ZmXCI6W1wid29mZlwiXSxcImZvbnQvd29mZjJcIjpbXCJ3b2ZmMlwiXSxcImltYWdlL2FjZXNcIjpbXCJleHJcIl0sXCJpbWFnZS9hcG5nXCI6W1wiYXBuZ1wiXSxcImltYWdlL2F2aWZcIjpbXCJhdmlmXCJdLFwiaW1hZ2UvYm1wXCI6W1wiYm1wXCJdLFwiaW1hZ2UvY2dtXCI6W1wiY2dtXCJdLFwiaW1hZ2UvZGljb20tcmxlXCI6W1wiZHJsZVwiXSxcImltYWdlL2VtZlwiOltcImVtZlwiXSxcImltYWdlL2ZpdHNcIjpbXCJmaXRzXCJdLFwiaW1hZ2UvZzNmYXhcIjpbXCJnM1wiXSxcImltYWdlL2dpZlwiOltcImdpZlwiXSxcImltYWdlL2hlaWNcIjpbXCJoZWljXCJdLFwiaW1hZ2UvaGVpYy1zZXF1ZW5jZVwiOltcImhlaWNzXCJdLFwiaW1hZ2UvaGVpZlwiOltcImhlaWZcIl0sXCJpbWFnZS9oZWlmLXNlcXVlbmNlXCI6W1wiaGVpZnNcIl0sXCJpbWFnZS9oZWoya1wiOltcImhlajJcIl0sXCJpbWFnZS9oc2oyXCI6W1wiaHNqMlwiXSxcImltYWdlL2llZlwiOltcImllZlwiXSxcImltYWdlL2psc1wiOltcImpsc1wiXSxcImltYWdlL2pwMlwiOltcImpwMlwiLFwianBnMlwiXSxcImltYWdlL2pwZWdcIjpbXCJqcGVnXCIsXCJqcGdcIixcImpwZVwiXSxcImltYWdlL2pwaFwiOltcImpwaFwiXSxcImltYWdlL2pwaGNcIjpbXCJqaGNcIl0sXCJpbWFnZS9qcG1cIjpbXCJqcG1cIl0sXCJpbWFnZS9qcHhcIjpbXCJqcHhcIixcImpwZlwiXSxcImltYWdlL2p4clwiOltcImp4clwiXSxcImltYWdlL2p4cmFcIjpbXCJqeHJhXCJdLFwiaW1hZ2Uvanhyc1wiOltcImp4cnNcIl0sXCJpbWFnZS9qeHNcIjpbXCJqeHNcIl0sXCJpbWFnZS9qeHNjXCI6W1wianhzY1wiXSxcImltYWdlL2p4c2lcIjpbXCJqeHNpXCJdLFwiaW1hZ2Uvanhzc1wiOltcImp4c3NcIl0sXCJpbWFnZS9rdHhcIjpbXCJrdHhcIl0sXCJpbWFnZS9rdHgyXCI6W1wia3R4MlwiXSxcImltYWdlL3BuZ1wiOltcInBuZ1wiXSxcImltYWdlL3NnaVwiOltcInNnaVwiXSxcImltYWdlL3N2Zyt4bWxcIjpbXCJzdmdcIixcInN2Z3pcIl0sXCJpbWFnZS90MzhcIjpbXCJ0MzhcIl0sXCJpbWFnZS90aWZmXCI6W1widGlmXCIsXCJ0aWZmXCJdLFwiaW1hZ2UvdGlmZi1meFwiOltcInRmeFwiXSxcImltYWdlL3dlYnBcIjpbXCJ3ZWJwXCJdLFwiaW1hZ2Uvd21mXCI6W1wid21mXCJdLFwibWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIjpbXCJkaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIl0sXCJtZXNzYWdlL2dsb2JhbFwiOltcInU4bXNnXCJdLFwibWVzc2FnZS9nbG9iYWwtZGVsaXZlcnktc3RhdHVzXCI6W1widThkc25cIl0sXCJtZXNzYWdlL2dsb2JhbC1kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIjpbXCJ1OG1kblwiXSxcIm1lc3NhZ2UvZ2xvYmFsLWhlYWRlcnNcIjpbXCJ1OGhkclwiXSxcIm1lc3NhZ2UvcmZjODIyXCI6W1wiZW1sXCIsXCJtaW1lXCJdLFwibW9kZWwvM21mXCI6W1wiM21mXCJdLFwibW9kZWwvZ2x0Zitqc29uXCI6W1wiZ2x0ZlwiXSxcIm1vZGVsL2dsdGYtYmluYXJ5XCI6W1wiZ2xiXCJdLFwibW9kZWwvaWdlc1wiOltcImlnc1wiLFwiaWdlc1wiXSxcIm1vZGVsL21lc2hcIjpbXCJtc2hcIixcIm1lc2hcIixcInNpbG9cIl0sXCJtb2RlbC9tdGxcIjpbXCJtdGxcIl0sXCJtb2RlbC9vYmpcIjpbXCJvYmpcIl0sXCJtb2RlbC9zdGVwK3htbFwiOltcInN0cHhcIl0sXCJtb2RlbC9zdGVwK3ppcFwiOltcInN0cHpcIl0sXCJtb2RlbC9zdGVwLXhtbCt6aXBcIjpbXCJzdHB4elwiXSxcIm1vZGVsL3N0bFwiOltcInN0bFwiXSxcIm1vZGVsL3ZybWxcIjpbXCJ3cmxcIixcInZybWxcIl0sXCJtb2RlbC94M2QrYmluYXJ5XCI6W1wiKngzZGJcIixcIngzZGJ6XCJdLFwibW9kZWwveDNkK2Zhc3RpbmZvc2V0XCI6W1wieDNkYlwiXSxcIm1vZGVsL3gzZCt2cm1sXCI6W1wiKngzZHZcIixcIngzZHZ6XCJdLFwibW9kZWwveDNkK3htbFwiOltcIngzZFwiLFwieDNkelwiXSxcIm1vZGVsL3gzZC12cm1sXCI6W1wieDNkdlwiXSxcInRleHQvY2FjaGUtbWFuaWZlc3RcIjpbXCJhcHBjYWNoZVwiLFwibWFuaWZlc3RcIl0sXCJ0ZXh0L2NhbGVuZGFyXCI6W1wiaWNzXCIsXCJpZmJcIl0sXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiOltcImNvZmZlZVwiLFwibGl0Y29mZmVlXCJdLFwidGV4dC9jc3NcIjpbXCJjc3NcIl0sXCJ0ZXh0L2NzdlwiOltcImNzdlwiXSxcInRleHQvaHRtbFwiOltcImh0bWxcIixcImh0bVwiLFwic2h0bWxcIl0sXCJ0ZXh0L2phZGVcIjpbXCJqYWRlXCJdLFwidGV4dC9qc3hcIjpbXCJqc3hcIl0sXCJ0ZXh0L2xlc3NcIjpbXCJsZXNzXCJdLFwidGV4dC9tYXJrZG93blwiOltcIm1hcmtkb3duXCIsXCJtZFwiXSxcInRleHQvbWF0aG1sXCI6W1wibW1sXCJdLFwidGV4dC9tZHhcIjpbXCJtZHhcIl0sXCJ0ZXh0L24zXCI6W1wibjNcIl0sXCJ0ZXh0L3BsYWluXCI6W1widHh0XCIsXCJ0ZXh0XCIsXCJjb25mXCIsXCJkZWZcIixcImxpc3RcIixcImxvZ1wiLFwiaW5cIixcImluaVwiXSxcInRleHQvcmljaHRleHRcIjpbXCJydHhcIl0sXCJ0ZXh0L3J0ZlwiOltcIipydGZcIl0sXCJ0ZXh0L3NnbWxcIjpbXCJzZ21sXCIsXCJzZ21cIl0sXCJ0ZXh0L3NoZXhcIjpbXCJzaGV4XCJdLFwidGV4dC9zbGltXCI6W1wic2xpbVwiLFwic2xtXCJdLFwidGV4dC9zcGR4XCI6W1wic3BkeFwiXSxcInRleHQvc3R5bHVzXCI6W1wic3R5bHVzXCIsXCJzdHlsXCJdLFwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlc1wiOltcInRzdlwiXSxcInRleHQvdHJvZmZcIjpbXCJ0XCIsXCJ0clwiLFwicm9mZlwiLFwibWFuXCIsXCJtZVwiLFwibXNcIl0sXCJ0ZXh0L3R1cnRsZVwiOltcInR0bFwiXSxcInRleHQvdXJpLWxpc3RcIjpbXCJ1cmlcIixcInVyaXNcIixcInVybHNcIl0sXCJ0ZXh0L3ZjYXJkXCI6W1widmNhcmRcIl0sXCJ0ZXh0L3Z0dFwiOltcInZ0dFwiXSxcInRleHQveG1sXCI6W1wiKnhtbFwiXSxcInRleHQveWFtbFwiOltcInlhbWxcIixcInltbFwiXSxcInZpZGVvLzNncHBcIjpbXCIzZ3BcIixcIjNncHBcIl0sXCJ2aWRlby8zZ3BwMlwiOltcIjNnMlwiXSxcInZpZGVvL2gyNjFcIjpbXCJoMjYxXCJdLFwidmlkZW8vaDI2M1wiOltcImgyNjNcIl0sXCJ2aWRlby9oMjY0XCI6W1wiaDI2NFwiXSxcInZpZGVvL2lzby5zZWdtZW50XCI6W1wibTRzXCJdLFwidmlkZW8vanBlZ1wiOltcImpwZ3ZcIl0sXCJ2aWRlby9qcG1cIjpbXCIqanBtXCIsXCJqcGdtXCJdLFwidmlkZW8vbWoyXCI6W1wibWoyXCIsXCJtanAyXCJdLFwidmlkZW8vbXAydFwiOltcInRzXCJdLFwidmlkZW8vbXA0XCI6W1wibXA0XCIsXCJtcDR2XCIsXCJtcGc0XCJdLFwidmlkZW8vbXBlZ1wiOltcIm1wZWdcIixcIm1wZ1wiLFwibXBlXCIsXCJtMXZcIixcIm0ydlwiXSxcInZpZGVvL29nZ1wiOltcIm9ndlwiXSxcInZpZGVvL3F1aWNrdGltZVwiOltcInF0XCIsXCJtb3ZcIl0sXCJ2aWRlby93ZWJtXCI6W1wid2VibVwiXX07IiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgTWltZSA9IHJlcXVpcmUoJy4vTWltZScpO1xubW9kdWxlLmV4cG9ydHMgPSBuZXcgTWltZShyZXF1aXJlKCcuL3R5cGVzL3N0YW5kYXJkJykpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRWZXJzaW9uID0gZXhwb3J0cy5idWlsZEJhc2VVcmwgPSBleHBvcnRzLmJ1aWxkRm9ybURhdGFWYWx1ZSA9IGV4cG9ydHMuYnVpbGRIZWFkZXJzID0gZXhwb3J0cy5idWlsZFBsYXRmb3JtRGVwZW5kZW50Q29uZmlnID0gZXhwb3J0cy5nZXREZWZhdWx0QXV0aCA9IGV4cG9ydHMuZ2V0UmVxdWVzdFRva2VuID0gZXhwb3J0cy5yZWFkRmlsZUZyb21QYXRoID0gdm9pZCAwO1xudmFyIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xID0gcmVxdWlyZShcIi4vVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXCIpO1xudmFyIGxpdGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibWltZS9saXRlXCIpKTtcbnZhciBwYWNrYWdlX2pzb25fMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpKTtcbnZhciByZWFkRmlsZUZyb21QYXRoID0gZnVuY3Rpb24gKGZpbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcihcIkJyb3dzZXJcIik7XG59O1xuZXhwb3J0cy5yZWFkRmlsZUZyb21QYXRoID0gcmVhZEZpbGVGcm9tUGF0aDtcbnZhciBnZXRSZXF1ZXN0VG9rZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICBpZiAodHlwZW9mIGtpbnRvbmUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGtpbnRvbmUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiBraW50b25lLmdldFJlcXVlc3RUb2tlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywga2ludG9uZS5nZXRSZXF1ZXN0VG9rZW4oKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBnYXJvb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGdhcm9vbiAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdHlwZW9mICgoX2IgPSAoX2EgPSBnYXJvb24uY29ubmVjdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmtpbnRvbmUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5nZXRSZXF1ZXN0VG9rZW4pID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnYXJvb24uY29ubmVjdC5raW50b25lLmdldFJlcXVlc3RUb2tlbigpXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXNzaW9uIGF1dGhlbnRpY2F0aW9uIG11c3Qgc3BlY2lmeSBhIHJlcXVlc3QgdG9rZW5cIik7XG4gICAgfSk7XG59KTsgfTtcbmV4cG9ydHMuZ2V0UmVxdWVzdFRva2VuID0gZ2V0UmVxdWVzdFRva2VuO1xudmFyIGdldERlZmF1bHRBdXRoID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwic2Vzc2lvblwiLFxuICAgIH07XG59O1xuZXhwb3J0cy5nZXREZWZhdWx0QXV0aCA9IGdldERlZmF1bHRBdXRoO1xudmFyIGJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xufTtcbmV4cG9ydHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyA9IGJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWc7XG52YXIgYnVpbGRIZWFkZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbn07XG5leHBvcnRzLmJ1aWxkSGVhZGVycyA9IGJ1aWxkSGVhZGVycztcbnZhciBidWlsZEZvcm1EYXRhVmFsdWUgPSBmdW5jdGlvbiAoZGF0YSwgZmlsZU5hbWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChmaWxlTmFtZSkge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBsaXRlXzEuZGVmYXVsdC5nZXRUeXBlKGZpbGVOYW1lKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0sIG9wdGlvbnMpO1xufTtcbmV4cG9ydHMuYnVpbGRGb3JtRGF0YVZhbHVlID0gYnVpbGRGb3JtRGF0YVZhbHVlO1xudmFyIGJ1aWxkQmFzZVVybCA9IGZ1bmN0aW9uIChiYXNlVXJsKSB7XG4gICAgaWYgKGJhc2VVcmwpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VVcmw7XG4gICAgfVxuICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBiYXNlVXJsIHBhcmFtZXRlciBpcyByZXF1aXJlZCBmb3IgdGhpcyBlbnZpcm9ubWVudFwiKTtcbiAgICB9XG4gICAgdmFyIGhvc3QgPSBsb2NhdGlvbi5ob3N0LCBwcm90b2NvbCA9IGxvY2F0aW9uLnByb3RvY29sO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwcm90b2NvbCwgXCIvL1wiKS5jb25jYXQoaG9zdCk7XG59O1xuZXhwb3J0cy5idWlsZEJhc2VVcmwgPSBidWlsZEJhc2VVcmw7XG52YXIgZ2V0VmVyc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGFja2FnZV9qc29uXzEuZGVmYXVsdC52ZXJzaW9uO1xufTtcbmV4cG9ydHMuZ2V0VmVyc2lvbiA9IGdldFZlcnNpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5idWlsZFBhdGggPSB2b2lkIDA7XG52YXIgYnVpbGRQYXRoID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHZhciBlbmRwb2ludE5hbWUgPSBwYXJhbXMuZW5kcG9pbnROYW1lLCBndWVzdFNwYWNlSWQgPSBwYXJhbXMuZ3Vlc3RTcGFjZUlkLCBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXc7XG4gICAgdmFyIGd1ZXN0UGF0aCA9IGd1ZXN0U3BhY2VJZCAhPT0gdW5kZWZpbmVkID8gXCIvZ3Vlc3QvXCIuY29uY2F0KGd1ZXN0U3BhY2VJZCkgOiBcIlwiO1xuICAgIHZhciBwcmV2aWV3UGF0aCA9IHByZXZpZXcgPyBcIi9wcmV2aWV3XCIgOiBcIlwiO1xuICAgIHJldHVybiBcIi9rXCIuY29uY2F0KGd1ZXN0UGF0aCwgXCIvdjFcIikuY29uY2F0KHByZXZpZXdQYXRoLCBcIi9cIikuY29uY2F0KGVuZHBvaW50TmFtZSwgXCIuanNvblwiKTtcbn07XG5leHBvcnRzLmJ1aWxkUGF0aCA9IGJ1aWxkUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVybC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJhc2VDbGllbnQgPSB2b2lkIDA7XG52YXIgdXJsXzEgPSByZXF1aXJlKFwiLi4vdXJsXCIpO1xudmFyIEJhc2VDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZUNsaWVudChjbGllbnQsIGd1ZXN0U3BhY2VJZCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy5ndWVzdFNwYWNlSWQgPSBndWVzdFNwYWNlSWQ7XG4gICAgfVxuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiAoMCwgdXJsXzEuYnVpbGRQYXRoKShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcGFyYW1zKSwgeyBndWVzdFNwYWNlSWQ6IHRoaXMuZ3Vlc3RTcGFjZUlkIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGVuZHBvaW50IGZvciB0aGUgQVBJIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZ3Vlc3Qgc3BhY2UgVVJMLlxuICAgICAqIE90aGVyd2lzZSwgcGxlYXNlIHVzZSBgYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZGAgaW5zdGVhZC5cbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmJ1aWxkUGF0aCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuICgwLCB1cmxfMS5idWlsZFBhdGgpKHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUNsaWVudDtcbn0oKSk7XG5leHBvcnRzLkJhc2VDbGllbnQgPSBCYXNlQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmFzZUNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CdWxrUmVxdWVzdENsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIEJ1bGtSZXF1ZXN0Q2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCdWxrUmVxdWVzdENsaWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCdWxrUmVxdWVzdENsaWVudChjbGllbnQsIGd1ZXN0U3BhY2VJZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjbGllbnQsIGd1ZXN0U3BhY2VJZCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuUkVRVUVTVFNfTEVOR1RIX0xJTUlUID0gMjA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQnVsa1JlcXVlc3RDbGllbnQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByZXF1ZXN0c1BhcmFtID0gcGFyYW1zLnJlcXVlc3RzO1xuICAgICAgICB2YXIgcmVxdWVzdHMgPSByZXF1ZXN0c1BhcmFtLm1hcChmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKFwiZW5kcG9pbnROYW1lXCIgaW4gcmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHZhciBlbmRwb2ludE5hbWUgPSByZXF1ZXN0LmVuZHBvaW50TmFtZSwgcmVzdCA9IF9fcmVzdChyZXF1ZXN0LCBbXCJlbmRwb2ludE5hbWVcIl0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbih7IGFwaTogX3RoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7IGVuZHBvaW50TmFtZTogZW5kcG9pbnROYW1lIH0pIH0sIHJlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYnVsa1JlcXVlc3RcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHsgcmVxdWVzdHM6IHJlcXVlc3RzIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEJ1bGtSZXF1ZXN0Q2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5CdWxrUmVxdWVzdENsaWVudCA9IEJ1bGtSZXF1ZXN0Q2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnVsa1JlcXVlc3RDbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFwcENsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIEFwcENsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXBwQ2xpZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFwcENsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2ZpZWxkc1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuYWRkRm9ybUZpZWxkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2ZpZWxkc1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZUZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvZm9ybS9maWVsZHNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmRlbGV0ZUZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvZm9ybS9maWVsZHNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEZvcm1MYXlvdXQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2xheW91dFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlRm9ybUxheW91dCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2xheW91dFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0Vmlld3MgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC92aWV3c1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVZpZXdzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL3ZpZXdzXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRBcHAgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHBcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0QXBwcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcHNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuYWRkQXBwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSwgc3BhY2UsIHBhdGgsIHNwYWNlUGF0aCwgZGVmYXVsdFRocmVhZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJhbXMubmFtZSwgc3BhY2UgPSBwYXJhbXMuc3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZVBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5nZXQoc3BhY2VQYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUaHJlYWQgPSAoX2Euc2VudCgpKS5kZWZhdWx0VGhyZWFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgX19hc3NpZ24oX19hc3NpZ24oe30sIHBhcmFtcyksIHsgdGhyZWFkOiBkZWZhdWx0VGhyZWFkIH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgeyBuYW1lOiBuYW1lIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcFNldHRpbmdzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvc2V0dGluZ3NcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBcHBTZXR0aW5ncyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zZXR0aW5nc1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UHJvY2Vzc01hbmFnZW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zdGF0dXNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVQcm9jZXNzTWFuYWdlbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zdGF0dXNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldERlcGxveVN0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9kZXBsb3lcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmRlcGxveUFwcCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9kZXBsb3lcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRGaWVsZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiZmllbGQvYWNsXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCBfX2Fzc2lnbih7fSwgcmVzdCkpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVGaWVsZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgLy8gTk9URTogV2hlbiBleGVjdXRpbmcgdGhpcyBBUEkgd2l0aG91dCBgcHJldmlld2AsXG4gICAgICAgIC8vIGFsbCBwcmUtbGl2ZSBhcHAncyBzZXR0aW5ncyB3aWxsIGJlIGRlcGxveWVkIHRvIGxpdmUgYXBwLlxuICAgICAgICAvLyBUaGlzIGJlaGF2aW9yIG1heSBub3QgYmUgd2hhdCB0aGUgdXNlcnMgZXhwZWN0ZWQsXG4gICAgICAgIC8vIHNvIHdlIGRpc2FibGUgaXQgdGVtcG9yYXJpbHkuXG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJmaWVsZC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjbFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQXBwQWNsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAvLyBOT1RFOiBXaGVuIGV4ZWN1dGluZyB0aGlzIEFQSSB3aXRob3V0IGBwcmV2aWV3YCxcbiAgICAgICAgLy8gYWxsIHByZS1saXZlIGFwcCdzIHNldHRpbmdzIHdpbGwgYmUgZGVwbG95ZWQgdG8gbGl2ZSBhcHAuXG4gICAgICAgIC8vIFRoaXMgYmVoYXZpb3IgbWF5IG5vdCBiZSB3aGF0IHRoZSB1c2VycyBleHBlY3RlZCxcbiAgICAgICAgLy8gc28gd2UgZGlzYWJsZSBpdCB0ZW1wb3JhcmlseS5cbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmV2YWx1YXRlUmVjb3Jkc0FjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHMvYWNsL2V2YWx1YXRlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldFJlY29yZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkL2FjbFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3JkQWNsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAvLyBOT1RFOiBXaGVuIGV4ZWN1dGluZyB0aGlzIEFQSSB3aXRob3V0IGBwcmV2aWV3YCxcbiAgICAgICAgLy8gYWxsIHByZS1saXZlIGFwcCdzIHNldHRpbmdzIHdpbGwgYmUgZGVwbG95ZWQgdG8gbGl2ZSBhcHAuXG4gICAgICAgIC8vIFRoaXMgYmVoYXZpb3IgbWF5IG5vdCBiZSB3aGF0IHRoZSB1c2VycyBleHBlY3RlZCxcbiAgICAgICAgLy8gc28gd2UgZGlzYWJsZSBpdCB0ZW1wb3JhcmlseS5cbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcEN1c3RvbWl6ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2N1c3RvbWl6ZVwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQXBwQ3VzdG9taXplID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2N1c3RvbWl6ZVwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0R2VuZXJhbE5vdGlmaWNhdGlvbnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL2dlbmVyYWxcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIF9fYXNzaWduKHt9LCByZXN0KSk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZUdlbmVyYWxOb3RpZmljYXRpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL25vdGlmaWNhdGlvbnMvZ2VuZXJhbFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UGVyUmVjb3JkTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL25vdGlmaWNhdGlvbnMvcGVyUmVjb3JkXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCByZXN0KTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlUGVyUmVjb3JkTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL3BlclJlY29yZFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UmVtaW5kZXJOb3RpZmljYXRpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvbm90aWZpY2F0aW9ucy9yZW1pbmRlclwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlbWluZGVyTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL3JlbWluZGVyXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRSZXBvcnRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvcmVwb3J0c1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlcG9ydHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvcmVwb3J0c1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0QXBwQWN0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjdGlvbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBcHBBY3Rpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjdGlvbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFkbWluTm90ZXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9hZG1pbk5vdGVzXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCByZXN0KTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQWRtaW5Ob3RlcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9hZG1pbk5vdGVzXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvbW92ZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UGx1Z2lucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL3BsdWdpbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5hZGRQbHVnaW5zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL3BsdWdpbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEFwcENsaWVudDtcbn0oQmFzZUNsaWVudF8xLkJhc2VDbGllbnQpKTtcbmV4cG9ydHMuQXBwQ2xpZW50ID0gQXBwQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXBwQ2xpZW50LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZUFib3J0U2VhcmNoRXJyb3IgPSB2b2lkIDA7XG52YXIgS2ludG9uZUFib3J0U2VhcmNoRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEtpbnRvbmVBYm9ydFNlYXJjaEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEtpbnRvbmVBYm9ydFNlYXJjaEVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IFwiS2ludG9uZUFib3J0U2VhcmNoRXJyb3JcIjtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC93aWtpL0JyZWFraW5nLUNoYW5nZXMjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgS2ludG9uZUFib3J0U2VhcmNoRXJyb3IucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gS2ludG9uZUFib3J0U2VhcmNoRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnRzLktpbnRvbmVBYm9ydFNlYXJjaEVycm9yID0gS2ludG9uZUFib3J0U2VhcmNoRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LaW50b25lQWJvcnRTZWFyY2hFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLktpbnRvbmVBbGxSZWNvcmRzRXJyb3IgPSB2b2lkIDA7XG52YXIgS2ludG9uZUFsbFJlY29yZHNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoS2ludG9uZUFsbFJlY29yZHNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBLaW50b25lQWxsUmVjb3Jkc0Vycm9yKHByb2Nlc3NlZFJlY29yZHNSZXN1bHQsIHVucHJvY2Vzc2VkUmVjb3JkcywgbnVtT2ZBbGxSZWNvcmRzLCBlcnJvciwgY2h1bmtMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG51bU9mUHJvY2Vzc2VkUmVjb3JkcyA9IG51bU9mQWxsUmVjb3JkcyAtIHVucHJvY2Vzc2VkUmVjb3Jkcy5sZW5ndGg7XG4gICAgICAgIHZhciBlcnJvckluZGV4ID0gS2ludG9uZUFsbFJlY29yZHNFcnJvci5leHRyYWN0RXJyb3JJbmRleChudW1PZlByb2Nlc3NlZFJlY29yZHMsIGVycm9yLCBjaHVua0xlbmd0aCk7XG4gICAgICAgIHZhciBtZXNzYWdlID0gS2ludG9uZUFsbFJlY29yZHNFcnJvci5idWlsZEVycm9yTWVzc2FnZShudW1PZlByb2Nlc3NlZFJlY29yZHMsIG51bU9mQWxsUmVjb3JkcywgZXJyb3JJbmRleCk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IFwiS2ludG9uZUFsbFJlY29yZHNFcnJvclwiO1xuICAgICAgICBfdGhpcy5wcm9jZXNzZWRSZWNvcmRzUmVzdWx0ID0gcHJvY2Vzc2VkUmVjb3Jkc1Jlc3VsdDtcbiAgICAgICAgX3RoaXMudW5wcm9jZXNzZWRSZWNvcmRzID0gdW5wcm9jZXNzZWRSZWNvcmRzO1xuICAgICAgICBfdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICBfdGhpcy5lcnJvckluZGV4ID0gZXJyb3JJbmRleDtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIF90aGlzLm51bU9mUHJvY2Vzc2VkUmVjb3JkcyA9IG51bU9mUHJvY2Vzc2VkUmVjb3JkcztcbiAgICAgICAgX3RoaXMubnVtT2ZBbGxSZWNvcmRzID0gbnVtT2ZBbGxSZWNvcmRzO1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgICAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBLaW50b25lQWxsUmVjb3Jkc0Vycm9yLnBhcnNlRXJyb3JJbmRleCA9IGZ1bmN0aW9uIChlcnJvcnMpIHtcbiAgICAgICAgLy8gVE9ETzogdXNlIG1hdGNoQWxsIGFmdGVyIEVTMjAyMCBzdXBwb3J0XG4gICAgICAgIHZhciBlcnJvckluZGV4ZXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcktleSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGVycm9yS2V5Lm1hdGNoKC9yZWNvcmRzXFxbKFxcZCspXFxdLyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgZXJyb3JJbmRleGVzLnB1c2goTnVtYmVyKHJlc3VsdFsxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9ySW5kZXhlcy5sZW5ndGggPiAwID8gTWF0aC5taW4uYXBwbHkoTWF0aCwgZXJyb3JJbmRleGVzKSA6IG51bGw7XG4gICAgfTtcbiAgICBLaW50b25lQWxsUmVjb3Jkc0Vycm9yLmV4dHJhY3RFcnJvckluZGV4ID0gZnVuY3Rpb24gKG51bU9mUHJvY2Vzc2VkUmVjb3JkcywgZXJyb3IsIGNodW5rTGVuZ3RoKSB7XG4gICAgICAgIGlmIChlcnJvci5idWxrUmVxdWVzdEluZGV4ICE9PSB1bmRlZmluZWQgJiYgZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JQYXJzZVJlc3VsdCA9IEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IucGFyc2VFcnJvckluZGV4KGVycm9yLmVycm9ycyk7XG4gICAgICAgICAgICBpZiAoZXJyb3JQYXJzZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAobnVtT2ZQcm9jZXNzZWRSZWNvcmRzICtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYnVsa1JlcXVlc3RJbmRleCAqIGNodW5rTGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JQYXJzZVJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IuYnVpbGRFcnJvck1lc3NhZ2UgPSBmdW5jdGlvbiAobnVtT2ZQcm9jZXNzZWRSZWNvcmRzLCBudW1PZkFsbFJlY29yZHMsIGVycm9ySW5kZXgpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIlwiO1xuICAgICAgICBpZiAoZXJyb3JJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJBbiBlcnJvciBvY2N1cnJlZCBhdCByZWNvcmRzW1wiLmNvbmNhdChlcnJvckluZGV4LCBcIl0uIFwiKTtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlICs9IFwiXCIuY29uY2F0KG51bU9mUHJvY2Vzc2VkUmVjb3JkcywgXCIvXCIpLmNvbmNhdChudW1PZkFsbFJlY29yZHMsIFwiIHJlY29yZHMgYXJlIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH07XG4gICAgcmV0dXJuIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnRzLktpbnRvbmVBbGxSZWNvcmRzRXJyb3IgPSBLaW50b25lQWxsUmVjb3Jkc0Vycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2ludG9uZUFsbFJlY29yZHNFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLktpbnRvbmVSZXN0QVBJRXJyb3IgPSB2b2lkIDA7XG52YXIgS2ludG9uZVJlc3RBUElFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoS2ludG9uZVJlc3RBUElFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBLaW50b25lUmVzdEFQSUVycm9yKGVycm9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IEtpbnRvbmVSZXN0QVBJRXJyb3IuYnVpbGRFcnJvclJlc3BvbnNlRGF0ZVdpdGhJbmRleChlcnJvciksIGRhdGEgPSBfYS5kYXRhLCBidWxrUmVxdWVzdEluZGV4ID0gX2EuYnVsa1JlcXVlc3RJbmRleDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkYXRhLm1lc3NhZ2UpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5hbWUgPSBcIktpbnRvbmVSZXN0QVBJRXJyb3JcIjtcbiAgICAgICAgX3RoaXMuaWQgPSBkYXRhLmlkO1xuICAgICAgICBfdGhpcy5jb2RlID0gZGF0YS5jb2RlO1xuICAgICAgICBfdGhpcy5lcnJvcnMgPSBkYXRhLmVycm9ycztcbiAgICAgICAgX3RoaXMuc3RhdHVzID0gZXJyb3Iuc3RhdHVzO1xuICAgICAgICBfdGhpcy5idWxrUmVxdWVzdEluZGV4ID0gYnVsa1JlcXVlc3RJbmRleDtcbiAgICAgICAgX3RoaXMuaGVhZGVycyA9IGVycm9yLmhlYWRlcnM7XG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIltcIi5jb25jYXQoZXJyb3Iuc3RhdHVzLCBcIl0gW1wiKS5jb25jYXQoX3RoaXMuY29kZSwgXCJdIFwiKS5jb25jYXQoX3RoaXMubWVzc2FnZSwgXCIgKFwiKS5jb25jYXQoX3RoaXMuaWQsIFwiKVwiKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjQ3VzdG9tX0Vycm9yX1R5cGVzXG4gICAgICAgIC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgZm9yIHdoZXJlIG91ciBlcnJvciB3YXMgdGhyb3duIChvbmx5IGF2YWlsYWJsZSBvbiBWOClcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShfdGhpcywgS2ludG9uZVJlc3RBUElFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3dpa2kvQnJlYWtpbmctQ2hhbmdlcyNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAgICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBLaW50b25lUmVzdEFQSUVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgS2ludG9uZVJlc3RBUElFcnJvci5maW5kRXJyb3JSZXNwb25zZURhdGFXaXRoSW5kZXggPSBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXN1bHRzW2ldKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogZGF0YSwgYnVsa1JlcXVlc3RJbmRleDogaSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IEVycm9yKFwiTWlzc2luZyByZXNwb25zZSBkYXRhIGluIGByZXN1bHRzYC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIEtpbnRvbmUgUkVTVCBBUEkgQ2xpZW50LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIik7XG4gICAgfTtcbiAgICBLaW50b25lUmVzdEFQSUVycm9yLmJ1aWxkRXJyb3JSZXNwb25zZURhdGVXaXRoSW5kZXggPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKFwicmVzdWx0c1wiIGluIGVycm9yLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBLaW50b25lUmVzdEFQSUVycm9yLmZpbmRFcnJvclJlc3BvbnNlRGF0YVdpdGhJbmRleChlcnJvci5kYXRhLnJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IGVycm9yLmRhdGEgfTtcbiAgICB9O1xuICAgIHJldHVybiBLaW50b25lUmVzdEFQSUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUVycm9yID0gS2ludG9uZVJlc3RBUElFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtpbnRvbmVSZXN0QVBJRXJyb3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9LaW50b25lQWJvcnRTZWFyY2hFcnJvclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vS2ludG9uZUFsbFJlY29yZHNFcnJvclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vS2ludG9uZVJlc3RBUElFcnJvclwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVjb3JkQ2xpZW50ID0gdm9pZCAwO1xudmFyIGVycm9yXzEgPSByZXF1aXJlKFwiLi4vZXJyb3JcIik7XG52YXIgQmFzZUNsaWVudF8xID0gcmVxdWlyZShcIi4vQmFzZUNsaWVudFwiKTtcbnZhciBBRERfUkVDT1JEU19MSU1JVCA9IDEwMDtcbnZhciBVUERBVEVfUkVDT1JEU19MSU1JVCA9IDEwMDtcbnZhciBERUxFVEVfUkVDT1JEU19MSU1JVCA9IDEwMDtcbnZhciBHRVRfUkVDT1JEU19MSU1JVCA9IDUwMDtcbnZhciBSZWNvcmRDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlY29yZENsaWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZWNvcmRDbGllbnQoY2xpZW50LCBidWxrUmVxdWVzdENsaWVudCwgZ3Vlc3RTcGFjZUlkKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNsaWVudCwgZ3Vlc3RTcGFjZUlkKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5idWxrUmVxdWVzdENsaWVudCA9IGJ1bGtSZXF1ZXN0Q2xpZW50O1xuICAgICAgICBfdGhpcy5kaWRXYXJuTWF4aW11bU9mZnNldFZhbHVlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRSZWNvcmQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuYWRkUmVjb3JkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVSZWNvcmQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBzZXJ0UmVjb3JkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXBwLCB1cGRhdGVLZXksIHJlY29yZCwgcmVjb3JkcywgcmV2aXNpb247XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAgPSBwYXJhbXMuYXBwLCB1cGRhdGVLZXkgPSBwYXJhbXMudXBkYXRlS2V5LCByZWNvcmQgPSBwYXJhbXMucmVjb3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZWNvcmRzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBcIlwiLmNvbmNhdCh1cGRhdGVLZXkuZmllbGQsIFwiID0gXFxcIlwiKS5jb25jYXQodXBkYXRlS2V5LnZhbHVlLCBcIlxcXCJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzID0gKF9iLnNlbnQoKSkucmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlY29yZHMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVjb3Jkc1swXS4kaWQudHlwZSA9PT0gXCJfX0lEX19cIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy51cGRhdGVSZWNvcmQocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0gKF9iLnNlbnQoKSkucmV2aXNpb247XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBpZDogcmVjb3Jkc1swXS4kaWQudmFsdWUsIHJldmlzaW9uOiByZXZpc2lvbiB9XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGAkaWRgIGluIGBnZXRSZWNvcmRzYCByZXNwb25zZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIEtpbnRvbmUgUkVTVCBBUEkgQ2xpZW50LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuYWRkUmVjb3JkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IE9iamVjdC5hc3NpZ24oe30sIHJlY29yZCwgKF9hID0ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hW3VwZGF0ZUtleS5maWVsZF0gPSB7IHZhbHVlOiB1cGRhdGVLZXkudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBgcmVjb3Jkc2AgdHlwZSBpbiByZXR1cm4gdHlwZSBzaG91bGQgYmUgZmlsdGVyZWQgYnkgYGZpZWxkc2AuXG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGF0aCwgcmVzcG9uc2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YXJuTWF4aW11bU9mZnNldFZhbHVlSWZOZWVkZWQocGFyYW1zLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXNwb25zZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS53YXJuTWF4aW11bU9mZnNldFZhbHVlSWZOZWVkZWQgPSBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICB2YXIgcmVnZXhwID0gL29mZnNldFxccysoXFxkKykvaTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBxdWVyeS5tYXRjaChyZWdleHApO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpZFdhcm5NYXhpbXVtT2Zmc2V0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgICAgICAgICBOdW1iZXIocmVzdWx0WzFdKSA+IDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWRXYXJuTWF4aW11bU9mZnNldFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBUaGUgbWF4aW11bSBvZmZzZXQgdmFsdWUgd2lsbCBiZSBsaW1pdGVkIHRvIDEwLDAwMCBpbiB0aGUgZnV0dXJlLiBQbGVhc2UgdXNlIGBjcmVhdGVDdXJzb3IoKWAgYW5kIGBnZXRSZWNvcmRzQnlDdXJzb3IoKWAgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuYWRkUmVjb3JkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhdGgsIF9hLCBpZHMsIHJldmlzaW9ucztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpLCBpZHMgPSBfYS5pZHMsIHJldmlzaW9ucyA9IF9hLnJldmlzaW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkczogaWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbnM6IHJldmlzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogaWRzLm1hcChmdW5jdGlvbiAoaWQsIGkpIHsgcmV0dXJuICh7IGlkOiBpZCwgcmV2aXNpb246IHJldmlzaW9uc1tpXSB9KTsgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5kZWxldGVSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5jcmVhdGVDdXJzb3IgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzL2N1cnNvclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0UmVjb3Jkc0J5Q3Vyc29yID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkcy9jdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZGVsZXRlQ3Vyc29yID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkcy9jdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGUocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0QWxsUmVjb3JkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiwgb3JkZXJCeSwgX2EsIHdpdGhDdXJzb3IsIHJlc3QsIGNvbmRpdGlvblF1ZXJ5LCBxdWVyeTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBwYXJhbXMuY29uZGl0aW9uLCBvcmRlckJ5ID0gcGFyYW1zLm9yZGVyQnksIF9hID0gcGFyYW1zLndpdGhDdXJzb3IsIHdpdGhDdXJzb3IgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hLCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wiY29uZGl0aW9uXCIsIFwib3JkZXJCeVwiLCBcIndpdGhDdXJzb3JcIl0pO1xuICAgICAgICAgICAgICAgIGlmICghb3JkZXJCeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5nZXRBbGxSZWNvcmRzV2l0aElkKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgeyBjb25kaXRpb246IGNvbmRpdGlvbiB9KSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2l0aEN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25RdWVyeSA9IGNvbmRpdGlvbiA/IFwiXCIuY29uY2F0KGNvbmRpdGlvbiwgXCIgXCIpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBcIlwiLmNvbmNhdChjb25kaXRpb25RdWVyeSkuY29uY2F0KG9yZGVyQnkgPyBcIm9yZGVyIGJ5IFwiLmNvbmNhdChvcmRlckJ5KSA6IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5nZXRBbGxSZWNvcmRzV2l0aEN1cnNvcihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdCksIHsgcXVlcnk6IHF1ZXJ5IH0pKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmdldEFsbFJlY29yZHNXaXRoT2Zmc2V0KF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgeyBvcmRlckJ5OiBvcmRlckJ5LCBjb25kaXRpb246IGNvbmRpdGlvbiB9KSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRBbGxSZWNvcmRzV2l0aElkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxGaWVsZHMsIGNvbmRpdGlvbiwgcmVzdCwgZmllbGRzLCBjb25kaXRpb25RdWVyeSwgYWxsUmVjb3JkcywgbGFzdElkLCBxdWVyeSwgcmVzdWx0LCBsYXN0UmVjb3JkO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxGaWVsZHMgPSBwYXJhbXMuZmllbGRzLCBjb25kaXRpb24gPSBwYXJhbXMuY29uZGl0aW9uLCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wiZmllbGRzXCIsIFwiY29uZGl0aW9uXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IG9yaWdpbmFsRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kICRpZCBpZiAkaWQgZG9lc24ndCBleGlzdCBpbiBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDAgJiYgZmllbGRzLmluZGV4T2YoXCIkaWRcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBmaWVsZHMsIHRydWUpLCBbXCIkaWRcIl0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblF1ZXJ5ID0gY29uZGl0aW9uID8gXCIoXCIuY29uY2F0KGNvbmRpdGlvbiwgXCIpIGFuZCBcIikgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVjb3JkcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdElkID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJ1ZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IFwiXCIuY29uY2F0KGNvbmRpdGlvblF1ZXJ5LCBcIiRpZCA+IFwiKS5jb25jYXQobGFzdElkLCBcIiBvcmRlciBieSAkaWQgYXNjIGxpbWl0IFwiKS5jb25jYXQoR0VUX1JFQ09SRFNfTElNSVQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZWNvcmRzKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgeyBmaWVsZHM6IGZpZWxkcywgcXVlcnk6IHF1ZXJ5IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFJlY29yZHMgPSBhbGxSZWNvcmRzLmNvbmNhdChyZXN1bHQucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlY29yZHMubGVuZ3RoIDwgR0VUX1JFQ09SRFNfTElNSVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSZWNvcmQgPSByZXN1bHQucmVjb3Jkc1tyZXN1bHQucmVjb3Jkcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UmVjb3JkLiRpZC50eXBlID09PSBcIl9fSURfX1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdElkID0gbGFzdFJlY29yZC4kaWQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGAkaWRgIGluIGBnZXRSZWNvcmRzYCByZXNwb25zZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIEtpbnRvbmUgUkVTVCBBUEkgQ2xpZW50LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgYWxsUmVjb3Jkc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRBbGxSZWNvcmRzV2l0aE9mZnNldCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiwgb3JkZXJCeSwgcmVzdCwgY29uZGl0aW9uUXVlcnksIGFsbFJlY29yZHMsIG9mZnNldCwgcXVlcnksIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IHBhcmFtcy5jb25kaXRpb24sIG9yZGVyQnkgPSBwYXJhbXMub3JkZXJCeSwgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcImNvbmRpdGlvblwiLCBcIm9yZGVyQnlcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uUXVlcnkgPSBjb25kaXRpb24gPyBcIlwiLmNvbmNhdChjb25kaXRpb24sIFwiIFwiKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRydWUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBcIlwiLmNvbmNhdChjb25kaXRpb25RdWVyeSkuY29uY2F0KG9yZGVyQnkgPyBcIm9yZGVyIGJ5IFwiLmNvbmNhdChvcmRlckJ5LCBcIiBcIikgOiBcIlwiLCBcImxpbWl0IFwiKS5jb25jYXQoR0VUX1JFQ09SRFNfTElNSVQsIFwiIG9mZnNldCBcIikuY29uY2F0KG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFJlY29yZHMoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc3QpLCB7IHF1ZXJ5OiBxdWVyeSB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWNvcmRzID0gYWxsUmVjb3Jkcy5jb25jYXQocmVzdWx0LnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWNvcmRzLmxlbmd0aCA8IEdFVF9SRUNPUkRTX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gR0VUX1JFQ09SRFNfTElNSVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgYWxsUmVjb3Jkc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRBbGxSZWNvcmRzV2l0aEN1cnNvciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlkLCBhbGxSZWNvcmRzLCByZXN1bHQsIGVycm9yXzI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlQ3Vyc29yKHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IChfYS5zZW50KCkpLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsIDYsICwgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVjb3JkcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRydWUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZWNvcmRzQnlDdXJzb3IoeyBpZDogaWQgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWNvcmRzID0gYWxsUmVjb3Jkcy5jb25jYXQocmVzdWx0LnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGFsbFJlY29yZHNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kZWxldGVDdXJzb3IoeyBpZDogaWQgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8yO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZEFsbFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5yZWNvcmRzLmV2ZXJ5KGZ1bmN0aW9uIChyZWNvcmQpIHsgcmV0dXJuICFBcnJheS5pc0FycmF5KHJlY29yZCkgJiYgcmVjb3JkIGluc3RhbmNlb2YgT2JqZWN0OyB9KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgYHJlY29yZHNgIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5IG9mIG9iamVjdC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmFkZEFsbFJlY29yZHNSZWN1cnNpdmUocGFyYW1zLCBwYXJhbXMucmVjb3Jkcy5sZW5ndGgsIFtdKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZEFsbFJlY29yZHNSZWN1cnNpdmUgPSBmdW5jdGlvbiAocGFyYW1zLCBudW1PZkFsbFJlY29yZHMsIHJlc3VsdHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIENIVU5LX0xFTkdUSCwgYXBwLCByZWNvcmRzLCByZWNvcmRzQ2h1bmssIG5ld1Jlc3VsdHMsIGVfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIENIVU5LX0xFTkdUSCA9IHRoaXMuYnVsa1JlcXVlc3RDbGllbnQuUkVRVUVTVFNfTEVOR1RIX0xJTUlUICogQUREX1JFQ09SRFNfTElNSVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAgPSBwYXJhbXMuYXBwLCByZWNvcmRzID0gcGFyYW1zLnJlY29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzQ2h1bmsgPSByZWNvcmRzLnNsaWNlKDAsIENIVU5LX0xFTkdUSCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3Jkc0NodW5rLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHJlY29yZHM6IHJlc3VsdHMgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFkZEFsbFJlY29yZHNXaXRoQnVsa1JlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogcmVjb3Jkc0NodW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JfMS5LaW50b25lQWxsUmVjb3Jkc0Vycm9yKHsgcmVjb3JkczogcmVzdWx0cyB9LCByZWNvcmRzLCBudW1PZkFsbFJlY29yZHMsIGVfMSwgQUREX1JFQ09SRFNfTElNSVQpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmFkZEFsbFJlY29yZHNSZWN1cnNpdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHMuc2xpY2UoQ0hVTktfTEVOR1RIKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bU9mQWxsUmVjb3JkcywgcmVzdWx0cy5jb25jYXQobmV3UmVzdWx0cykpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZEFsbFJlY29yZHNXaXRoQnVsa1JlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZXBhcmF0ZWRSZWNvcmRzLCByZXF1ZXN0cywgcmVzdWx0cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlZFJlY29yZHMgPSB0aGlzLnNlcGFyYXRlQXJyYXlSZWN1cnNpdmUoQUREX1JFQ09SRFNfTElNSVQsIFtdLCBwYXJhbXMucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyA9IHNlcGFyYXRlZFJlY29yZHMubWFwKGZ1bmN0aW9uIChyZWNvcmRzKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogcmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWxrUmVxdWVzdENsaWVudC5zZW5kKHsgcmVxdWVzdHM6IHJlcXVlc3RzIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IChfYS5zZW50KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHJlc3VsdC5pZHMsIHJldmlzaW9ucyA9IHJlc3VsdC5yZXZpc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZHMubWFwKGZ1bmN0aW9uIChpZCwgaSkgeyByZXR1cm4gKHsgaWQ6IGlkLCByZXZpc2lvbjogcmV2aXNpb25zW2ldIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQocmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLnVwZGF0ZUFsbFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy51cGRhdGVBbGxSZWNvcmRzUmVjdXJzaXZlKHBhcmFtcywgcGFyYW1zLnJlY29yZHMubGVuZ3RoLCBbXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBbGxSZWNvcmRzUmVjdXJzaXZlID0gZnVuY3Rpb24gKHBhcmFtcywgbnVtT2ZBbGxSZWNvcmRzLCByZXN1bHRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBDSFVOS19MRU5HVEgsIGFwcCwgcmVjb3JkcywgcmVjb3Jkc0NodW5rLCBuZXdSZXN1bHRzLCBlXzI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19MRU5HVEggPSB0aGlzLmJ1bGtSZXF1ZXN0Q2xpZW50LlJFUVVFU1RTX0xFTkdUSF9MSU1JVCAqIFVQREFURV9SRUNPUkRTX0xJTUlUO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwID0gcGFyYW1zLmFwcCwgcmVjb3JkcyA9IHBhcmFtcy5yZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0NodW5rID0gcmVjb3Jkcy5zbGljZSgwLCBDSFVOS19MRU5HVEgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZHNDaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyByZWNvcmRzOiByZXN1bHRzIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy51cGRhdGVBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHNDaHVuayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yXzEuS2ludG9uZUFsbFJlY29yZHNFcnJvcih7IHJlY29yZHM6IHJlc3VsdHMgfSwgcmVjb3JkcywgbnVtT2ZBbGxSZWNvcmRzLCBlXzIsIFVQREFURV9SRUNPUkRTX0xJTUlUKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy51cGRhdGVBbGxSZWNvcmRzUmVjdXJzaXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzOiByZWNvcmRzLnNsaWNlKENIVU5LX0xFTkdUSCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBudW1PZkFsbFJlY29yZHMsIHJlc3VsdHMuY29uY2F0KG5ld1Jlc3VsdHMpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2VwYXJhdGVkUmVjb3JkcywgcmVxdWVzdHMsIHJlc3VsdHM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZWRSZWNvcmRzID0gdGhpcy5zZXBhcmF0ZUFycmF5UmVjdXJzaXZlKFVQREFURV9SRUNPUkRTX0xJTUlULCBbXSwgcGFyYW1zLnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgPSBzZXBhcmF0ZWRSZWNvcmRzLm1hcChmdW5jdGlvbiAocmVjb3JkcykgeyByZXR1cm4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogcmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWxrUmVxdWVzdENsaWVudC5zZW5kKHsgcmVxdWVzdHM6IHJlcXVlc3RzIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IChfYS5zZW50KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdC5yZWNvcmRzOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQocmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmRlbGV0ZUFsbFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUFsbFJlY29yZHNSZWN1cnNpdmUocGFyYW1zLCBwYXJhbXMucmVjb3Jkcy5sZW5ndGgpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5kZWxldGVBbGxSZWNvcmRzUmVjdXJzaXZlID0gZnVuY3Rpb24gKHBhcmFtcywgbnVtT2ZBbGxSZWNvcmRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBDSFVOS19MRU5HVEgsIGFwcCwgcmVjb3JkcywgcmVjb3Jkc0NodW5rLCBlXzM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19MRU5HVEggPSB0aGlzLmJ1bGtSZXF1ZXN0Q2xpZW50LlJFUVVFU1RTX0xFTkdUSF9MSU1JVCAqIERFTEVURV9SRUNPUkRTX0xJTUlUO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwID0gcGFyYW1zLmFwcCwgcmVjb3JkcyA9IHBhcmFtcy5yZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0NodW5rID0gcmVjb3Jkcy5zbGljZSgwLCBDSFVOS19MRU5HVEgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZHNDaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge31dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kZWxldGVBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHNDaHVuayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JfMS5LaW50b25lQWxsUmVjb3Jkc0Vycm9yKHt9LCByZWNvcmRzLCBudW1PZkFsbFJlY29yZHMsIGVfMywgREVMRVRFX1JFQ09SRFNfTElNSVQpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmRlbGV0ZUFsbFJlY29yZHNSZWN1cnNpdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHMuc2xpY2UoQ0hVTktfTEVOR1RIKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bU9mQWxsUmVjb3JkcyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZGVsZXRlQWxsUmVjb3Jkc1dpdGhCdWxrUmVxdWVzdCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlcGFyYXRlZFJlY29yZHMsIHJlcXVlc3RzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVkUmVjb3JkcyA9IHRoaXMuc2VwYXJhdGVBcnJheVJlY3Vyc2l2ZShERUxFVEVfUkVDT1JEU19MSU1JVCwgW10sIHBhcmFtcy5yZWNvcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzID0gc2VwYXJhdGVkUmVjb3Jkcy5tYXAoZnVuY3Rpb24gKHJlY29yZHMpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkczogcmVjb3Jkcy5tYXAoZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gcmVjb3JkLmlkOyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25zOiByZWNvcmRzLm1hcChmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiByZWNvcmQucmV2aXNpb247IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJ1bGtSZXF1ZXN0Q2xpZW50LnNlbmQoeyByZXF1ZXN0czogcmVxdWVzdHMgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5zZXBhcmF0ZUFycmF5UmVjdXJzaXZlID0gZnVuY3Rpb24gKHNpemUsIHNlcGFyYXRlZCwgYXJyYXkpIHtcbiAgICAgICAgdmFyIGNodW5rID0gYXJyYXkuc2xpY2UoMCwgc2l6ZSk7XG4gICAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzZXBhcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VwYXJhdGVBcnJheVJlY3Vyc2l2ZShzaXplLCBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIHNlcGFyYXRlZCwgdHJ1ZSksIFtjaHVua10sIGZhbHNlKSwgYXJyYXkuc2xpY2Uoc2l6ZSkpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5hZGRSZWNvcmRDb21tZW50ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkL2NvbW1lbnRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmRlbGV0ZVJlY29yZENvbW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmQvY29tbWVudFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRSZWNvcmRDb21tZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9jb21tZW50c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVSZWNvcmRBc3NpZ25lZXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmQvYXNzaWduZWVzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlY29yZFN0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9zdGF0dXNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3Jkc1N0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHMvc3RhdHVzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVjb3JkQ2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5SZWNvcmRDbGllbnQgPSBSZWNvcmRDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWNvcmRDbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TcGFjZUNsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIFNwYWNlQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTcGFjZUNsaWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTcGFjZUNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUuZ2V0U3BhY2UgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLnVwZGF0ZVNwYWNlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2VcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5kZWxldGVTcGFjZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUudXBkYXRlU3BhY2VCb2R5ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvYm9keVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmdldFNwYWNlTWVtYmVycyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlL21lbWJlcnNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS51cGRhdGVTcGFjZU1lbWJlcnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZS9tZW1iZXJzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUuYWRkVGhyZWFkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvdGhyZWFkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLnVwZGF0ZVRocmVhZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlL3RocmVhZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmFkZFRocmVhZENvbW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZS90aHJlYWQvY29tbWVudFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5hZGRHdWVzdHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImd1ZXN0c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5kZWxldGVHdWVzdHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImd1ZXN0c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLnVwZGF0ZVNwYWNlR3Vlc3RzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvZ3Vlc3RzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUuYWRkU3BhY2VGcm9tVGVtcGxhdGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInRlbXBsYXRlL3NwYWNlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFNwYWNlQ2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5TcGFjZUNsaWVudCA9IFNwYWNlQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VDbGllbnQuanMubWFwIiwiLyogZXNsaW50LWVudiBicm93c2VyICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnID8gc2VsZi5Gb3JtRGF0YSA6IHdpbmRvdy5Gb3JtRGF0YTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkZpbGVDbGllbnQgPSB2b2lkIDA7XG52YXIgZm9ybV9kYXRhXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImZvcm0tZGF0YVwiKSk7XG52YXIgcGxhdGZvcm1fMSA9IHJlcXVpcmUoXCIuLi9wbGF0Zm9ybVwiKTtcbnZhciBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9wbGF0Zm9ybS9VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JcIik7XG52YXIgQmFzZUNsaWVudF8xID0gcmVxdWlyZShcIi4vQmFzZUNsaWVudFwiKTtcbnZhciBGaWxlQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaWxlQ2xpZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpbGVDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgRmlsZUNsaWVudC5wcm90b3R5cGUudXBsb2FkRmlsZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhdGgsIGZvcm1EYXRhLCBfYSwgbmFtZV8xLCBkYXRhLCBlXzEsIF9iLCBuYW1lXzIsIGRhdGEsIGZpbGVEYXRhO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgZm9ybV9kYXRhXzEuZGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoXCJwYXRoXCIgaW4gcGFyYW1zLmZpbGUpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHBsYXRmb3JtXzEucGxhdGZvcm1EZXBzLnJlYWRGaWxlRnJvbVBhdGgocGFyYW1zLmZpbGUucGF0aCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9jLnNlbnQoKSwgbmFtZV8xID0gX2EubmFtZSwgZGF0YSA9IF9hLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGRhdGEsIG5hbWVfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVfMSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVwbG9hZEZpbGUgZG9lc24ndCBhbGxvdyB0byBhY2NlcHQgYSBmaWxlIHBhdGggaW4gXCIuY29uY2F0KGVfMS5wbGF0Zm9ybSwgXCIgZW52aXJvbm1lbnQuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBwYXJhbXMuZmlsZSwgbmFtZV8yID0gX2IubmFtZSwgZGF0YSA9IF9iLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRGF0YSA9IHBsYXRmb3JtXzEucGxhdGZvcm1EZXBzLmJ1aWxkRm9ybURhdGFWYWx1ZShkYXRhLCBuYW1lXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlRGF0YSwgbmFtZV8yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jbGllbnQucG9zdERhdGEocGF0aCwgZm9ybURhdGEpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBGaWxlQ2xpZW50LnByb3RvdHlwZS5kb3dubG9hZEZpbGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJmaWxlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0RGF0YShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbGVDbGllbnQ7XG59KEJhc2VDbGllbnRfMS5CYXNlQ2xpZW50KSk7XG5leHBvcnRzLkZpbGVDbGllbnQgPSBGaWxlQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZUNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBsdWdpbkNsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIFBsdWdpbkNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGx1Z2luQ2xpZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBsdWdpbkNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQbHVnaW5DbGllbnQucHJvdG90eXBlLmdldFBsdWdpbnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoeyBlbmRwb2ludE5hbWU6IFwicGx1Z2luc1wiIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBQbHVnaW5DbGllbnQucHJvdG90eXBlLmdldFJlcXVpcmVkUGx1Z2lucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7IGVuZHBvaW50TmFtZTogXCJwbHVnaW5zL3JlcXVpcmVkXCIgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFBsdWdpbkNsaWVudC5wcm90b3R5cGUuZ2V0QXBwcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7IGVuZHBvaW50TmFtZTogXCJwbHVnaW4vYXBwc1wiIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBQbHVnaW5DbGllbnQucHJvdG90eXBlLnVwZGF0ZVBsdWdpbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7IGVuZHBvaW50TmFtZTogXCJwbHVnaW5cIiB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUGx1Z2luQ2xpZW50LnByb3RvdHlwZS5pbnN0YWxsUGx1Z2luID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoKHsgZW5kcG9pbnROYW1lOiBcInBsdWdpblwiIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUGx1Z2luQ2xpZW50LnByb3RvdHlwZS51bmluc3RhbGxQbHVnaW4gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoeyBlbmRwb2ludE5hbWU6IFwicGx1Z2luXCIgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGUocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIHJldHVybiBQbHVnaW5DbGllbnQ7XG59KEJhc2VDbGllbnRfMS5CYXNlQ2xpZW50KSk7XG5leHBvcnRzLlBsdWdpbkNsaWVudCA9IFBsdWdpbkNsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBsdWdpbkNsaWVudC5qcy5tYXAiLCIvLyBBeGlvcyB2MS43LjcgQ29weXJpZ2h0IChjKSAyMDI0IE1hdHQgWmFicmlza2llIGFuZCBjb250cmlidXRvcnNcbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3Qge3RvU3RyaW5nfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7Z2V0UHJvdG90eXBlT2Z9ID0gT2JqZWN0O1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufTtcblxuY29uc3QgdHlwZU9mVGVzdCA9IHR5cGUgPT4gdGhpbmcgPT4gdHlwZW9mIHRoaW5nID09PSB0eXBlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3Qge2lzQXJyYXl9ID0gQXJyYXk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVbmRlZmluZWQgPSB0eXBlT2ZUZXN0KCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiBpc0Z1bmN0aW9uKHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNBcnJheUJ1ZmZlciA9IGtpbmRPZlRlc3QoJ0FycmF5QnVmZmVyJyk7XG5cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICBsZXQgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmIChpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyaW5nID0gdHlwZU9mVGVzdCgnc3RyaW5nJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVPZlRlc3QoJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNOdW1iZXIgPSB0eXBlT2ZUZXN0KCdudW1iZXInKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNPYmplY3QgPSAodGhpbmcpID0+IHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCb29sZWFuXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCb29sZWFuLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCb29sZWFuID0gdGhpbmcgPT4gdGhpbmcgPT09IHRydWUgfHwgdGhpbmcgPT09IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB7XG4gIGlmIChraW5kT2YodmFsKSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih2YWwpO1xuICByZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbCkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0RhdGUgPSBraW5kT2ZUZXN0KCdEYXRlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGUgPSBraW5kT2ZUZXN0KCdGaWxlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jsb2IgPSBraW5kT2ZUZXN0KCdCbG9iJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlTGlzdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlTGlzdCA9IGtpbmRPZlRlc3QoJ0ZpbGVMaXN0Jyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJlYW0gPSAodmFsKSA9PiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Zvcm1EYXRhID0gKHRoaW5nKSA9PiB7XG4gIGxldCBraW5kO1xuICByZXR1cm4gdGhpbmcgJiYgKFxuICAgICh0eXBlb2YgRm9ybURhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpbmcgaW5zdGFuY2VvZiBGb3JtRGF0YSkgfHwgKFxuICAgICAgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIChcbiAgICAgICAgKGtpbmQgPSBraW5kT2YodGhpbmcpKSA9PT0gJ2Zvcm1kYXRhJyB8fFxuICAgICAgICAvLyBkZXRlY3QgZm9ybS1kYXRhIGluc3RhbmNlXG4gICAgICAgIChraW5kID09PSAnb2JqZWN0JyAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRvU3RyaW5nKSAmJiB0aGluZy50b1N0cmluZygpID09PSAnW29iamVjdCBGb3JtRGF0YV0nKVxuICAgICAgKVxuICAgIClcbiAgKVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbmNvbnN0IFtpc1JlYWRhYmxlU3RyZWFtLCBpc1JlcXVlc3QsIGlzUmVzcG9uc2UsIGlzSGVhZGVyc10gPSBbJ1JlYWRhYmxlU3RyZWFtJywgJ1JlcXVlc3QnLCAnUmVzcG9uc2UnLCAnSGVhZGVycyddLm1hcChraW5kT2ZUZXN0KTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuY29uc3QgdHJpbSA9IChzdHIpID0+IHN0ci50cmltID9cbiAgc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywgJycpO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7YWxsT3duS2V5cyA9IGZhbHNlfSA9IHt9KSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGk7XG4gIGxldCBsO1xuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yIChpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBjb25zdCBrZXlzID0gYWxsT3duS2V5cyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqLCBrZXkpIHtcbiAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICBsZXQgX2tleTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBfa2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoa2V5ID09PSBfa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBfa2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgX2dsb2JhbCA9ICgoKSA9PiB7XG4gIC8qZXNsaW50IG5vLXVuZGVmOjAqL1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWxUaGlzO1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxufSkoKTtcblxuY29uc3QgaXNDb250ZXh0RGVmaW5lZCA9IChjb250ZXh0KSA9PiAhaXNVbmRlZmluZWQoY29udGV4dCkgJiYgY29udGV4dCAhPT0gX2dsb2JhbDtcblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICBjb25zdCB7Y2FzZWxlc3N9ID0gaXNDb250ZXh0RGVmaW5lZCh0aGlzKSAmJiB0aGlzIHx8IHt9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3QgYXNzaWduVmFsdWUgPSAodmFsLCBrZXkpID0+IHtcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBjYXNlbGVzcyAmJiBmaW5kS2V5KHJlc3VsdCwga2V5KSB8fCBrZXk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W3RhcmdldEtleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZShyZXN1bHRbdGFyZ2V0S2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWw7XG4gICAgfVxuICB9O1xuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGFyZ3VtZW50c1tpXSAmJiBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywge2FsbE93bktleXN9PSB7fSkgPT4ge1xuICBmb3JFYWNoKGIsICh2YWwsIGtleSkgPT4ge1xuICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9LCB7YWxsT3duS2V5c30pO1xuICByZXR1cm4gYTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGJ5dGUgb3JkZXIgbWFya2VyLiBUaGlzIGNhdGNoZXMgRUYgQkIgQkYgKHRoZSBVVEYtOCBCT00pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXG4gKi9cbmNvbnN0IHN0cmlwQk9NID0gKGNvbnRlbnQpID0+IHtcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59O1xuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2Rlc2NyaXB0b3JzXVxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBpbmhlcml0cyA9IChjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSA9PiB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgJ3N1cGVyJywge1xuICAgIHZhbHVlOiBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZVxuICB9KTtcbiAgcHJvcHMgJiYgT2JqZWN0LmFzc2lnbihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3BzKTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBlbmRzIHdpdGggdGhlIGNoYXJhY3RlcnMgb2YgYSBzcGVjaWZpZWQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IHNlYXJjaFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbj0gMF1cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZW5kc1dpdGggPSAoc3RyLCBzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKSA9PiB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbiA+IHN0ci5sZW5ndGgpIHtcbiAgICBwb3NpdGlvbiA9IHN0ci5sZW5ndGg7XG4gIH1cbiAgcG9zaXRpb24gLT0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcbiAgY29uc3QgbGFzdEluZGV4ID0gc3RyLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbik7XG4gIHJldHVybiBsYXN0SW5kZXggIT09IC0xICYmIGxhc3RJbmRleCA9PT0gcG9zaXRpb247XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgZnJvbSBhcnJheSBsaWtlIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICpcbiAqIEBwYXJhbSB7Kn0gW3RoaW5nXVxuICpcbiAqIEByZXR1cm5zIHs/QXJyYXl9XG4gKi9cbmNvbnN0IHRvQXJyYXkgPSAodGhpbmcpID0+IHtcbiAgaWYgKCF0aGluZykgcmV0dXJuIG51bGw7XG4gIGlmIChpc0FycmF5KHRoaW5nKSkgcmV0dXJuIHRoaW5nO1xuICBsZXQgaSA9IHRoaW5nLmxlbmd0aDtcbiAgaWYgKCFpc051bWJlcihpKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFyciA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBhcnJbaV0gPSB0aGluZ1tpXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufTtcblxuLyoqXG4gKiBDaGVja2luZyBpZiB0aGUgVWludDhBcnJheSBleGlzdHMgYW5kIGlmIGl0IGRvZXMsIGl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGVcbiAqIHRoaW5nIHBhc3NlZCBpbiBpcyBhbiBpbnN0YW5jZSBvZiBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIHtUeXBlZEFycmF5fVxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbmNvbnN0IGlzVHlwZWRBcnJheSA9IChUeXBlZEFycmF5ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIHRoaW5nID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXTtcblxuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgcGFpciA9IHJlc3VsdC52YWx1ZTtcbiAgICBmbi5jYWxsKG9iaiwgcGFpclswXSwgcGFpclsxXSk7XG4gIH1cbn07XG5cbi8qKlxuICogSXQgdGFrZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGEgc3RyaW5nLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1hdGNoZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxib29sZWFuPn1cbiAqL1xuY29uc3QgbWF0Y2hBbGwgPSAocmVnRXhwLCBzdHIpID0+IHtcbiAgbGV0IG1hdGNoZXM7XG4gIGNvbnN0IGFyciA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2hlcyA9IHJlZ0V4cC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2gobWF0Y2hlcyk7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufTtcblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICAgIHJldHVybiBwMS50b1VwcGVyQ2FzZSgpICsgcDI7XG4gICAgfVxuICApO1xufTtcblxuLyogQ3JlYXRpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSAoKHtoYXNPd25Qcm9wZXJ0eX0pID0+IChvYmosIHByb3ApID0+IGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGFsbCBtZXRob2RzIHJlYWQtb25seVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbmNvbnN0IGZyZWV6ZU1ldGhvZHMgPSAob2JqKSA9PiB7XG4gIHJlZHVjZURlc2NyaXB0b3JzKG9iaiwgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICAvLyBza2lwIHJlc3RyaWN0ZWQgcHJvcHMgaW4gc3RyaWN0IG1vZGVcbiAgICBpZiAoaXNGdW5jdGlvbihvYmopICYmIFsnYXJndW1lbnRzJywgJ2NhbGxlcicsICdjYWxsZWUnXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW25hbWVdO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoJ3dyaXRhYmxlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkZXNjcmlwdG9yLnNldCkge1xuICAgICAgZGVzY3JpcHRvci5zZXQgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcXCcnICsgbmFtZSArICdcXCcnKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHRvT2JqZWN0U2V0ID0gKGFycmF5T3JTdHJpbmcsIGRlbGltaXRlcikgPT4ge1xuICBjb25zdCBvYmogPSB7fTtcblxuICBjb25zdCBkZWZpbmUgPSAoYXJyKSA9PiB7XG4gICAgYXJyLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgb2JqW3ZhbHVlXSA9IHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuY29uc3QgdG9GaW5pdGVOdW1iZXIgPSAodmFsdWUsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUgPSArdmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59O1xuXG5jb25zdCBBTFBIQSA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7XG5cbmNvbnN0IERJR0lUID0gJzAxMjM0NTY3ODknO1xuXG5jb25zdCBBTFBIQUJFVCA9IHtcbiAgRElHSVQsXG4gIEFMUEhBLFxuICBBTFBIQV9ESUdJVDogQUxQSEEgKyBBTFBIQS50b1VwcGVyQ2FzZSgpICsgRElHSVRcbn07XG5cbmNvbnN0IGdlbmVyYXRlU3RyaW5nID0gKHNpemUgPSAxNiwgYWxwaGFiZXQgPSBBTFBIQUJFVC5BTFBIQV9ESUdJVCkgPT4ge1xuICBsZXQgc3RyID0gJyc7XG4gIGNvbnN0IHtsZW5ndGh9ID0gYWxwaGFiZXQ7XG4gIHdoaWxlIChzaXplLS0pIHtcbiAgICBzdHIgKz0gYWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIGxlbmd0aHwwXTtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YScgJiYgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSk7XG59XG5cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXJyYXkoMTApO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSwgaSkgPT4ge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmIChzdGFjay5pbmRleE9mKHNvdXJjZSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmKCEoJ3RvSlNPTicgaW4gc291cmNlKSkge1xuICAgICAgICBzdGFja1tpXSA9IHNvdXJjZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSwgaSArIDEpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YWNrW2ldID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfTtcblxuICByZXR1cm4gdmlzaXQob2JqLCAwKTtcbn07XG5cbmNvbnN0IGlzQXN5bmNGbiA9IGtpbmRPZlRlc3QoJ0FzeW5jRnVuY3Rpb24nKTtcblxuY29uc3QgaXNUaGVuYWJsZSA9ICh0aGluZykgPT5cbiAgdGhpbmcgJiYgKGlzT2JqZWN0KHRoaW5nKSB8fCBpc0Z1bmN0aW9uKHRoaW5nKSkgJiYgaXNGdW5jdGlvbih0aGluZy50aGVuKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLmNhdGNoKTtcblxuLy8gb3JpZ2luYWwgY29kZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RpZ2l0YWxCcmFpbkpTL0F4aW9zUHJvbWlzZS9ibG9iLzE2ZGVhYjEzNzEwZWMwOTc3OTkyMjEzMWYzZmE1OTU0MzIwZjgzYWIvbGliL3V0aWxzLmpzI0wxMS1MMzRcblxuY29uc3QgX3NldEltbWVkaWF0ZSA9ICgoc2V0SW1tZWRpYXRlU3VwcG9ydGVkLCBwb3N0TWVzc2FnZVN1cHBvcnRlZCkgPT4ge1xuICBpZiAoc2V0SW1tZWRpYXRlU3VwcG9ydGVkKSB7XG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbiAgfVxuXG4gIHJldHVybiBwb3N0TWVzc2FnZVN1cHBvcnRlZCA/ICgodG9rZW4sIGNhbGxiYWNrcykgPT4ge1xuICAgIF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHtzb3VyY2UsIGRhdGF9KSA9PiB7XG4gICAgICBpZiAoc291cmNlID09PSBfZ2xvYmFsICYmIGRhdGEgPT09IHRva2VuKSB7XG4gICAgICAgIGNhbGxiYWNrcy5sZW5ndGggJiYgY2FsbGJhY2tzLnNoaWZ0KCkoKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICByZXR1cm4gKGNiKSA9PiB7XG4gICAgICBjYWxsYmFja3MucHVzaChjYik7XG4gICAgICBfZ2xvYmFsLnBvc3RNZXNzYWdlKHRva2VuLCBcIipcIik7XG4gICAgfVxuICB9KShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsIFtdKSA6IChjYikgPT4gc2V0VGltZW91dChjYik7XG59KShcbiAgdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyxcbiAgaXNGdW5jdGlvbihfZ2xvYmFsLnBvc3RNZXNzYWdlKVxuKTtcblxuY29uc3QgYXNhcCA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayAhPT0gJ3VuZGVmaW5lZCcgP1xuICBxdWV1ZU1pY3JvdGFzay5iaW5kKF9nbG9iYWwpIDogKCB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5uZXh0VGljayB8fCBfc2V0SW1tZWRpYXRlKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqXG5cbnZhciB1dGlscyQxID0ge1xuICBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNCb29sZWFuLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZXF1ZXN0LFxuICBpc1Jlc3BvbnNlLFxuICBpc0hlYWRlcnMsXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RhdGUsXG4gIGlzRmlsZSxcbiAgaXNCbG9iLFxuICBpc1JlZ0V4cCxcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1R5cGVkQXJyYXksXG4gIGlzRmlsZUxpc3QsXG4gIGZvckVhY2gsXG4gIG1lcmdlLFxuICBleHRlbmQsXG4gIHRyaW0sXG4gIHN0cmlwQk9NLFxuICBpbmhlcml0cyxcbiAgdG9GbGF0T2JqZWN0LFxuICBraW5kT2YsXG4gIGtpbmRPZlRlc3QsXG4gIGVuZHNXaXRoLFxuICB0b0FycmF5LFxuICBmb3JFYWNoRW50cnksXG4gIG1hdGNoQWxsLFxuICBpc0hUTUxGb3JtLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaGFzT3duUHJvcDogaGFzT3duUHJvcGVydHksIC8vIGFuIGFsaWFzIHRvIGF2b2lkIEVTTGludCBuby1wcm90b3R5cGUtYnVpbHRpbnMgZGV0ZWN0aW9uXG4gIHJlZHVjZURlc2NyaXB0b3JzLFxuICBmcmVlemVNZXRob2RzLFxuICB0b09iamVjdFNldCxcbiAgdG9DYW1lbENhc2UsXG4gIG5vb3AsXG4gIHRvRmluaXRlTnVtYmVyLFxuICBmaW5kS2V5LFxuICBnbG9iYWw6IF9nbG9iYWwsXG4gIGlzQ29udGV4dERlZmluZWQsXG4gIEFMUEhBQkVULFxuICBnZW5lcmF0ZVN0cmluZyxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcFxufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIEF4aW9zRXJyb3IobWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5uYW1lID0gJ0F4aW9zRXJyb3InO1xuICBjb2RlICYmICh0aGlzLmNvZGUgPSBjb2RlKTtcbiAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICBpZiAocmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXMgPyByZXNwb25zZS5zdGF0dXMgOiBudWxsO1xuICB9XG59XG5cbnV0aWxzJDEuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMkMS50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1c1xuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUkMSA9IEF4aW9zRXJyb3IucHJvdG90eXBlO1xuY29uc3QgZGVzY3JpcHRvcnMgPSB7fTtcblxuW1xuICAnRVJSX0JBRF9PUFRJT05fVkFMVUUnLFxuICAnRVJSX0JBRF9PUFRJT04nLFxuICAnRUNPTk5BQk9SVEVEJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFUlJfTkVUV09SSycsXG4gICdFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTJyxcbiAgJ0VSUl9ERVBSRUNBVEVEJyxcbiAgJ0VSUl9CQURfUkVTUE9OU0UnLFxuICAnRVJSX0JBRF9SRVFVRVNUJyxcbiAgJ0VSUl9DQU5DRUxFRCcsXG4gICdFUlJfTk9UX1NVUFBPUlQnLFxuICAnRVJSX0lOVkFMSURfVVJMJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbl0uZm9yRWFjaChjb2RlID0+IHtcbiAgZGVzY3JpcHRvcnNbY29kZV0gPSB7dmFsdWU6IGNvZGV9O1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF4aW9zRXJyb3IsIGRlc2NyaXB0b3JzKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUkMSwgJ2lzQXhpb3NFcnJvcicsIHt2YWx1ZTogdHJ1ZX0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuQXhpb3NFcnJvci5mcm9tID0gKGVycm9yLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlLCBjdXN0b21Qcm9wcykgPT4ge1xuICBjb25zdCBheGlvc0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUkMSk7XG5cbiAgdXRpbHMkMS50b0ZsYXRPYmplY3QoZXJyb3IsIGF4aW9zRXJyb3IsIGZ1bmN0aW9uIGZpbHRlcihvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSBFcnJvci5wcm90b3R5cGU7XG4gIH0sIHByb3AgPT4ge1xuICAgIHJldHVybiBwcm9wICE9PSAnaXNBeGlvc0Vycm9yJztcbiAgfSk7XG5cbiAgQXhpb3NFcnJvci5jYWxsKGF4aW9zRXJyb3IsIGVycm9yLm1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gIGF4aW9zRXJyb3IuY2F1c2UgPSBlcnJvcjtcblxuICBheGlvc0Vycm9yLm5hbWUgPSBlcnJvci5uYW1lO1xuXG4gIGN1c3RvbVByb3BzICYmIE9iamVjdC5hc3NpZ24oYXhpb3NFcnJvciwgY3VzdG9tUHJvcHMpO1xuXG4gIHJldHVybiBheGlvc0Vycm9yO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0cmljdFxudmFyIGh0dHBBZGFwdGVyID0gbnVsbDtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscyQxLmlzUGxhaW5PYmplY3QodGhpbmcpIHx8IHV0aWxzJDEuaXNBcnJheSh0aGluZyk7XG59XG5cbi8qKlxuICogSXQgcmVtb3ZlcyB0aGUgYnJhY2tldHMgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IHdpdGhvdXQgdGhlIGJyYWNrZXRzLlxuICovXG5mdW5jdGlvbiByZW1vdmVCcmFja2V0cyhrZXkpIHtcbiAgcmV0dXJuIHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscyQxLmlzQXJyYXkoYXJyKSAmJiAhYXJyLnNvbWUoaXNWaXNpdGFibGUpO1xufVxuXG5jb25zdCBwcmVkaWNhdGVzID0gdXRpbHMkMS50b0ZsYXRPYmplY3QodXRpbHMkMSwge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzJDEuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZvcm1EYXRhID0gZm9ybURhdGEgfHwgbmV3IChGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzJDEudG9GbGF0T2JqZWN0KG9wdGlvbnMsIHtcbiAgICBtZXRhVG9rZW5zOiB0cnVlLFxuICAgIGRvdHM6IGZhbHNlLFxuICAgIGluZGV4ZXM6IGZhbHNlXG4gIH0sIGZhbHNlLCBmdW5jdGlvbiBkZWZpbmVkKG9wdGlvbiwgc291cmNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gICAgcmV0dXJuICF1dGlscyQxLmlzVW5kZWZpbmVkKHNvdXJjZVtvcHRpb25dKTtcbiAgfSk7XG5cbiAgY29uc3QgbWV0YVRva2VucyA9IG9wdGlvbnMubWV0YVRva2VucztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGNvbnN0IHZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3IgfHwgZGVmYXVsdFZpc2l0b3I7XG4gIGNvbnN0IGRvdHMgPSBvcHRpb25zLmRvdHM7XG4gIGNvbnN0IGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXM7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucy5CbG9iIHx8IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBCbG9iO1xuICBjb25zdCB1c2VCbG9iID0gX0Jsb2IgJiYgdXRpbHMkMS5pc1NwZWNDb21wbGlhbnRGb3JtKGZvcm1EYXRhKTtcblxuICBpZiAoIXV0aWxzJDEuaXNGdW5jdGlvbih2aXNpdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Zpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnJztcblxuICAgIGlmICh1dGlscyQxLmlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghdXNlQmxvYiAmJiB1dGlscyQxLmlzQmxvYih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXIodmFsdWUpIHx8IHV0aWxzJDEuaXNUeXBlZEFycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVzZUJsb2IgJiYgdHlwZW9mIEJsb2IgPT09ICdmdW5jdGlvbicgPyBuZXcgQmxvYihbdmFsdWVdKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCB2aXNpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0ga2V5XG4gICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAgICogQHRoaXMge0Zvcm1EYXRhfVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGVhY2ggcHJvcCBvZiB0aGUgdmFsdWUgcmVjdXJzaXZlbHlcbiAgICovXG4gIGZ1bmN0aW9uIGRlZmF1bHRWaXNpdG9yKHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBsZXQgYXJyID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgIXBhdGggJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAne30nKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gbWV0YVRva2VucyA/IGtleSA6IGtleS5zbGljZSgwLCAtMik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh1dGlscyQxLmlzQXJyYXkodmFsdWUpICYmIGlzRmxhdEFycmF5KHZhbHVlKSkgfHxcbiAgICAgICAgKCh1dGlscyQxLmlzRmlsZUxpc3QodmFsdWUpIHx8IHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAnW10nKSkgJiYgKGFyciA9IHV0aWxzJDEudG9BcnJheSh2YWx1ZSkpXG4gICAgICAgICkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IHJlbW92ZUJyYWNrZXRzKGtleSk7XG5cbiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gZWFjaChlbCwgaW5kZXgpIHtcbiAgICAgICAgICAhKHV0aWxzJDEuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIGluZGV4ZXMgPT09IHRydWUgPyByZW5kZXJLZXkoW2tleV0sIGluZGV4LCBkb3RzKSA6IChpbmRleGVzID09PSBudWxsID8ga2V5IDoga2V5ICsgJ1tdJyksXG4gICAgICAgICAgICBjb252ZXJ0VmFsdWUoZWwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNWaXNpdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQocmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cyksIGNvbnZlcnRWYWx1ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3RhY2sgPSBbXTtcblxuICBjb25zdCBleHBvc2VkSGVscGVycyA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlcywge1xuICAgIGRlZmF1bHRWaXNpdG9yLFxuICAgIGNvbnZlcnRWYWx1ZSxcbiAgICBpc1Zpc2l0YWJsZVxuICB9KTtcblxuICBmdW5jdGlvbiBidWlsZCh2YWx1ZSwgcGF0aCkge1xuICAgIGlmICh1dGlscyQxLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGF0aC5qb2luKCcuJykpO1xuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiBlYWNoKGVsLCBrZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9ICEodXRpbHMkMS5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIHZpc2l0b3IuY2FsbChcbiAgICAgICAgZm9ybURhdGEsIGVsLCB1dGlscyQxLmlzU3RyaW5nKGtleSkgPyBrZXkudHJpbSgpIDoga2V5LCBwYXRoLCBleHBvc2VkSGVscGVyc1xuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICBidWlsZChlbCwgcGF0aCA/IHBhdGguY29uY2F0KGtleSkgOiBba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIGlmICghdXRpbHMkMS5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGF0YSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgYnVpbGQob2JqKTtcblxuICByZXR1cm4gZm9ybURhdGE7XG59XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUkMShzdHIpIHtcbiAgY29uc3QgY2hhck1hcCA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgIFwiJ1wiOiAnJTI3JyxcbiAgICAnKCc6ICclMjgnLFxuICAgICcpJzogJyUyOScsXG4gICAgJ34nOiAnJTdFJyxcbiAgICAnJTIwJzogJysnLFxuICAgICclMDAnOiAnXFx4MDAnXG4gIH07XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKX5dfCUyMHwlMDAvZywgZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgICByZXR1cm4gY2hhck1hcFttYXRjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGFyYW1zIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBhIEZvcm1EYXRhIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEF4aW9zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5fcGFpcnMgPSBbXTtcblxuICBwYXJhbXMgJiYgdG9Gb3JtRGF0YShwYXJhbXMsIHRoaXMsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc1VSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG5cbnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fcGFpcnMucHVzaChbbmFtZSwgdmFsdWVdKTtcbn07XG5cbnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGVuY29kZXIpIHtcbiAgY29uc3QgX2VuY29kZSA9IGVuY29kZXIgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVyLmNhbGwodGhpcywgdmFsdWUsIGVuY29kZSQxKTtcbiAgfSA6IGVuY29kZSQxO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuLyoqXG4gKiBJdCByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjaGFyYWN0ZXJzIGA6YCwgYCRgLCBgLGAsIGArYCwgYFtgLCBhbmQgYF1gIHdpdGggdGhlaXJcbiAqIFVSSSBlbmNvZGVkIGNvdW50ZXJwYXJ0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIHZhbHVlIHRvIGJlIGVuY29kZWQuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcGFyYW0gez9vYmplY3R9IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICovXG5mdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgb3B0aW9ucykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIFxuICBjb25zdCBfZW5jb2RlID0gb3B0aW9ucyAmJiBvcHRpb25zLmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgY29uc3Qgc2VyaWFsaXplRm4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplO1xuXG4gIGxldCBzZXJpYWxpemVkUGFyYW1zO1xuXG4gIGlmIChzZXJpYWxpemVGbikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBzZXJpYWxpemVGbihwYXJhbXMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSB1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykgP1xuICAgICAgcGFyYW1zLnRvU3RyaW5nKCkgOlxuICAgICAgbmV3IEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykudG9TdHJpbmcoX2VuY29kZSk7XG4gIH1cblxuICBpZiAoc2VyaWFsaXplZFBhcmFtcykge1xuICAgIGNvbnN0IGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZihcIiNcIik7XG5cbiAgICBpZiAoaGFzaG1hcmtJbmRleCAhPT0gLTEpIHtcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNobWFya0luZGV4KTtcbiAgICB9XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuY2xhc3MgSW50ZXJjZXB0b3JNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gICAqL1xuICB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgICBmdWxmaWxsZWQsXG4gICAgICByZWplY3RlZCxcbiAgICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgICAgcnVuV2hlbjogb3B0aW9ucyA/IG9wdGlvbnMucnVuV2hlbiA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gICAqXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdG9yIHdhcyByZW1vdmVkLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgZWplY3QoaWQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGludGVyY2VwdG9ycyBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gICAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZvckVhY2goZm4pIHtcbiAgICB1dGlscyQxLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgICAgZm4oaCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIEludGVyY2VwdG9yTWFuYWdlciQxID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuXG52YXIgdHJhbnNpdGlvbmFsRGVmYXVsdHMgPSB7XG4gIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxuICBmb3JjZWRKU09OUGFyc2luZzogdHJ1ZSxcbiAgY2xhcmlmeVRpbWVvdXRFcnJvcjogZmFsc2Vcbn07XG5cbnZhciBVUkxTZWFyY2hQYXJhbXMkMSA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnID8gVVJMU2VhcmNoUGFyYW1zIDogQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG5cbnZhciBGb3JtRGF0YSQxID0gdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogbnVsbDtcblxudmFyIEJsb2IkMSA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiBudWxsO1xuXG52YXIgcGxhdGZvcm0kMSA9IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMkMSxcbiAgICBGb3JtRGF0YTogRm9ybURhdGEkMSxcbiAgICBCbG9iOiBCbG9iJDFcbiAgfSxcbiAgcHJvdG9jb2xzOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdibG9iJywgJ3VybCcsICdkYXRhJ11cbn07XG5cbmNvbnN0IGhhc0Jyb3dzZXJFbnYgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5jb25zdCBfbmF2aWdhdG9yID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yIHx8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9IGhhc0Jyb3dzZXJFbnYgJiZcbiAgKCFfbmF2aWdhdG9yIHx8IFsnUmVhY3ROYXRpdmUnLCAnTmF0aXZlU2NyaXB0JywgJ05TJ10uaW5kZXhPZihfbmF2aWdhdG9yLnByb2R1Y3QpIDwgMCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmNvbnN0IG9yaWdpbiA9IGhhc0Jyb3dzZXJFbnYgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG52YXIgdXRpbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgaGFzQnJvd3NlckVudjogaGFzQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52OiBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlckVudjogaGFzU3RhbmRhcmRCcm93c2VyRW52LFxuICBuYXZpZ2F0b3I6IF9uYXZpZ2F0b3IsXG4gIG9yaWdpbjogb3JpZ2luXG59KTtcblxudmFyIHBsYXRmb3JtID0ge1xuICAuLi51dGlscyxcbiAgLi4ucGxhdGZvcm0kMVxufTtcblxuZnVuY3Rpb24gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b0Zvcm1EYXRhKGRhdGEsIG5ldyBwbGF0Zm9ybS5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcygpLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aXNpdG9yOiBmdW5jdGlvbih2YWx1ZSwga2V5LCBwYXRoLCBoZWxwZXJzKSB7XG4gICAgICBpZiAocGxhdGZvcm0uaXNOb2RlICYmIHV0aWxzJDEuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscyQxLm1hdGNoQWxsKC9cXHcrfFxcWyhcXHcqKV0vZywgbmFtZSkubWFwKG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gPT09ICdbXScgPyAnJyA6IG1hdGNoWzFdIHx8IG1hdGNoWzBdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjb252ZXJ0IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheVRvT2JqZWN0KGFycikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG4gIGxldCBpO1xuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgbGV0IGtleTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBvYmpba2V5XSA9IGFycltrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBGb3JtRGF0YSBvYmplY3QgYW5kIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55PiB8IG51bGx9IFRoZSBjb252ZXJ0ZWQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmb3JtRGF0YVRvSlNPTihmb3JtRGF0YSkge1xuICBmdW5jdGlvbiBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldCwgaW5kZXgpIHtcbiAgICBsZXQgbmFtZSA9IHBhdGhbaW5kZXgrK107XG5cbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgaXNOdW1lcmljS2V5ID0gTnVtYmVyLmlzRmluaXRlKCtuYW1lKTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA+PSBwYXRoLmxlbmd0aDtcbiAgICBuYW1lID0gIW5hbWUgJiYgdXRpbHMkMS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubGVuZ3RoIDogbmFtZTtcblxuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIGlmICh1dGlscyQxLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzJDEuaXNPYmplY3QodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXRbbmFtZV0sIGluZGV4KTtcblxuICAgIGlmIChyZXN1bHQgJiYgdXRpbHMkMS5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IGFycmF5VG9PYmplY3QodGFyZ2V0W25hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgfVxuXG4gIGlmICh1dGlscyQxLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzJDEuaXNGdW5jdGlvbihmb3JtRGF0YS5lbnRyaWVzKSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoRW50cnkoZm9ybURhdGEsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgYnVpbGRQYXRoKHBhcnNlUHJvcFBhdGgobmFtZSksIHZhbHVlLCBvYmosIDApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nLCB0cmllcyB0byBwYXJzZSBpdCwgYW5kIGlmIGl0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgaW5wdXRcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmF3VmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgdGhlIHJhd1ZhbHVlLlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMkMS5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMkMS50cmltKHJhd1ZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lICE9PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChlbmNvZGVyIHx8IEpTT04uc3RyaW5naWZ5KShyYXdWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCcsICdmZXRjaCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSB8fCAnJztcbiAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscyQxLmlzT2JqZWN0KGRhdGEpO1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCAmJiB1dGlscyQxLmlzSFRNTEZvcm0oZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGb3JtRGF0YSA9IHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKTtcblxuICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc0Jsb2IoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscyQxLmlzRmlsZUxpc3QoZGF0YSkpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgIGlzRmlsZUxpc3QgPyB7J2ZpbGVzW10nOiBkYXRhfSA6IGRhdGEsXG4gICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICB0aGlzLmZvcm1TZXJpYWxpemVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCB8fCBoYXNKU09OQ29udGVudFR5cGUgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmICh1dGlscyQxLmlzUmVzcG9uc2UoZGF0YSkgfHwgdXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscyQxLmlzU3RyaW5nKGRhdGEpICYmICgoZm9yY2VkSlNPTlBhcnNpbmcgJiYgIXRoaXMucmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKSkge1xuICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzdHJpY3RKU09OUGFyc2luZykge1xuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIHRoaXMsIG51bGwsIHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuICBtYXhCb2R5TGVuZ3RoOiAtMSxcblxuICBlbnY6IHtcbiAgICBGb3JtRGF0YTogcGxhdGZvcm0uY2xhc3Nlcy5Gb3JtRGF0YSxcbiAgICBCbG9iOiBwbGF0Zm9ybS5jbGFzc2VzLkJsb2JcbiAgfSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9LFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzJDEuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCddLCAobWV0aG9kKSA9PiB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnZhciBkZWZhdWx0cyQxID0gZGVmYXVsdHM7XG5cbi8vIFJhd0F4aW9zSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbmNvbnN0IGlnbm9yZUR1cGxpY2F0ZU9mID0gdXRpbHMkMS50b09iamVjdFNldChbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG52YXIgcGFyc2VIZWFkZXJzID0gcmF3SGVhZGVycyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHt9O1xuICBsZXQga2V5O1xuICBsZXQgdmFsO1xuICBsZXQgaTtcblxuICByYXdIZWFkZXJzICYmIHJhd0hlYWRlcnMuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gbGluZS5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcblxuICAgIGlmICgha2V5IHx8IChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZltrZXldKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgaWYgKHBhcnNlZFtrZXldKSB7XG4gICAgICAgIHBhcnNlZFtrZXldLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gW3ZhbF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcblxuY29uc3QgJGludGVybmFscyA9IFN5bWJvbCgnaW50ZXJuYWxzJyk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlciAmJiBTdHJpbmcoaGVhZGVyKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAobm9ybWFsaXplVmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb2tlbnMoc3RyKSB7XG4gIGNvbnN0IHRva2VucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGNvbnN0IHRva2Vuc1JFID0gLyhbXlxccyw7PV0rKVxccyooPzo9XFxzKihbXiw7XSspKT8vZztcbiAgbGV0IG1hdGNoO1xuXG4gIHdoaWxlICgobWF0Y2ggPSB0b2tlbnNSRS5leGVjKHN0cikpKSB7XG4gICAgdG9rZW5zW21hdGNoWzFdXSA9IG1hdGNoWzJdO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuY29uc3QgaXNWYWxpZEhlYWRlck5hbWUgPSAoc3RyKSA9PiAvXlstX2EtekEtWjAtOV5gfH4sISMkJSYnKisuXSskLy50ZXN0KHN0ci50cmltKCkpO1xuXG5mdW5jdGlvbiBtYXRjaEhlYWRlclZhbHVlKGNvbnRleHQsIHZhbHVlLCBoZWFkZXIsIGZpbHRlciwgaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gIGlmICh1dGlscyQxLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgICB2YWx1ZSA9IGhlYWRlcjtcbiAgfVxuXG4gIGlmICghdXRpbHMkMS5pc1N0cmluZyh2YWx1ZSkpIHJldHVybjtcblxuICBpZiAodXRpbHMkMS5pc1N0cmluZyhmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoZmlsdGVyKSAhPT0gLTE7XG4gIH1cblxuICBpZiAodXRpbHMkMS5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscyQxLnRvQ2FtZWxDYXNlKCcgJyArIGhlYWRlcik7XG5cbiAgWydnZXQnLCAnc2V0JywgJ2hhcyddLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSArIGFjY2Vzc29yTmFtZSwge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0uY2FsbCh0aGlzLCBoZWFkZXIsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY2xhc3MgQXhpb3NIZWFkZXJzIHtcbiAgY29uc3RydWN0b3IoaGVhZGVycykge1xuICAgIGhlYWRlcnMgJiYgdGhpcy5zZXQoaGVhZGVycyk7XG4gIH1cblxuICBzZXQoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSwgcmV3cml0ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghbEhlYWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShzZWxmLCBsSGVhZGVyKTtcblxuICAgICAgaWYoIWtleSB8fCBzZWxmW2tleV0gPT09IHVuZGVmaW5lZCB8fCBfcmV3cml0ZSA9PT0gdHJ1ZSB8fCAoX3Jld3JpdGUgPT09IHVuZGVmaW5lZCAmJiBzZWxmW2tleV0gIT09IGZhbHNlKSkge1xuICAgICAgICBzZWxmW2tleSB8fCBfaGVhZGVyXSA9IG5vcm1hbGl6ZVZhbHVlKF92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0SGVhZGVycyA9IChoZWFkZXJzLCBfcmV3cml0ZSkgPT5cbiAgICAgIHV0aWxzJDEuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChoZWFkZXIpIHx8IGhlYWRlciBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIHNldEhlYWRlcnMoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmKHV0aWxzJDEuaXNTdHJpbmcoaGVhZGVyKSAmJiAoaGVhZGVyID0gaGVhZGVyLnRyaW0oKSkgJiYgIWlzVmFsaWRIZWFkZXJOYW1lKGhlYWRlcikpIHtcbiAgICAgIHNldEhlYWRlcnMocGFyc2VIZWFkZXJzKGhlYWRlciksIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNIZWFkZXJzKGhlYWRlcikpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGhlYWRlci5lbnRyaWVzKCkpIHtcbiAgICAgICAgc2V0SGVhZGVyKHZhbHVlLCBrZXksIHJld3JpdGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgIT0gbnVsbCAmJiBzZXRIZWFkZXIodmFsdWVPclJld3JpdGUsIGhlYWRlciwgcmV3cml0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXQoaGVhZGVyLCBwYXJzZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmNhbGwodGhpcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMkMS5pc1JlZ0V4cChwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5leGVjKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFzKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHNlbGYsIF9oZWFkZXIpO1xuXG4gICAgICAgIGlmIChrZXkgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUoc2VsZiwgc2VsZltrZXldLCBrZXksIG1hdGNoZXIpKSkge1xuICAgICAgICAgIGRlbGV0ZSBzZWxmW2tleV07XG5cbiAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgaGVhZGVyLmZvckVhY2goZGVsZXRlSGVhZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlSGVhZGVyKGhlYWRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBjbGVhcihtYXRjaGVyKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICAgIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZighbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyLCB0cnVlKSkge1xuICAgICAgICBkZWxldGUgdGhpc1trZXldO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIG5vcm1hbGl6ZShmb3JtYXQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG5cbiAgICB1dGlscyQxLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShoZWFkZXJzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHNlbGZba2V5XSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZm9ybWF0ID8gZm9ybWF0SGVhZGVyKGhlYWRlcikgOiBTdHJpbmcoaGVhZGVyKS50cmltKCk7XG5cbiAgICAgIGlmIChub3JtYWxpemVkICE9PSBoZWFkZXIpIHtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgIH1cblxuICAgICAgc2VsZltub3JtYWxpemVkXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcblxuICAgICAgaGVhZGVyc1tub3JtYWxpemVkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbmNhdCguLi50YXJnZXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsIC4uLnRhcmdldHMpO1xuICB9XG5cbiAgdG9KU09OKGFzU3RyaW5ncykge1xuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB1dGlscyQxLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09IGZhbHNlICYmIChvYmpbaGVhZGVyXSA9IGFzU3RyaW5ncyAmJiB1dGlscyQxLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscyQxLmlzQXJyYXkoaGVhZGVyKSA/IGhlYWRlci5mb3JFYWNoKGRlZmluZUFjY2Vzc29yKSA6IGRlZmluZUFjY2Vzc29yKGhlYWRlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5BeGlvc0hlYWRlcnMuYWNjZXNzb3IoWydDb250ZW50LVR5cGUnLCAnQ29udGVudC1MZW5ndGgnLCAnQWNjZXB0JywgJ0FjY2VwdC1FbmNvZGluZycsICdVc2VyLUFnZW50JywgJ0F1dGhvcml6YXRpb24nXSk7XG5cbi8vIHJlc2VydmVkIG5hbWVzIGhvdGZpeFxudXRpbHMkMS5yZWR1Y2VEZXNjcmlwdG9ycyhBeGlvc0hlYWRlcnMucHJvdG90eXBlLCAoe3ZhbHVlfSwga2V5KSA9PiB7XG4gIGxldCBtYXBwZWQgPSBrZXlbMF0udG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTsgLy8gbWFwIGBzZXRgID0+IGBTZXRgXG4gIHJldHVybiB7XG4gICAgZ2V0OiAoKSA9PiB2YWx1ZSxcbiAgICBzZXQoaGVhZGVyVmFsdWUpIHtcbiAgICAgIHRoaXNbbWFwcGVkXSA9IGhlYWRlclZhbHVlO1xuICAgIH1cbiAgfVxufSk7XG5cbnV0aWxzJDEuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG52YXIgQXhpb3NIZWFkZXJzJDEgPSBBeGlvc0hlYWRlcnM7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7P09iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShmbnMsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHRoaXMgfHwgZGVmYXVsdHMkMTtcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29udGV4dC5oZWFkZXJzKTtcbiAgbGV0IGRhdGEgPSBjb250ZXh0LmRhdGE7XG5cbiAgdXRpbHMkMS5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29uZmlnLCBkYXRhLCBoZWFkZXJzLm5vcm1hbGl6ZSgpLCByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGhlYWRlcnMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsKHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fX0NBTkNFTF9fKTtcbn1cblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzJDEuaW5oZXJpdHMoQ2FuY2VsZWRFcnJvciwgQXhpb3NFcnJvciwge1xuICBfX0NBTkNFTF9fOiB0cnVlXG59KTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IHZhbGlkYXRlU3RhdHVzID0gcmVzcG9uc2UuY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICBbQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihyZXNwb25zZS5zdGF0dXMgLyAxMDApIC0gNF0sXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3RvY29sKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9eKFstK1xcd117MSwyNX0pKDo/XFwvXFwvfDopLy5leGVjKHVybCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgZGF0YSBtYXhSYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3NhbXBsZXNDb3VudD0gMTBdXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbj0gMTAwMF1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3BlZWRvbWV0ZXIoc2FtcGxlc0NvdW50LCBtaW4pIHtcbiAgc2FtcGxlc0NvdW50ID0gc2FtcGxlc0NvdW50IHx8IDEwO1xuICBjb25zdCBieXRlcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBjb25zdCB0aW1lc3RhbXBzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGxldCBoZWFkID0gMDtcbiAgbGV0IHRhaWwgPSAwO1xuICBsZXQgZmlyc3RTYW1wbGVUUztcblxuICBtaW4gPSBtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IDEwMDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1c2goY2h1bmtMZW5ndGgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gdGltZXN0YW1wc1t0YWlsXTtcblxuICAgIGlmICghZmlyc3RTYW1wbGVUUykge1xuICAgICAgZmlyc3RTYW1wbGVUUyA9IG5vdztcbiAgICB9XG5cbiAgICBieXRlc1toZWFkXSA9IGNodW5rTGVuZ3RoO1xuICAgIHRpbWVzdGFtcHNbaGVhZF0gPSBub3c7XG5cbiAgICBsZXQgaSA9IHRhaWw7XG4gICAgbGV0IGJ5dGVzQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgIT09IGhlYWQpIHtcbiAgICAgIGJ5dGVzQ291bnQgKz0gYnl0ZXNbaSsrXTtcbiAgICAgIGkgPSBpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGhlYWQgPSAoaGVhZCArIDEpICUgc2FtcGxlc0NvdW50O1xuXG4gICAgaWYgKGhlYWQgPT09IHRhaWwpIHtcbiAgICAgIHRhaWwgPSAodGFpbCArIDEpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChub3cgLSBmaXJzdFNhbXBsZVRTIDwgbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc2VkID0gc3RhcnRlZEF0ICYmIG5vdyAtIHN0YXJ0ZWRBdDtcblxuICAgIHJldHVybiBwYXNzZWQgPyBNYXRoLnJvdW5kKGJ5dGVzQ291bnQgKiAxMDAwIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaHJvdHRsZSBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gZnJlcVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCBmcmVxKSB7XG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBsZXQgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCBsYXN0QXJncztcbiAgbGV0IHRpbWVyO1xuXG4gIGNvbnN0IGludm9rZSA9IChhcmdzLCBub3cgPSBEYXRlLm5vdygpKSA9PiB7XG4gICAgdGltZXN0YW1wID0gbm93O1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IHRocm90dGxlZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBwYXNzZWQgPSBub3cgLSB0aW1lc3RhbXA7XG4gICAgaWYgKCBwYXNzZWQgPj0gdGhyZXNob2xkKSB7XG4gICAgICBpbnZva2UoYXJncywgbm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICBpbnZva2UobGFzdEFyZ3MpO1xuICAgICAgICB9LCB0aHJlc2hvbGQgLSBwYXNzZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBmbHVzaCA9ICgpID0+IGxhc3RBcmdzICYmIGludm9rZShsYXN0QXJncyk7XG5cbiAgcmV0dXJuIFt0aHJvdHRsZWQsIGZsdXNoXTtcbn1cblxuY29uc3QgcHJvZ3Jlc3NFdmVudFJlZHVjZXIgPSAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGUsXG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiB0b3RhbCAhPSBudWxsLFxuICAgICAgW2lzRG93bmxvYWRTdHJlYW0gPyAnZG93bmxvYWQnIDogJ3VwbG9hZCddOiB0cnVlXG4gICAgfTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9LCBmcmVxKTtcbn07XG5cbmNvbnN0IHByb2dyZXNzRXZlbnREZWNvcmF0b3IgPSAodG90YWwsIHRocm90dGxlZCkgPT4ge1xuICBjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT0gbnVsbDtcblxuICByZXR1cm4gWyhsb2FkZWQpID0+IHRocm90dGxlZFswXSh7XG4gICAgbGVuZ3RoQ29tcHV0YWJsZSxcbiAgICB0b3RhbCxcbiAgICBsb2FkZWRcbiAgfSksIHRocm90dGxlZFsxXV07XG59O1xuXG5jb25zdCBhc3luY0RlY29yYXRvciA9IChmbikgPT4gKC4uLmFyZ3MpID0+IHV0aWxzJDEuYXNhcCgoKSA9PiBmbiguLi5hcmdzKSk7XG5cbnZhciBpc1VSTFNhbWVPcmlnaW4gPSBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4vLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3Rcbi8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIGNvbnN0IG1zaWUgPSBwbGF0Zm9ybS5uYXZpZ2F0b3IgJiYgLyhtc2llfHRyaWRlbnQpL2kudGVzdChwbGF0Zm9ybS5uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBjb25zdCB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsZXQgb3JpZ2luVVJMO1xuXG4gICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdHMgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgbGV0IGhyZWYgPSB1cmw7XG5cbiAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgfVxuXG4gICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9ICh1dGlscyQxLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSkoKTtcblxudmFyIGNvb2tpZXMgPSBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICB7XG4gICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICBjb25zdCBjb29raWUgPSBbbmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSldO1xuXG4gICAgICB1dGlscyQxLmlzTnVtYmVyKGV4cGlyZXMpICYmIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcblxuICAgICAgdXRpbHMkMS5pc1N0cmluZyhwYXRoKSAmJiBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG5cbiAgICAgIHV0aWxzJDEuaXNTdHJpbmcoZG9tYWluKSAmJiBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXG4gICAgICBzZWN1cmUgPT09IHRydWUgJiYgY29va2llLnB1c2goJ3NlY3VyZScpO1xuXG4gICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICB9LFxuXG4gICAgcmVhZChuYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgIH0sXG5cbiAgICByZW1vdmUobmFtZSkge1xuICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICB9XG4gIH1cblxuICA6XG5cbiAgLy8gTm9uLXN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICB7XG4gICAgd3JpdGUoKSB7fSxcbiAgICByZWFkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmUoKSB7fVxuICB9O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbmZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8/XFwvJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG5cbmNvbnN0IGhlYWRlcnNUb09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgaW5zdGFuY2VvZiBBeGlvc0hlYWRlcnMkMSA/IHsgLi4udGhpbmcgfSA6IHRoaW5nO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICBjb25zdCBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSwgY2FzZWxlc3MpIHtcbiAgICBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMkMS5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscyQxLm1lcmdlLmNhbGwoe2Nhc2VsZXNzfSwgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscyQxLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKGEsIGIsIGNhc2VsZXNzKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYiwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIGNhc2VsZXNzKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEaXJlY3RLZXlzKGEsIGIsIHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYik7XG4gICAgfSBlbHNlIGlmIChwcm9wIGluIGNvbmZpZzEpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlTWFwID0ge1xuICAgIHVybDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBtZXRob2Q6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgZGF0YTogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBiYXNlVVJMOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXRNZXNzYWdlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhDcmVkZW50aWFsczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoWFNSRlRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGFkYXB0ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VUeXBlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZDb29raWVOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZIZWFkZXJOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGRlY29tcHJlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Q29udGVudExlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhCb2R5TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGJlZm9yZVJlZGlyZWN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zcG9ydDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cHNBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBjYW5jZWxUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBzb2NrZXRQYXRoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlRW5jb2Rpbmc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdmFsaWRhdGVTdGF0dXM6IG1lcmdlRGlyZWN0S2V5cyxcbiAgICBoZWFkZXJzOiAoYSwgYikgPT4gbWVyZ2VEZWVwUHJvcGVydGllcyhoZWFkZXJzVG9PYmplY3QoYSksIGhlYWRlcnNUb09iamVjdChiKSwgdHJ1ZSlcbiAgfTtcblxuICB1dGlscyQxLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnMSwgY29uZmlnMikpLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscyQxLmlzVW5kZWZpbmVkKGNvbmZpZ1ZhbHVlKSAmJiBtZXJnZSAhPT0gbWVyZ2VEaXJlY3RLZXlzKSB8fCAoY29uZmlnW3Byb3BdID0gY29uZmlnVmFsdWUpO1xuICB9KTtcblxuICByZXR1cm4gY29uZmlnO1xufVxuXG52YXIgcmVzb2x2ZUNvbmZpZyA9IChjb25maWcpID0+IHtcbiAgY29uc3QgbmV3Q29uZmlnID0gbWVyZ2VDb25maWcoe30sIGNvbmZpZyk7XG5cbiAgbGV0IHtkYXRhLCB3aXRoWFNSRlRva2VuLCB4c3JmSGVhZGVyTmFtZSwgeHNyZkNvb2tpZU5hbWUsIGhlYWRlcnMsIGF1dGh9ID0gbmV3Q29uZmlnO1xuXG4gIG5ld0NvbmZpZy5oZWFkZXJzID0gaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oaGVhZGVycyk7XG5cbiAgbmV3Q29uZmlnLnVybCA9IGJ1aWxkVVJMKGJ1aWxkRnVsbFBhdGgobmV3Q29uZmlnLmJhc2VVUkwsIG5ld0NvbmZpZy51cmwpLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgK1xuICAgICAgYnRvYSgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhdXRoLnBhc3N3b3JkKSkgOiAnJykpXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb250ZW50VHlwZTtcblxuICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscyQxLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikgJiYgKHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKG5ld0NvbmZpZykpO1xuXG4gICAgaWYgKHdpdGhYU1JGVG9rZW4gfHwgKHdpdGhYU1JGVG9rZW4gIT09IGZhbHNlICYmIGlzVVJMU2FtZU9yaWdpbihuZXdDb25maWcudXJsKSkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgY29uc3QgeHNyZlZhbHVlID0geHNyZkhlYWRlck5hbWUgJiYgeHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKHhzcmZDb29raWVOYW1lKTtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICBoZWFkZXJzLnNldCh4c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q29uZmlnO1xufTtcblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxudmFyIHhockFkYXB0ZXIgPSBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShfY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuICAgIGxldCB7cmVzcG9uc2VUeXBlLCBvblVwbG9hZFByb2dyZXNzLCBvbkRvd25sb2FkUHJvZ3Jlc3N9ID0gX2NvbmZpZztcbiAgICBsZXQgb25DYW5jZWxlZDtcbiAgICBsZXQgdXBsb2FkVGhyb3R0bGVkLCBkb3dubG9hZFRocm90dGxlZDtcbiAgICBsZXQgZmx1c2hVcGxvYWQsIGZsdXNoRG93bmxvYWQ7XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgZmx1c2hVcGxvYWQgJiYgZmx1c2hVcGxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG4gICAgICBmbHVzaERvd25sb2FkICYmIGZsdXNoRG93bmxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcblxuICAgICAgX2NvbmZpZy5zaWduYWwgJiYgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gX2NvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzJDEuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChfY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgKFtkb3dubG9hZFRocm90dGxlZCwgZmx1c2hEb3dubG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvbkRvd25sb2FkUHJvZ3Jlc3MsIHRydWUpKTtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBkb3dubG9hZFRocm90dGxlZCk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAob25VcGxvYWRQcm9ncmVzcyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgKFt1cGxvYWRUaHJvdHRsZWQsIGZsdXNoVXBsb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uVXBsb2FkUHJvZ3Jlc3MpKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB1cGxvYWRUaHJvdHRsZWQpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZmx1c2hVcGxvYWQpO1xuICAgIH1cblxuICAgIGlmIChfY29uZmlnLmNhbmNlbFRva2VuIHx8IF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgb25DYW5jZWxlZCA9IGNhbmNlbCA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCBjYW5jZWwudHlwZSA/IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZywgcmVxdWVzdCkgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIGlmIChfY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBfY29uZmlnLnNpZ25hbC5hYm9ydGVkID8gb25DYW5jZWxlZCgpIDogX2NvbmZpZy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2woX2NvbmZpZy51cmwpO1xuXG4gICAgaWYgKHByb3RvY29sICYmIHBsYXRmb3JtLnByb3RvY29scy5pbmRleE9mKHByb3RvY29sKSA9PT0gLTEpIHtcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sICsgJzonLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgY29uZmlnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhIHx8IG51bGwpO1xuICB9KTtcbn07XG5cbmNvbnN0IGNvbXBvc2VTaWduYWxzID0gKHNpZ25hbHMsIHRpbWVvdXQpID0+IHtcbiAgY29uc3Qge2xlbmd0aH0gPSAoc2lnbmFscyA9IHNpZ25hbHMgPyBzaWduYWxzLmZpbHRlcihCb29sZWFuKSA6IFtdKTtcblxuICBpZiAodGltZW91dCB8fCBsZW5ndGgpIHtcbiAgICBsZXQgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGxldCBhYm9ydGVkO1xuXG4gICAgY29uc3Qgb25hYm9ydCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlmICghYWJvcnRlZCkge1xuICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY29uc3QgZXJyID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiB0aGlzLnJlYXNvbjtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yID8gZXJyIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgaWYgKHNpZ25hbHMpIHtcbiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICBzaWduYWxzLmZvckVhY2goc2lnbmFsID0+IHtcbiAgICAgICAgICBzaWduYWwudW5zdWJzY3JpYmUgPyBzaWduYWwudW5zdWJzY3JpYmUob25hYm9ydCkgOiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNpZ25hbHMgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gICAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gICAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMkMS5hc2FwKHVuc3Vic2NyaWJlKTtcblxuICAgIHJldHVybiBzaWduYWw7XG4gIH1cbn07XG5cbnZhciBjb21wb3NlU2lnbmFscyQxID0gY29tcG9zZVNpZ25hbHM7XG5cbmNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmICghY2h1bmtTaXplIHx8IGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufTtcblxuY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVhZFN0cmVhbShpdGVyYWJsZSkpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoY2h1bmssIGNodW5rU2l6ZSk7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRTdHJlYW0gPSBhc3luYyBmdW5jdGlvbiogKHN0cmVhbSkge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHlpZWxkKiBzdHJlYW07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHtkb25lLCB2YWx1ZX0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICB9XG59O1xuXG5jb25zdCB0cmFja1N0cmVhbSA9IChzdHJlYW0sIGNodW5rU2l6ZSwgb25Qcm9ncmVzcywgb25GaW5pc2gpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufTtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbmNvbnN0IHN1cHBvcnRzUmVxdWVzdFN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiYgdGVzdCgoKSA9PiB7XG4gIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAnaGFsZic7XG4gICAgfSxcbiAgfSkuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG59KTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICB0ZXN0KCgpID0+IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzJDEuaXNGdW5jdGlvbihyZXNbdHlwZV0pID8gKHJlcykgPT4gcmVzW3R5cGVdKCkgOlxuICAgICAgKF8sIGNvbmZpZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSk7XG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscyQxLmlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemU7XG4gIH1cblxuICBpZih1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICBjb25zdCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5LFxuICAgIH0pO1xuICAgIHJldHVybiAoYXdhaXQgX3JlcXVlc3QuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMkMS5pc0FycmF5QnVmZmVyKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMoYm9keSkpIHtcbiAgICBib2R5ID0gYm9keSArICcnO1xuICB9XG5cbiAgaWYodXRpbHMkMS5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufTtcblxuY29uc3QgcmVzb2x2ZUJvZHlMZW5ndGggPSBhc3luYyAoaGVhZGVycywgYm9keSkgPT4ge1xuICBjb25zdCBsZW5ndGggPSB1dGlscyQxLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufTtcblxudmFyIGZldGNoQWRhcHRlciA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKGFzeW5jIChjb25maWcpID0+IHtcbiAgbGV0IHtcbiAgICB1cmwsXG4gICAgbWV0aG9kLFxuICAgIGRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbFRva2VuLFxuICAgIHRpbWVvdXQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlLFxuICAgIGhlYWRlcnMsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICBmZXRjaE9wdGlvbnNcbiAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgPyAocmVzcG9uc2VUeXBlICsgJycpLnRvTG93ZXJDYXNlKCkgOiAndGV4dCc7XG5cbiAgbGV0IGNvbXBvc2VkU2lnbmFsID0gY29tcG9zZVNpZ25hbHMkMShbc2lnbmFsLCBjYW5jZWxUb2tlbiAmJiBjYW5jZWxUb2tlbi50b0Fib3J0U2lnbmFsKCldLCB0aW1lb3V0KTtcblxuICBsZXQgcmVxdWVzdDtcblxuICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbXBvc2VkU2lnbmFsICYmIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlICYmICgoKSA9PiB7XG4gICAgICBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSgpO1xuICB9KTtcblxuICBsZXQgcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgdHJ5IHtcbiAgICBpZiAoXG4gICAgICBvblVwbG9hZFByb2dyZXNzICYmIHN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJiBtZXRob2QgIT09ICdnZXQnICYmIG1ldGhvZCAhPT0gJ2hlYWQnICYmXG4gICAgICAocmVxdWVzdENvbnRlbnRMZW5ndGggPSBhd2FpdCByZXNvbHZlQm9keUxlbmd0aChoZWFkZXJzLCBkYXRhKSkgIT09IDBcbiAgICApIHtcbiAgICAgIGxldCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgZHVwbGV4OiBcImhhbGZcIlxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjb250ZW50VHlwZUhlYWRlcjtcblxuICAgICAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3JlcXVlc3QuYm9keSkge1xuICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICByZXF1ZXN0Q29udGVudExlbmd0aCxcbiAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvblVwbG9hZFByb2dyZXNzKSlcbiAgICAgICAgKTtcblxuICAgICAgICBkYXRhID0gdHJhY2tTdHJlYW0oX3JlcXVlc3QuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCBmbHVzaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICB9XG5cbiAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWw6IGNvbXBvc2VkU2lnbmFsLFxuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgZHVwbGV4OiBcImhhbGZcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICBpZiAoc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAob25Eb3dubG9hZFByb2dyZXNzIHx8IChpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpO1xuXG4gICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gb25Eb3dubG9hZFByb2dyZXNzICYmIHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgIHJlc3BvbnNlQ29udGVudExlbmd0aCxcbiAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25Eb3dubG9hZFByb2dyZXNzKSwgdHJ1ZSlcbiAgICAgICkgfHwgW107XG5cbiAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICB0cmFja1N0cmVhbShyZXNwb25zZS5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsICgpID0+IHtcbiAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICBsZXQgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzb2x2ZXJzW3V0aWxzJDEuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pO1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgfVxufSk7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn07XG5cbnV0aWxzJDEuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzJDEuaXNGdW5jdGlvbihhZGFwdGVyKSB8fCBhZGFwdGVyID09PSBudWxsIHx8IGFkYXB0ZXIgPT09IGZhbHNlO1xuXG52YXIgYWRhcHRlcnMgPSB7XG4gIGdldEFkYXB0ZXI6IChhZGFwdGVycykgPT4ge1xuICAgIGFkYXB0ZXJzID0gdXRpbHMkMS5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5mdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29uZmlnLmhlYWRlcnMpO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgaWYgKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpICE9PSAtMSkge1xuICAgIGNvbmZpZy5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcihjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cyQxLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShyZWFzb24ucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufVxuXG5jb25zdCBWRVJTSU9OID0gXCIxLjcuN1wiO1xuXG5jb25zdCB2YWxpZGF0b3JzJDEgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnMkMVt0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzJDEudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgY29uc3Qgb3B0ID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdG9yID0ge1xuICBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzJDFcbn07XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuY2xhc3MgQXhpb3Mge1xuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUNvbmZpZykge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIkMSgpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIkMSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBjb25maWdPclVybCBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gICAqIEBwYXJhbSB7P09iamVjdH0gY29uZmlnXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAgICovXG4gIGFzeW5jIHJlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBsZXQgZHVtbXk7XG5cbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSA9IHt9KSA6IChkdW1teSA9IG5ldyBFcnJvcigpKTtcblxuICAgICAgICAvLyBzbGljZSBvZmYgdGhlIEVycm9yOiAuLi4gbGluZVxuICAgICAgICBjb25zdCBzdGFjayA9IGR1bW15LnN0YWNrID8gZHVtbXkuc3RhY2sucmVwbGFjZSgvXi4rXFxuLywgJycpIDogJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGVyci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgICAgLy8gbWF0Y2ggd2l0aG91dCB0aGUgMiB0b3Agc3RhY2sgbGluZXNcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrICYmICFTdHJpbmcoZXJyLnN0YWNrKS5lbmRzV2l0aChzdGFjay5yZXBsYWNlKC9eLitcXG4uK1xcbi8sICcnKSkpIHtcbiAgICAgICAgICAgIGVyci5zdGFjayArPSAnXFxuJyArIHN0YWNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGUgY2FzZSB3aGVyZSBcInN0YWNrXCIgaXMgYW4gdW4td3JpdGFibGUgcHJvcGVydHlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBjb25maWdPclVybCB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgY29uc3Qge3RyYW5zaXRpb25hbCwgcGFyYW1zU2VyaWFsaXplciwgaGVhZGVyc30gPSBjb25maWc7XG5cbiAgICBpZiAodHJhbnNpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgICBzaWxlbnRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zU2VyaWFsaXplciAhPSBudWxsKSB7XG4gICAgICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKHBhcmFtc1NlcmlhbGl6ZXIpKSB7XG4gICAgICAgIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyID0ge1xuICAgICAgICAgIHNlcmlhbGl6ZTogcGFyYW1zU2VyaWFsaXplclxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMocGFyYW1zU2VyaWFsaXplciwge1xuICAgICAgICAgIGVuY29kZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICBzZXJpYWxpemU6IHZhbGlkYXRvcnMuZnVuY3Rpb25cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgICBjb25maWcubWV0aG9kID0gKGNvbmZpZy5tZXRob2QgfHwgdGhpcy5kZWZhdWx0cy5tZXRob2QgfHwgJ2dldCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgICBsZXQgY29udGV4dEhlYWRlcnMgPSBoZWFkZXJzICYmIHV0aWxzJDEubWVyZ2UoXG4gICAgICBoZWFkZXJzLmNvbW1vbixcbiAgICAgIGhlYWRlcnNbY29uZmlnLm1ldGhvZF1cbiAgICApO1xuXG4gICAgaGVhZGVycyAmJiB1dGlscyQxLmZvckVhY2goXG4gICAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICAgIChtZXRob2QpID0+IHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbbWV0aG9kXTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5jb25jYXQoY29udGV4dEhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICAgIGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgbGV0IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGxldCBwcm9taXNlO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuO1xuXG4gICAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdC5iaW5kKHRoaXMpLCB1bmRlZmluZWRdO1xuICAgICAgY2hhaW4udW5zaGlmdC5hcHBseShjaGFpbiwgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgY2hhaW4ucHVzaC5hcHBseShjaGFpbiwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGxlbiA9IGNoYWluLmxlbmd0aDtcblxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gICAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluW2krK10sIGNoYWluW2krK10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBsZW4gPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgY29uc3Qgb25GdWxmaWxsZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgY29uc3Qgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICB0cnkge1xuICAgICAgICBuZXdDb25maWcgPSBvbkZ1bGZpbGxlZChuZXdDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25SZWplY3RlZC5jYWxsKHRoaXMsIGVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UgPSBkaXNwYXRjaFJlcXVlc3QuY2FsbCh0aGlzLCBuZXdDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIGkgPSAwO1xuICAgIGxlbiA9IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgZ2V0VXJpKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXR1cm4gYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcbiAgfVxufVxuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzJDEuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdvcHRpb25zJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgZGF0YTogKGNvbmZpZyB8fCB7fSkuZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG51dGlscyQxLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxudmFyIEF4aW9zJDEgPSBBeGlvcztcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsVG9rZW59XG4gKi9cbmNsYXNzIENhbmNlbFRva2VuIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVQcm9taXNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4oY2FuY2VsID0+IHtcbiAgICAgIGlmICghdG9rZW4uX2xpc3RlbmVycykgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgICB9XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4gPSBvbmZ1bGZpbGxlZCA9PiB7XG4gICAgICBsZXQgX3Jlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgICAgdG9rZW4udW5zdWJzY3JpYmUoX3Jlc29sdmUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAqL1xuICB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgdGhyb3cgdGhpcy5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICB0b0Fib3J0U2lnbmFsKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBjb25zdCBhYm9ydCA9IChlcnIpID0+IHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zdWJzY3JpYmUoYWJvcnQpO1xuXG4gICAgY29udHJvbGxlci5zaWduYWwudW5zdWJzY3JpYmUgPSAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gICAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gICAqL1xuICBzdGF0aWMgc291cmNlKCkge1xuICAgIGxldCBjYW5jZWw7XG4gICAgY29uc3QgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgICAgY2FuY2VsID0gYztcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICBjYW5jZWxcbiAgICB9O1xuICB9XG59XG5cbnZhciBDYW5jZWxUb2tlbiQxID0gQ2FuY2VsVG9rZW47XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMkMS5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufVxuXG5jb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxudmFyIEh0dHBTdGF0dXNDb2RlJDEgPSBIdHRwU3RhdHVzQ29kZTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zJDEoZGVmYXVsdENvbmZpZyk7XG4gIGNvbnN0IGluc3RhbmNlID0gYmluZChBeGlvcyQxLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscyQxLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MkMS5wcm90b3R5cGUsIGNvbnRleHQsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzJDEuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0LCBudWxsLCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMkMSk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcyQxO1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbGVkRXJyb3IgPSBDYW5jZWxlZEVycm9yO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSBDYW5jZWxUb2tlbiQxO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycyQxO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMkMS5pc0hUTUxGb3JtKHRoaW5nKSA/IG5ldyBGb3JtRGF0YSh0aGluZykgOiB0aGluZyk7XG5cbmF4aW9zLmdldEFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyO1xuXG5heGlvcy5IdHRwU3RhdHVzQ29kZSA9IEh0dHBTdGF0dXNDb2RlJDE7XG5cbmF4aW9zLmRlZmF1bHQgPSBheGlvcztcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF4aW9zLmNqcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkF4aW9zQ2xpZW50ID0gdm9pZCAwO1xudmFyIGF4aW9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImF4aW9zXCIpKTtcbnZhciBBeGlvc0NsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBeGlvc0NsaWVudChfYSkge1xuICAgICAgICB2YXIgcmVzcG9uc2VIYW5kbGVyID0gX2EucmVzcG9uc2VIYW5kbGVyLCByZXF1ZXN0Q29uZmlnQnVpbGRlciA9IF9hLnJlcXVlc3RDb25maWdCdWlsZGVyO1xuICAgICAgICB0aGlzLnJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlSGFuZGxlcjtcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlciA9IHJlcXVlc3RDb25maWdCdWlsZGVyO1xuICAgIH1cbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBhdGgsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlci5idWlsZChcImdldFwiLCBwYXRoLCBwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbmZpZyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdENvbmZpZyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCAoX2Euc2VudCgpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQXhpb3NDbGllbnQucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0Q29uZmlnO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RDb25maWdCdWlsZGVyLmJ1aWxkKFwiZ2V0XCIsIHBhdGgsIHBhcmFtcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUucG9zdCA9IGZ1bmN0aW9uIChwYXRoLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RDb25maWc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdENvbmZpZ0J1aWxkZXIuYnVpbGQoXCJwb3N0XCIsIHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUucG9zdERhdGEgPSBmdW5jdGlvbiAocGF0aCwgZm9ybURhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RDb25maWc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdENvbmZpZ0J1aWxkZXIuYnVpbGQoXCJwb3N0XCIsIHBhdGgsIGZvcm1EYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9hLnNlbnQoKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEF4aW9zQ2xpZW50LnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0Q29uZmlnO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RDb25maWdCdWlsZGVyLmJ1aWxkKFwicHV0XCIsIHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhdGgsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlci5idWlsZChcImRlbGV0ZVwiLCBwYXRoLCBwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbmZpZyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdENvbmZpZyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCAoX2Euc2VudCgpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQXhpb3NDbGllbnQucHJvdG90eXBlLnNlbmRSZXF1ZXN0ID0gZnVuY3Rpb24gKHJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VIYW5kbGVyLmhhbmRsZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgICAgKDAsIGF4aW9zXzEuZGVmYXVsdCkoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IG1heEJvZHlMZW5ndGg6IEluZmluaXR5LCBtYXhDb250ZW50TGVuZ3RoOiBJbmZpbml0eSB9KSkpO1xuICAgIH07XG4gICAgcmV0dXJuIEF4aW9zQ2xpZW50O1xufSgpKTtcbmV4cG9ydHMuQXhpb3NDbGllbnQgPSBBeGlvc0NsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF4aW9zQ2xpZW50LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EZWZhdWx0SHR0cENsaWVudCA9IHZvaWQgMDtcbnZhciBBeGlvc0NsaWVudF8xID0gcmVxdWlyZShcIi4vQXhpb3NDbGllbnRcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEZWZhdWx0SHR0cENsaWVudFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gQXhpb3NDbGllbnRfMS5BeGlvc0NsaWVudDsgfSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2V2YWwnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXZhbEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yYW5nZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSYW5nZUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yZWYnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gUmVmZXJlbmNlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3N5bnRheCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBTeW50YXhFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdHlwZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBUeXBlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3VyaScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBVUklFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxOF0sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHN5bSBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLXVucmVhY2hhYmxlLWxvb3Bcblx0aWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXHRpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGVzdCA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRmb286IHt9XG59O1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzUHJvdG8oKSB7XG5cdC8vIEB0cy1leHBlY3QtZXJyb3I6IFRTIGVycm9ycyBvbiBhbiBpbmhlcml0ZWQgcHJvcGVydHkgZm9yIHNvbWUgcmVhc29uXG5cdHJldHVybiB7IF9fcHJvdG9fXzogdGVzdCB9LmZvbyA9PT0gdGVzdC5mb29cblx0XHQmJiAhKHRlc3QgaW5zdGFuY2VvZiAkT2JqZWN0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDEgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnO1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBmdW5jVHlwZSA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cbnZhciBjb25jYXR0eSA9IGZ1bmN0aW9uIGNvbmNhdHR5KGEsIGIpIHtcbiAgICB2YXIgYXJyID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyW2ldID0gYVtpXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBiLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGFycltqICsgYS5sZW5ndGhdID0gYltqXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIHNsaWN5ID0gZnVuY3Rpb24gc2xpY3koYXJyTGlrZSwgb2Zmc2V0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQgfHwgMCwgaiA9IDA7IGkgPCBhcnJMaWtlLmxlbmd0aDsgaSArPSAxLCBqICs9IDEpIHtcbiAgICAgICAgYXJyW2pdID0gYXJyTGlrZVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbn07XG5cbnZhciBqb2lueSA9IGZ1bmN0aW9uIChhcnIsIGpvaW5lcikge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gYXJyW2ldO1xuICAgICAgICBpZiAoaSArIDEgPCBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICBzdHIgKz0gam9pbmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmFwcGx5KHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY3koYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBib3VuZDtcbiAgICB2YXIgYmluZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICApO1xuXG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IG1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzW2ldID0gJyQnICsgaTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgam9pbnkoYm91bmRBcmdzLCAnLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICAgIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciAkaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBiaW5kLmNhbGwoY2FsbCwgJGhhc093bik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMnKTtcbnZhciAkRXZhbEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL2V2YWwnKTtcbnZhciAkUmFuZ2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yYW5nZScpO1xudmFyICRSZWZlcmVuY2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yZWYnKTtcbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFVSSUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3VyaScpO1xuXG52YXIgJEZ1bmN0aW9uID0gRnVuY3Rpb247XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxudmFyIGdldEV2YWxsZWRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uU3ludGF4KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuICRGdW5jdGlvbignXCJ1c2Ugc3RyaWN0XCI7IHJldHVybiAoJyArIGV4cHJlc3Npb25TeW50YXggKyAnKS5jb25zdHJ1Y3RvcjsnKSgpO1xuXHR9IGNhdGNoIChlKSB7fVxufTtcblxudmFyICRnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbmlmICgkZ09QRCkge1xuXHR0cnkge1xuXHRcdCRnT1BEKHt9LCAnJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQkZ09QRCA9IG51bGw7IC8vIHRoaXMgaXMgSUUgOCwgd2hpY2ggaGFzIGEgYnJva2VuIGdPUERcblx0fVxufVxuXG52YXIgdGhyb3dUeXBlRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdHRocm93IG5ldyAkVHlwZUVycm9yKCk7XG59O1xudmFyIFRocm93VHlwZUVycm9yID0gJGdPUERcblx0PyAoZnVuY3Rpb24gKCkge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zLCBuby1jYWxsZXIsIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllc1xuXHRcdFx0YXJndW1lbnRzLmNhbGxlZTsgLy8gSUUgOCBkb2VzIG5vdCB0aHJvdyBoZXJlXG5cdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0fSBjYXRjaCAoY2FsbGVlVGhyb3dzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBJRSA4IHRocm93cyBvbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFyZ3VtZW50cywgJycpXG5cdFx0XHRcdHJldHVybiAkZ09QRChhcmd1bWVudHMsICdjYWxsZWUnKS5nZXQ7XG5cdFx0XHR9IGNhdGNoIChnT1BEdGhyb3dzKSB7XG5cdFx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cdH0oKSlcblx0OiB0aHJvd1R5cGVFcnJvcjtcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scycpKCk7XG52YXIgaGFzUHJvdG8gPSByZXF1aXJlKCdoYXMtcHJvdG8nKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgKFxuXHRoYXNQcm90b1xuXHRcdD8gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblx0XHQ6IG51bGxcbik7XG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG5cbnZhciBJTlRSSU5TSUNTID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQmlnSW50NjRBcnJheSUnOiB0eXBlb2YgQmlnSW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQ2NEFycmF5LFxuXHQnJUJpZ1VpbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdVaW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdVaW50NjRBcnJheSxcblx0JyVCb29sZWFuJSc6IEJvb2xlYW4sXG5cdCclRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LFxuXHQnJURhdGUlJzogRGF0ZSxcblx0JyVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuXHQnJWRlY29kZVVSSUNvbXBvbmVudCUnOiBkZWNvZGVVUklDb21wb25lbnQsXG5cdCclZW5jb2RlVVJJJSc6IGVuY29kZVVSSSxcblx0JyVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuXHQnJUVycm9yJSc6ICRFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiAkRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6ICRSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6ICRSZWZlcmVuY2VFcnJvcixcblx0JyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCclUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLFxuXHQnJVN0cmluZyUnOiBTdHJpbmcsXG5cdCclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclU3ltYm9sJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wgOiB1bmRlZmluZWQsXG5cdCclU3ludGF4RXJyb3IlJzogJFN5bnRheEVycm9yLFxuXHQnJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuXHQnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcblx0JyVVaW50OEFycmF5JSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4QXJyYXksXG5cdCclVWludDhDbGFtcGVkQXJyYXklJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHQnJVVpbnQxNkFycmF5JSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MTZBcnJheSxcblx0JyVVaW50MzJBcnJheSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDMyQXJyYXksXG5cdCclVVJJRXJyb3IlJzogJFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ0FycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG90eXBlJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b19lbnRyaWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2VudHJpZXMnXSxcblx0JyVBcnJheVByb3RvX2ZvckVhY2glJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZm9yRWFjaCddLFxuXHQnJUFycmF5UHJvdG9fa2V5cyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdrZXlzJ10sXG5cdCclQXJyYXlQcm90b192YWx1ZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAndmFsdWVzJ10sXG5cdCclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0FzeW5jRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclQm9vbGVhblByb3RvdHlwZSUnOiBbJ0Jvb2xlYW4nLCAncHJvdG90eXBlJ10sXG5cdCclRGF0YVZpZXdQcm90b3R5cGUlJzogWydEYXRhVmlldycsICdwcm90b3R5cGUnXSxcblx0JyVEYXRlUHJvdG90eXBlJSc6IFsnRGF0ZScsICdwcm90b3R5cGUnXSxcblx0JyVFcnJvclByb3RvdHlwZSUnOiBbJ0Vycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBbJ0V2YWxFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQ2NEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IFsnRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDhBcnJheVByb3RvdHlwZSUnOiBbJ0ludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnSW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnSW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVKU09OUGFyc2UlJzogWydKU09OJywgJ3BhcnNlJ10sXG5cdCclSlNPTlN0cmluZ2lmeSUnOiBbJ0pTT04nLCAnc3RyaW5naWZ5J10sXG5cdCclTWFwUHJvdG90eXBlJSc6IFsnTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJU51bWJlclByb3RvdHlwZSUnOiBbJ051bWJlcicsICdwcm90b3R5cGUnXSxcblx0JyVPYmplY3RQcm90b3R5cGUlJzogWydPYmplY3QnLCAncHJvdG90eXBlJ10sXG5cdCclT2JqUHJvdG9fdG9TdHJpbmclJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3RvU3RyaW5nJ10sXG5cdCclT2JqUHJvdG9fdmFsdWVPZiUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndmFsdWVPZiddLFxuXHQnJVByb21pc2VQcm90b3R5cGUlJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZSddLFxuXHQnJVByb21pc2VQcm90b190aGVuJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnLCAndGhlbiddLFxuXHQnJVByb21pc2VfYWxsJSc6IFsnUHJvbWlzZScsICdhbGwnXSxcblx0JyVQcm9taXNlX3JlamVjdCUnOiBbJ1Byb21pc2UnLCAncmVqZWN0J10sXG5cdCclUHJvbWlzZV9yZXNvbHZlJSc6IFsnUHJvbWlzZScsICdyZXNvbHZlJ10sXG5cdCclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBbJ1JhbmdlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogWydSZWZlcmVuY2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWdFeHBQcm90b3R5cGUlJzogWydSZWdFeHAnLCAncHJvdG90eXBlJ10sXG5cdCclU2V0UHJvdG90eXBlJSc6IFsnU2V0JywgJ3Byb3RvdHlwZSddLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnU2hhcmVkQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclU3RyaW5nUHJvdG90eXBlJSc6IFsnU3RyaW5nJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bWJvbFByb3RvdHlwZSUnOiBbJ1N5bWJvbCcsICdwcm90b3R5cGUnXSxcblx0JyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBbJ1N5bnRheEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogWydUeXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVFcnJvclByb3RvdHlwZSUnOiBbJ1R5cGVFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnVWludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDMyQXJyYXlQcm90b3R5cGUlJzogWydVaW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVUklFcnJvclByb3RvdHlwZSUnOiBbJ1VSSUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtNYXBQcm90b3R5cGUlJzogWydXZWFrTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtTZXRQcm90b3R5cGUlJzogWydXZWFrU2V0JywgJ3Byb3RvdHlwZSddXG59O1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciAkY29uY2F0ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIEFycmF5LnByb3RvdHlwZS5jb25jYXQpO1xudmFyICRzcGxpY2VBcHBseSA9IGJpbmQuY2FsbChGdW5jdGlvbi5hcHBseSwgQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG52YXIgJHJlcGxhY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciAkc3RyU2xpY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG52YXIgJGV4ZWMgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgUmVnRXhwLnByb3RvdHlwZS5leGVjKTtcblxuLyogYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvNC4xNy4xNS9kaXN0L2xvZGFzaC5qcyNMNjczNS1MNjc0NCAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14lLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCUkKSkvZztcbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZzsgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgc3RyaW5nVG9QYXRoID0gZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHN0cmluZykge1xuXHR2YXIgZmlyc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAwLCAxKTtcblx0dmFyIGxhc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAtMSk7XG5cdGlmIChmaXJzdCA9PT0gJyUnICYmIGxhc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAnKTtcblx0fSBlbHNlIGlmIChsYXN0ID09PSAnJScgJiYgZmlyc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgb3BlbmluZyBgJWAnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gW107XG5cdCRyZXBsYWNlKHN0cmluZywgcmVQcm9wTmFtZSwgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcblx0XHRyZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBxdW90ZSA/ICRyZXBsYWNlKHN1YlN0cmluZywgcmVFc2NhcGVDaGFyLCAnJDEnKSA6IG51bWJlciB8fCBtYXRjaDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuLyogZW5kIGFkYXB0YXRpb24gKi9cblxudmFyIGdldEJhc2VJbnRyaW5zaWMgPSBmdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljTmFtZSA9IG5hbWU7XG5cdHZhciBhbGlhcztcblx0aWYgKGhhc093bihMRUdBQ1lfQUxJQVNFUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHRhbGlhcyA9IExFR0FDWV9BTElBU0VTW2ludHJpbnNpY05hbWVdO1xuXHRcdGludHJpbnNpY05hbWUgPSAnJScgKyBhbGlhc1swXSArICclJztcblx0fVxuXG5cdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHR2YXIgdmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY05hbWVdO1xuXHRcdGlmICh2YWx1ZSA9PT0gbmVlZHNFdmFsKSB7XG5cdFx0XHR2YWx1ZSA9IGRvRXZhbChpbnRyaW5zaWNOYW1lKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFsaWFzOiBhbGlhcyxcblx0XHRcdG5hbWU6IGludHJpbnNpY05hbWUsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG5cblx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImFsbG93TWlzc2luZ1wiIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHRpZiAoJGV4ZWMoL14lP1teJV0qJT8kLywgbmFtZSkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lJyk7XG5cdH1cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXHR2YXIgaW50cmluc2ljQmFzZU5hbWUgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJztcblxuXHR2YXIgaW50cmluc2ljID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0dmFyIGludHJpbnNpY1JlYWxOYW1lID0gaW50cmluc2ljLm5hbWU7XG5cdHZhciB2YWx1ZSA9IGludHJpbnNpYy52YWx1ZTtcblx0dmFyIHNraXBGdXJ0aGVyQ2FjaGluZyA9IGZhbHNlO1xuXG5cdHZhciBhbGlhcyA9IGludHJpbnNpYy5hbGlhcztcblx0aWYgKGFsaWFzKSB7XG5cdFx0aW50cmluc2ljQmFzZU5hbWUgPSBhbGlhc1swXTtcblx0XHQkc3BsaWNlQXBwbHkocGFydHMsICRjb25jYXQoWzAsIDFdLCBhbGlhcykpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDEsIGlzT3duID0gdHJ1ZTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIHBhcnQgPSBwYXJ0c1tpXTtcblx0XHR2YXIgZmlyc3QgPSAkc3RyU2xpY2UocGFydCwgMCwgMSk7XG5cdFx0dmFyIGxhc3QgPSAkc3RyU2xpY2UocGFydCwgLTEpO1xuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0KGZpcnN0ID09PSAnXCInIHx8IGZpcnN0ID09PSBcIidcIiB8fCBmaXJzdCA9PT0gJ2AnKVxuXHRcdFx0XHR8fCAobGFzdCA9PT0gJ1wiJyB8fCBsYXN0ID09PSBcIidcIiB8fCBsYXN0ID09PSAnYCcpXG5cdFx0XHQpXG5cdFx0XHQmJiBmaXJzdCAhPT0gbGFzdFxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcigncHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcycpO1xuXHRcdH1cblx0XHRpZiAocGFydCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhaXNPd24pIHtcblx0XHRcdHNraXBGdXJ0aGVyQ2FjaGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aW50cmluc2ljQmFzZU5hbWUgKz0gJy4nICsgcGFydDtcblx0XHRpbnRyaW5zaWNSZWFsTmFtZSA9ICclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnO1xuXG5cdFx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNSZWFsTmFtZSkpIHtcblx0XHRcdHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoIShwYXJ0IGluIHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoIWFsbG93TWlzc2luZykge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICgkZ09QRCAmJiAoaSArIDEpID49IHBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0aXNPd24gPSAhIWRlc2M7XG5cblx0XHRcdFx0Ly8gQnkgY29udmVudGlvbiwgd2hlbiBhIGRhdGEgcHJvcGVydHkgaXMgY29udmVydGVkIHRvIGFuIGFjY2Vzc29yXG5cdFx0XHRcdC8vIHByb3BlcnR5IHRvIGVtdWxhdGUgYSBkYXRhIHByb3BlcnR5IHRoYXQgZG9lcyBub3Qgc3VmZmVyIGZyb21cblx0XHRcdFx0Ly8gdGhlIG92ZXJyaWRlIG1pc3Rha2UsIHRoYXQgYWNjZXNzb3IncyBnZXR0ZXIgaXMgbWFya2VkIHdpdGhcblx0XHRcdFx0Ly8gYW4gYG9yaWdpbmFsVmFsdWVgIHByb3BlcnR5LiBIZXJlLCB3aGVuIHdlIGRldGVjdCB0aGlzLCB3ZVxuXHRcdFx0XHQvLyB1cGhvbGQgdGhlIGlsbHVzaW9uIGJ5IHByZXRlbmRpbmcgdG8gc2VlIHRoYXQgb3JpZ2luYWwgZGF0YVxuXHRcdFx0XHQvLyBwcm9wZXJ0eSwgaS5lLiwgcmV0dXJuaW5nIHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZ2V0dGVyXG5cdFx0XHRcdC8vIGl0c2VsZi5cblx0XHRcdFx0aWYgKGlzT3duICYmICdnZXQnIGluIGRlc2MgJiYgISgnb3JpZ2luYWxWYWx1ZScgaW4gZGVzYy5nZXQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZXNjLmdldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpc093biA9IGhhc093bih2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc093biAmJiAhc2tpcEZ1cnRoZXJDYWNoaW5nKSB7XG5cdFx0XHRcdElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGRlZmluZVByb3BlcnR5ID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmRlZmluZVByb3BlcnR5JScsIHRydWUpIHx8IGZhbHNlO1xuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHQkZGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRkZWZpbmVQcm9wZXJ0eTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRnT1BEID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnLCB0cnVlKTtcblxuaWYgKCRnT1BEKSB7XG5cdHRyeSB7XG5cdFx0JGdPUEQoW10sICdsZW5ndGgnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGdPUERcblx0XHQkZ09QRCA9IG51bGw7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAkZ09QRDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgJFN5bnRheEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3N5bnRheCcpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG52YXIgZ29wZCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lRGF0YVByb3BlcnR5KFxuXHRvYmosXG5cdHByb3BlcnR5LFxuXHR2YWx1ZVxuKSB7XG5cdGlmICghb2JqIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgb2JqYCBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uYCcpO1xuXHR9XG5cdGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N5bWJvbCcpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYHByb3BlcnR5YCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sYCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzNdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25FbnVtZXJhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgdHlwZW9mIGFyZ3VtZW50c1s0XSAhPT0gJ2Jvb2xlYW4nICYmIGFyZ3VtZW50c1s0XSAhPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbm9uV3JpdGFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNSAmJiB0eXBlb2YgYXJndW1lbnRzWzVdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzVdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Db25maWd1cmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNiAmJiB0eXBlb2YgYXJndW1lbnRzWzZdICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGxvb3NlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHR2YXIgbm9uRW51bWVyYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblx0dmFyIG5vbldyaXRhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgPyBhcmd1bWVudHNbNF0gOiBudWxsO1xuXHR2YXIgbm9uQ29uZmlndXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgPyBhcmd1bWVudHNbNV0gOiBudWxsO1xuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IGZhbHNlO1xuXG5cdC8qIEB0eXBlIHtmYWxzZSB8IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+fSAqL1xuXHR2YXIgZGVzYyA9ICEhZ29wZCAmJiBnb3BkKG9iaiwgcHJvcGVydHkpO1xuXG5cdGlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0XHQkZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eSwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiBub25Db25maWd1cmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuY29uZmlndXJhYmxlIDogIW5vbkNvbmZpZ3VyYWJsZSxcblx0XHRcdGVudW1lcmFibGU6IG5vbkVudW1lcmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuZW51bWVyYWJsZSA6ICFub25FbnVtZXJhYmxlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IG5vbldyaXRhYmxlID09PSBudWxsICYmIGRlc2MgPyBkZXNjLndyaXRhYmxlIDogIW5vbldyaXRhYmxlXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAobG9vc2UgfHwgKCFub25FbnVtZXJhYmxlICYmICFub25Xcml0YWJsZSAmJiAhbm9uQ29uZmlndXJhYmxlKSkge1xuXHRcdC8vIG11c3QgZmFsbCBiYWNrIHRvIFtbU2V0XV0sIGFuZCB3YXMgbm90IGV4cGxpY2l0bHkgYXNrZWQgdG8gbWFrZSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tY29uZmlndXJhYmxlXG5cdFx0b2JqW3Byb3BlcnR5XSA9IHZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlZmluaW5nIGEgcHJvcGVydHkgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tZW51bWVyYWJsZS4nKTtcblx0fVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKSB7XG5cdHJldHVybiAhISRkZWZpbmVQcm9wZXJ0eTtcbn07XG5cbmhhc1Byb3BlcnR5RGVzY3JpcHRvcnMuaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcgPSBmdW5jdGlvbiBoYXNBcnJheUxlbmd0aERlZmluZUJ1ZygpIHtcblx0Ly8gbm9kZSB2MC42IGhhcyBhIGJ1ZyB3aGVyZSBhcnJheSBsZW5ndGhzIGNhbiBiZSBTZXQgYnV0IG5vdCBEZWZpbmVkXG5cdGlmICghJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0dHJ5IHtcblx0XHRyZXR1cm4gJGRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB2YWx1ZTogMSB9KS5sZW5ndGggIT09IDE7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBGaXJlZm94IDQtMjIsIGRlZmluaW5nIGxlbmd0aCBvbiBhbiBhcnJheSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLWRhdGEtcHJvcGVydHknKTtcbnZhciBoYXNEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpKCk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRmbG9vciA9IEdldEludHJpbnNpYygnJU1hdGguZmxvb3IlJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldEZ1bmN0aW9uTGVuZ3RoKGZuLCBsZW5ndGgpIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBsZW5ndGggIT09ICdudW1iZXInIHx8IGxlbmd0aCA8IDAgfHwgbGVuZ3RoID4gMHhGRkZGRkZGRiB8fCAkZmxvb3IobGVuZ3RoKSAhPT0gbGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BsZW5ndGhgIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlcicpO1xuXHR9XG5cblx0dmFyIGxvb3NlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgISFhcmd1bWVudHNbMl07XG5cblx0dmFyIGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgPSB0cnVlO1xuXHR2YXIgZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlID0gdHJ1ZTtcblx0aWYgKCdsZW5ndGgnIGluIGZuICYmIGdPUEQpIHtcblx0XHR2YXIgZGVzYyA9IGdPUEQoZm4sICdsZW5ndGgnKTtcblx0XHRpZiAoZGVzYyAmJiAhZGVzYy5jb25maWd1cmFibGUpIHtcblx0XHRcdGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGRlc2MgJiYgIWRlc2Mud3JpdGFibGUpIHtcblx0XHRcdGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlIHx8IGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSB8fCAhbG9vc2UpIHtcblx0XHRpZiAoaGFzRGVzY3JpcHRvcnMpIHtcblx0XHRcdGRlZmluZSgvKiogQHR5cGUge1BhcmFtZXRlcnM8ZGVmaW5lPlswXX0gKi8gKGZuKSwgJ2xlbmd0aCcsIGxlbmd0aCwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlZmluZSgvKiogQHR5cGUge1BhcmFtZXRlcnM8ZGVmaW5lPlswXX0gKi8gKGZuKSwgJ2xlbmd0aCcsIGxlbmd0aCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBzZXRGdW5jdGlvbkxlbmd0aCA9IHJlcXVpcmUoJ3NldC1mdW5jdGlvbi1sZW5ndGgnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRhcHBseSA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUnKTtcbnZhciAkY2FsbCA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJScpO1xudmFyICRyZWZsZWN0QXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVSZWZsZWN0LmFwcGx5JScsIHRydWUpIHx8IGJpbmQuY2FsbCgkY2FsbCwgJGFwcGx5KTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xudmFyICRtYXggPSBHZXRJbnRyaW5zaWMoJyVNYXRoLm1heCUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZChvcmlnaW5hbEZ1bmN0aW9uKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ2luYWxGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblx0dmFyIGZ1bmMgPSAkcmVmbGVjdEFwcGx5KGJpbmQsICRjYWxsLCBhcmd1bWVudHMpO1xuXHRyZXR1cm4gc2V0RnVuY3Rpb25MZW5ndGgoXG5cdFx0ZnVuYyxcblx0XHQxICsgJG1heCgwLCBvcmlnaW5hbEZ1bmN0aW9uLmxlbmd0aCAtIChhcmd1bWVudHMubGVuZ3RoIC0gMSkpLFxuXHRcdHRydWVcblx0KTtcbn07XG5cbnZhciBhcHBseUJpbmQgPSBmdW5jdGlvbiBhcHBseUJpbmQoKSB7XG5cdHJldHVybiAkcmVmbGVjdEFwcGx5KGJpbmQsICRhcHBseSwgYXJndW1lbnRzKTtcbn07XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0JGRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYXBwbHknLCB7IHZhbHVlOiBhcHBseUJpbmQgfSk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cy5hcHBseSA9IGFwcGx5QmluZDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnLi8nKTtcblxudmFyICRpbmRleE9mID0gY2FsbEJpbmQoR2V0SW50cmluc2ljKCdTdHJpbmcucHJvdG90eXBlLmluZGV4T2YnKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJvdW5kSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljID0gR2V0SW50cmluc2ljKG5hbWUsICEhYWxsb3dNaXNzaW5nKTtcblx0aWYgKHR5cGVvZiBpbnRyaW5zaWMgPT09ICdmdW5jdGlvbicgJiYgJGluZGV4T2YobmFtZSwgJy5wcm90b3R5cGUuJykgPiAtMSkge1xuXHRcdHJldHVybiBjYWxsQmluZChpbnRyaW5zaWMpO1xuXHR9XG5cdHJldHVybiBpbnRyaW5zaWM7XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge30iLCJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlO1xudmFyIHdlYWtNYXBIYXMgPSBoYXNXZWFrTWFwID8gV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgJiYgV2Vha1NldC5wcm90b3R5cGU7XG52YXIgd2Vha1NldEhhcyA9IGhhc1dlYWtTZXQgPyBXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtSZWYgPSB0eXBlb2YgV2Vha1JlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrUmVmLnByb3RvdHlwZTtcbnZhciB3ZWFrUmVmRGVyZWYgPSBoYXNXZWFrUmVmID8gV2Vha1JlZi5wcm90b3R5cGUuZGVyZWYgOiBudWxsO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciAkbWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xudmFyICRzbGljZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2U7XG52YXIgJHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgJHRvVXBwZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZTtcbnZhciAkdG9Mb3dlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlO1xudmFyICR0ZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xudmFyICRjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyICRqb2luID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG52YXIgJGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xudmFyIGdPUFMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIHN5bVRvU3RyaW5nID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgOiBudWxsO1xudmFyIGhhc1NoYW1tZWRTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnb2JqZWN0Jztcbi8vIGllLCBgaGFzLXRvc3RyaW5ndGFnL3NoYW1zXG52YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gaGFzU2hhbW1lZFN5bWJvbHMgPyAnb2JqZWN0JyA6ICdzeW1ib2wnKVxuICAgID8gU3ltYm9sLnRvU3RyaW5nVGFnXG4gICAgOiBudWxsO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBnUE8gPSAodHlwZW9mIFJlZmxlY3QgPT09ICdmdW5jdGlvbicgPyBSZWZsZWN0LmdldFByb3RvdHlwZU9mIDogT2JqZWN0LmdldFByb3RvdHlwZU9mKSB8fCAoXG4gICAgW10uX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICA/IGZ1bmN0aW9uIChPKSB7XG4gICAgICAgICAgICByZXR1cm4gTy5fX3Byb3RvX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgfVxuICAgICAgICA6IG51bGxcbik7XG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLCBzdHIpIHtcbiAgICBpZiAoXG4gICAgICAgIG51bSA9PT0gSW5maW5pdHlcbiAgICAgICAgfHwgbnVtID09PSAtSW5maW5pdHlcbiAgICAgICAgfHwgbnVtICE9PSBudW1cbiAgICAgICAgfHwgKG51bSAmJiBudW0gPiAtMTAwMCAmJiBudW0gPCAxMDAwKVxuICAgICAgICB8fCAkdGVzdC5jYWxsKC9lLywgc3RyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICB2YXIgc2VwUmVnZXggPSAvWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO1xuICAgIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgaW50ID0gbnVtIDwgMCA/IC0kZmxvb3IoLW51bSkgOiAkZmxvb3IobnVtKTsgLy8gdHJ1bmMobnVtKVxuICAgICAgICBpZiAoaW50ICE9PSBudW0pIHtcbiAgICAgICAgICAgIHZhciBpbnRTdHIgPSBTdHJpbmcoaW50KTtcbiAgICAgICAgICAgIHZhciBkZWMgPSAkc2xpY2UuY2FsbChzdHIsIGludFN0ci5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKGludFN0ciwgc2VwUmVnZXgsICckJl8nKSArICcuJyArICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChkZWMsIC8oWzAtOV17M30pL2csICckJl8nKSwgL18kLywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHN0ciwgc2VwUmVnZXgsICckJl8nKTtcbn1cblxudmFyIHV0aWxJbnNwZWN0ID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgKG9wdHMucXVvdGVTdHlsZSAhPT0gJ3NpbmdsZScgJiYgb3B0cy5xdW90ZVN0eWxlICE9PSAnZG91YmxlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIGlmIChtYXBGb3JFYWNoKSB7XG4gICAgICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIGlmIChzZXRGb3JFYWNoKSB7XG4gICAgICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0cy5wdXNoKGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignU2V0Jywgc2V0U2l6ZS5jYWxsKG9iaiksIHNldFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrTWFwKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtNYXAnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1NldChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrU2V0Jyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1JlZicpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICAvLyBub3RlOiBpbiBJRSA4LCBzb21ldGltZXMgYGdsb2JhbCAhPT0gd2luZG93YCBidXQgYm90aCBhcmUgdGhlIHByb3RvdHlwZXMgb2YgZWFjaCBvdGhlclxuICAgIC8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IHdpbmRvdykge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBXaW5kb3ddIH0nO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWxUaGlzKVxuICAgICAgICB8fCAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWwpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IGdsb2JhbFRoaXNdIH0nO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgcXVvdGVDaGFyID0gKG9wdHMucXVvdGVTdHlsZSB8fCBkZWZhdWx0U3R5bGUpID09PSAnZG91YmxlJyA/ICdcIicgOiBcIidcIjtcbiAgICByZXR1cm4gcXVvdGVDaGFyICsgcyArIHF1b3RlQ2hhcjtcbn1cblxuZnVuY3Rpb24gcXVvdGUocykge1xuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKFN0cmluZyhzKSwgL1wiL2csICcmcXVvdDsnKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgdmFyIHMgPSAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoc3RyLCAvKFsnXFxcXF0pL2csICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFdlYWtNYXAgPSBHZXRJbnRyaW5zaWMoJyVXZWFrTWFwJScsIHRydWUpO1xudmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cbnZhciAkd2Vha01hcEdldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBTZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xudmFyICR3ZWFrTWFwSGFzID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcbnZhciAkbWFwR2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xudmFyICRtYXBTZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJG1hcEhhcyA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcblxuLypcbiogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGxpc3QgcmV0dXJuaW5nIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleS5cbipcbiogVGhhdCBub2RlIGlzIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXQgaWYgaXQncyBhY2Nlc3NlZCBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIHRyYXZlcnNlIHRoZSB3aG9sZSBsaXN0LiBCeSBkb2luZyBzbywgYWxsIHRoZSByZWNlbnRseSB1c2VkIG5vZGVzIGNhbiBiZSBhY2Nlc3NlZCByZWxhdGl2ZWx5IHF1aWNrbHkuXG4qL1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5saXN0R2V0Tm9kZX0gKi9cbnZhciBsaXN0R2V0Tm9kZSA9IGZ1bmN0aW9uIChsaXN0LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHQvKiogQHR5cGUge3R5cGVvZiBsaXN0IHwgTm9uTnVsbGFibGU8KHR5cGVvZiBsaXN0KVsnbmV4dCddPn0gKi9cblx0dmFyIHByZXYgPSBsaXN0O1xuXHQvKiogQHR5cGUgeyh0eXBlb2YgbGlzdClbJ25leHQnXX0gKi9cblx0dmFyIGN1cnI7XG5cdGZvciAoOyAoY3VyciA9IHByZXYubmV4dCkgIT09IG51bGw7IHByZXYgPSBjdXJyKSB7XG5cdFx0aWYgKGN1cnIua2V5ID09PSBrZXkpIHtcblx0XHRcdHByZXYubmV4dCA9IGN1cnIubmV4dDtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHRcdGN1cnIubmV4dCA9IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIGxpc3QubmV4dD59ICovIChsaXN0Lm5leHQpO1xuXHRcdFx0bGlzdC5uZXh0ID0gY3VycjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0cmV0dXJuIGN1cnI7XG5cdFx0fVxuXHR9XG59O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpLmxpc3RHZXR9ICovXG52YXIgbGlzdEdldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXkpIHtcblx0dmFyIG5vZGUgPSBsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xuXHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlO1xufTtcbi8qKiBAdHlwZSB7aW1wb3J0KCcuJykubGlzdFNldH0gKi9cbnZhciBsaXN0U2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSwgdmFsdWUpIHtcblx0dmFyIG5vZGUgPSBsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xuXHRpZiAobm9kZSkge1xuXHRcdG5vZGUudmFsdWUgPSB2YWx1ZTtcblx0fSBlbHNlIHtcblx0XHQvLyBQcmVwZW5kIHRoZSBuZXcgbm9kZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cdFx0b2JqZWN0cy5uZXh0ID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5MaXN0Tm9kZTx0eXBlb2YgdmFsdWU+fSAqLyAoeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduLCBuby1leHRyYS1wYXJlbnNcblx0XHRcdGtleToga2V5LFxuXHRcdFx0bmV4dDogb2JqZWN0cy5uZXh0LFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fSk7XG5cdH1cbn07XG4vKiogQHR5cGUge2ltcG9ydCgnLicpLmxpc3RIYXN9ICovXG52YXIgbGlzdEhhcyA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXkpIHtcblx0cmV0dXJuICEhbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcbn07XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsKCkge1xuXHQvKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCB1bmtub3duPn0gKi8gdmFyICR3bTtcblx0LyoqIEB0eXBlIHtNYXA8b2JqZWN0LCB1bmtub3duPn0gKi8gdmFyICRtO1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpLlJvb3ROb2RlPHVua25vd24+fSAqLyB2YXIgJG87XG5cblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5DaGFubmVsfSAqL1xuXHR2YXIgY2hhbm5lbCA9IHtcblx0XHRhc3NlcnQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICghY2hhbm5lbC5oYXMoa2V5KSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignU2lkZSBjaGFubmVsIGRvZXMgbm90IGNvbnRhaW4gJyArIGluc3BlY3Qoa2V5KSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0aWYgKCR3bSkge1xuXHRcdFx0XHRcdHJldHVybiAkd2Vha01hcEdldCgkd20sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoJE1hcCkge1xuXHRcdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0XHRyZXR1cm4gJG1hcEdldCgkbSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCRvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbG9uZWx5LWlmXG5cdFx0XHRcdFx0cmV0dXJuIGxpc3RHZXQoJG8sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGhhczogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0aWYgKCR3bSkge1xuXHRcdFx0XHRcdHJldHVybiAkd2Vha01hcEhhcygkd20sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoJE1hcCkge1xuXHRcdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0XHRyZXR1cm4gJG1hcEhhcygkbSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCRvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbG9uZWx5LWlmXG5cdFx0XHRcdFx0cmV0dXJuIGxpc3RIYXMoJG8sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICghJHdtKSB7XG5cdFx0XHRcdFx0JHdtID0gbmV3ICRXZWFrTWFwKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JHdlYWtNYXBTZXQoJHdtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSBpZiAoJE1hcCkge1xuXHRcdFx0XHRpZiAoISRtKSB7XG5cdFx0XHRcdFx0JG0gPSBuZXcgJE1hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCRtYXBTZXQoJG0sIGtleSwgdmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCEkbykge1xuXHRcdFx0XHRcdC8vIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0IGFzIGFuIGVtcHR5IG5vZGUsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2YgdGhlIGZpcnN0IG5vZGU6IHdlIGNhbiBhbHdheXMgcmVmZXIgdG8gaXQgYXMgKHByZXZpb3VzIG5vZGUpLm5leHQsIGluc3RlYWQgb2Ygc29tZXRoaW5nIGxpa2UgKGxpc3QpLmhlYWRcblx0XHRcdFx0XHQkbyA9IHsga2V5OiB7fSwgbmV4dDogbnVsbCB9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxpc3RTZXQoJG8sIGtleSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0cmV0dXJuIGNoYW5uZWw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbnZhciBGb3JtYXQgPSB7XG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2RlZmF1bHQnOiBGb3JtYXQuUkZDMzk4NixcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiBGb3JtYXQuUkZDMTczOCxcbiAgICBSRkMzOTg2OiBGb3JtYXQuUkZDMzk4NlxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgLyogZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOiAwICovXG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyAmJiAob3B0aW9ucy5wbGFpbk9iamVjdHMgfHwgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpKSB8fCAhaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVjb2RlciwgY2hhcnNldCkge1xuICAgIHZhciBzdHJXaXRob3V0UGx1cyA9IHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIC8vIHVuZXNjYXBlIG5ldmVyIHRocm93cywgbm8gdHJ5Li4uY2F0Y2ggbmVlZGVkOlxuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXMucmVwbGFjZSgvJVswLTlhLWZdezJ9L2dpLCB1bmVzY2FwZSk7XG4gICAgfVxuICAgIC8vIHV0Zi04XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJXaXRob3V0UGx1cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXM7XG4gICAgfVxufTtcblxudmFyIGxpbWl0ID0gMTAyNDtcblxuLyogZXNsaW50IG9wZXJhdG9yLWxpbmVicmVhazogWzIsIFwiYmVmb3JlXCJdICovXG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyLCBkZWZhdWx0RW5jb2RlciwgY2hhcnNldCwga2luZCwgZm9ybWF0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSBzdHI7XG4gICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHN0cmluZyA9IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzdHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyaW5nID0gU3RyaW5nKHN0cik7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0cmluZy5sZW5ndGg7IGogKz0gbGltaXQpIHtcbiAgICAgICAgdmFyIHNlZ21lbnQgPSBzdHJpbmcubGVuZ3RoID49IGxpbWl0ID8gc3RyaW5nLnNsaWNlKGosIGogKyBsaW1pdCkgOiBzdHJpbmc7XG4gICAgICAgIHZhciBhcnIgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlZ21lbnQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBjID0gc2VnbWVudC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgICAgIHx8IGMgPT09IDB4MkUgLy8gLlxuICAgICAgICAgICAgICAgIHx8IGMgPT09IDB4NUYgLy8gX1xuICAgICAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4MzAgJiYgYyA8PSAweDM5KSAvLyAwLTlcbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDQxICYmIGMgPD0gMHg1QSkgLy8gYS16XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICAgICAgICAgIHx8IChmb3JtYXQgPT09IGZvcm1hdHMuUkZDMTczOCAmJiAoYyA9PT0gMHgyOCB8fCBjID09PSAweDI5KSkgLy8gKCApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBzZWdtZW50LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbY107XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVsweEMwIHwgKGMgPj4gNildXG4gICAgICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildXG4gICAgICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzZWdtZW50LmNoYXJDb2RlQXQoaSkgJiAweDNGRikpO1xuXG4gICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKV1cbiAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dCArPSBhcnIuam9pbignJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbnZhciBjb21wYWN0ID0gZnVuY3Rpb24gY29tcGFjdCh2YWx1ZSkge1xuICAgIHZhciBxdWV1ZSA9IFt7IG9iajogeyBvOiB2YWx1ZSB9LCBwcm9wOiAnbycgfV07XG4gICAgdmFyIHJlZnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZVtpXTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiByZWZzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqOiBvYmosIHByb3A6IGtleSB9KTtcbiAgICAgICAgICAgICAgICByZWZzLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhIShvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopKTtcbn07XG5cbnZhciBjb21iaW5lID0gZnVuY3Rpb24gY29tYmluZShhLCBiKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhLCBiKTtcbn07XG5cbnZhciBtYXliZU1hcCA9IGZ1bmN0aW9uIG1heWJlTWFwKHZhbCwgZm4pIHtcbiAgICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIG1hcHBlZC5wdXNoKGZuKHZhbFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICAgIHJldHVybiBmbih2YWwpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21iaW5lOiBjb21iaW5lLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtYXliZU1hcDogbWF5YmVNYXAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0U2lkZUNoYW5uZWwgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGFycmF5UHJlZml4R2VuZXJhdG9ycyA9IHtcbiAgICBicmFja2V0czogZnVuY3Rpb24gYnJhY2tldHMocHJlZml4KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnW10nO1xuICAgIH0sXG4gICAgY29tbWE6ICdjb21tYScsXG4gICAgaW5kaWNlczogZnVuY3Rpb24gaW5kaWNlcyhwcmVmaXgsIGtleSkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1snICsga2V5ICsgJ10nO1xuICAgIH0sXG4gICAgcmVwZWF0OiBmdW5jdGlvbiByZXBlYXQocHJlZml4KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaDtcbnZhciBwdXNoVG9BcnJheSA9IGZ1bmN0aW9uIChhcnIsIHZhbHVlT3JBcnJheSkge1xuICAgIHB1c2guYXBwbHkoYXJyLCBpc0FycmF5KHZhbHVlT3JBcnJheSkgPyB2YWx1ZU9yQXJyYXkgOiBbdmFsdWVPckFycmF5XSk7XG59O1xuXG52YXIgdG9JU08gPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcblxudmFyIGRlZmF1bHRGb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWRkUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dFbXB0eUFycmF5czogZmFsc2UsXG4gICAgYXJyYXlGb3JtYXQ6ICdpbmRpY2VzJyxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZURvdEluS2V5czogZmFsc2UsXG4gICAgZW5jb2RlcjogdXRpbHMuZW5jb2RlLFxuICAgIGVuY29kZVZhbHVlc09ubHk6IGZhbHNlLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBmb3JtYXR0ZXI6IGZvcm1hdHMuZm9ybWF0dGVyc1tkZWZhdWx0Rm9ybWF0XSxcbiAgICAvLyBkZXByZWNhdGVkXG4gICAgaW5kaWNlczogZmFsc2UsXG4gICAgc2VyaWFsaXplRGF0ZTogZnVuY3Rpb24gc2VyaWFsaXplRGF0ZShkYXRlKSB7XG4gICAgICAgIHJldHVybiB0b0lTTy5jYWxsKGRhdGUpO1xuICAgIH0sXG4gICAgc2tpcE51bGxzOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlXG59O1xuXG52YXIgaXNOb25OdWxsaXNoUHJpbWl0aXZlID0gZnVuY3Rpb24gaXNOb25OdWxsaXNoUHJpbWl0aXZlKHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnbnVtYmVyJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnc3ltYm9sJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ2JpZ2ludCc7XG59O1xuXG52YXIgc2VudGluZWwgPSB7fTtcblxudmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShcbiAgICBvYmplY3QsXG4gICAgcHJlZml4LFxuICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgY29tbWFSb3VuZFRyaXAsXG4gICAgYWxsb3dFbXB0eUFycmF5cyxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgc2tpcE51bGxzLFxuICAgIGVuY29kZURvdEluS2V5cyxcbiAgICBlbmNvZGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0LFxuICAgIGFsbG93RG90cyxcbiAgICBzZXJpYWxpemVEYXRlLFxuICAgIGZvcm1hdCxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICBjaGFyc2V0LFxuICAgIHNpZGVDaGFubmVsXG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuXG4gICAgdmFyIHRtcFNjID0gc2lkZUNoYW5uZWw7XG4gICAgdmFyIHN0ZXAgPSAwO1xuICAgIHZhciBmaW5kRmxhZyA9IGZhbHNlO1xuICAgIHdoaWxlICgodG1wU2MgPSB0bXBTYy5nZXQoc2VudGluZWwpKSAhPT0gdm9pZCB1bmRlZmluZWQgJiYgIWZpbmRGbGFnKSB7XG4gICAgICAgIC8vIFdoZXJlIG9iamVjdCBsYXN0IGFwcGVhcmVkIGluIHRoZSByZWYgdHJlZVxuICAgICAgICB2YXIgcG9zID0gdG1wU2MuZ2V0KG9iamVjdCk7XG4gICAgICAgIHN0ZXAgKz0gMTtcbiAgICAgICAgaWYgKHR5cGVvZiBwb3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAocG9zID09PSBzdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0N5Y2xpYyBvYmplY3QgdmFsdWUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluZEZsYWcgPSB0cnVlOyAvLyBCcmVhayB3aGlsZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdG1wU2MuZ2V0KHNlbnRpbmVsKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN0ZXAgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqID0gZmlsdGVyKHByZWZpeCwgb2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb2JqID0gc2VyaWFsaXplRGF0ZShvYmopO1xuICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBpc0FycmF5KG9iaikpIHtcbiAgICAgICAgb2JqID0gdXRpbHMubWF5YmVNYXAob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHN0cmljdE51bGxIYW5kbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIgJiYgIWVuY29kZVZhbHVlc09ubHkgPyBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCkgOiBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICBvYmogPSAnJztcbiAgICB9XG5cbiAgICBpZiAoaXNOb25OdWxsaXNoUHJpbWl0aXZlKG9iaikgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0LCAna2V5JywgZm9ybWF0KTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ3ZhbHVlJywgZm9ybWF0KSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbZm9ybWF0dGVyKHByZWZpeCkgKyAnPScgKyBmb3JtYXR0ZXIoU3RyaW5nKG9iaikpXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBpc0FycmF5KG9iaikpIHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBqb2luIGVsZW1lbnRzIGluXG4gICAgICAgIGlmIChlbmNvZGVWYWx1ZXNPbmx5ICYmIGVuY29kZXIpIHtcbiAgICAgICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZW5jb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgb2JqS2V5cyA9IFt7IHZhbHVlOiBvYmoubGVuZ3RoID4gMCA/IG9iai5qb2luKCcsJykgfHwgbnVsbCA6IHZvaWQgdW5kZWZpbmVkIH1dO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBvYmpLZXlzID0gc29ydCA/IGtleXMuc29ydChzb3J0KSA6IGtleXM7XG4gICAgfVxuXG4gICAgdmFyIGVuY29kZWRQcmVmaXggPSBlbmNvZGVEb3RJbktleXMgPyBwcmVmaXgucmVwbGFjZSgvXFwuL2csICclMkUnKSA6IHByZWZpeDtcblxuICAgIHZhciBhZGp1c3RlZFByZWZpeCA9IGNvbW1hUm91bmRUcmlwICYmIGlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAxID8gZW5jb2RlZFByZWZpeCArICdbXScgOiBlbmNvZGVkUHJlZml4O1xuXG4gICAgaWYgKGFsbG93RW1wdHlBcnJheXMgJiYgaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGFkanVzdGVkUHJlZml4ICsgJ1tdJztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iaktleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbal07XG4gICAgICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkudmFsdWUgIT09ICd1bmRlZmluZWQnID8ga2V5LnZhbHVlIDogb2JqW2tleV07XG5cbiAgICAgICAgaWYgKHNraXBOdWxscyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5jb2RlZEtleSA9IGFsbG93RG90cyAmJiBlbmNvZGVEb3RJbktleXMgPyBrZXkucmVwbGFjZSgvXFwuL2csICclMkUnKSA6IGtleTtcbiAgICAgICAgdmFyIGtleVByZWZpeCA9IGlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyB0eXBlb2YgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2Z1bmN0aW9uJyA/IGdlbmVyYXRlQXJyYXlQcmVmaXgoYWRqdXN0ZWRQcmVmaXgsIGVuY29kZWRLZXkpIDogYWRqdXN0ZWRQcmVmaXhcbiAgICAgICAgICAgIDogYWRqdXN0ZWRQcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsgZW5jb2RlZEtleSA6ICdbJyArIGVuY29kZWRLZXkgKyAnXScpO1xuXG4gICAgICAgIHNpZGVDaGFubmVsLnNldChvYmplY3QsIHN0ZXApO1xuICAgICAgICB2YXIgdmFsdWVTaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgICAgIHZhbHVlU2lkZUNoYW5uZWwuc2V0KHNlbnRpbmVsLCBzaWRlQ2hhbm5lbCk7XG4gICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXlQcmVmaXgsXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBhbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5ICYmIGlzQXJyYXkob2JqKSA/IG51bGwgOiBlbmNvZGVyLFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgY2hhcnNldCxcbiAgICAgICAgICAgIHZhbHVlU2lkZUNoYW5uZWxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbnZhciBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZW5jb2RlRG90SW5LZXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdHMuY2hhcnNldCB8fCBkZWZhdWx0cy5jaGFyc2V0O1xuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICghaGFzLmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXQgPSBvcHRzLmZvcm1hdDtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXG4gICAgdmFyIGZpbHRlciA9IGRlZmF1bHRzLmZpbHRlcjtcbiAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IGlzQXJyYXkob3B0cy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdHMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9IGRlZmF1bHRzLmFycmF5Rm9ybWF0O1xuICAgIH1cblxuICAgIGlmICgnY29tbWFSb3VuZFRyaXAnIGluIG9wdHMgJiYgdHlwZW9mIG9wdHMuY29tbWFSb3VuZFRyaXAgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY29tbWFSb3VuZFRyaXBgIG11c3QgYmUgYSBib29sZWFuLCBvciBhYnNlbnQnKTtcbiAgICB9XG5cbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSB0cnVlID8gdHJ1ZSA6IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRRdWVyeVByZWZpeDogdHlwZW9mIG9wdHMuYWRkUXVlcnlQcmVmaXggPT09ICdib29sZWFuJyA/IG9wdHMuYWRkUXVlcnlQcmVmaXggOiBkZWZhdWx0cy5hZGRRdWVyeVByZWZpeCxcbiAgICAgICAgYWxsb3dEb3RzOiBhbGxvd0RvdHMsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheXM6IHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgPT09ICdib29sZWFuJyA/ICEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzIDogZGVmYXVsdHMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgYXJyYXlGb3JtYXQ6IGFycmF5Rm9ybWF0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hUm91bmRUcmlwOiBvcHRzLmNvbW1hUm91bmRUcmlwLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kZWxpbWl0ZXIgOiBvcHRzLmRlbGltaXRlcixcbiAgICAgICAgZW5jb2RlOiB0eXBlb2Ygb3B0cy5lbmNvZGUgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlIDogZGVmYXVsdHMuZW5jb2RlLFxuICAgICAgICBlbmNvZGVEb3RJbktleXM6IHR5cGVvZiBvcHRzLmVuY29kZURvdEluS2V5cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGVEb3RJbktleXMgOiBkZWZhdWx0cy5lbmNvZGVEb3RJbktleXMsXG4gICAgICAgIGVuY29kZXI6IHR5cGVvZiBvcHRzLmVuY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmVuY29kZXIgOiBkZWZhdWx0cy5lbmNvZGVyLFxuICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5OiB0eXBlb2Ygb3B0cy5lbmNvZGVWYWx1ZXNPbmx5ID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZVZhbHVlc09ubHkgOiBkZWZhdWx0cy5lbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICAgIGZvcm1hdHRlcjogZm9ybWF0dGVyLFxuICAgICAgICBzZXJpYWxpemVEYXRlOiB0eXBlb2Ygb3B0cy5zZXJpYWxpemVEYXRlID09PSAnZnVuY3Rpb24nID8gb3B0cy5zZXJpYWxpemVEYXRlIDogZGVmYXVsdHMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgc2tpcE51bGxzOiB0eXBlb2Ygb3B0cy5za2lwTnVsbHMgPT09ICdib29sZWFuJyA/IG9wdHMuc2tpcE51bGxzIDogZGVmYXVsdHMuc2tpcE51bGxzLFxuICAgICAgICBzb3J0OiB0eXBlb2Ygb3B0cy5zb3J0ID09PSAnZnVuY3Rpb24nID8gb3B0cy5zb3J0IDogbnVsbCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgb3B0cykge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpO1xuXG4gICAgdmFyIG9iaktleXM7XG4gICAgdmFyIGZpbHRlcjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaiA9IGZpbHRlcignJywgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob3B0aW9ucy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1tvcHRpb25zLmFycmF5Rm9ybWF0XTtcbiAgICB2YXIgY29tbWFSb3VuZFRyaXAgPSBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIG9wdGlvbnMuY29tbWFSb3VuZFRyaXA7XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc29ydCkge1xuICAgICAgICBvYmpLZXlzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgICB9XG5cbiAgICB2YXIgc2lkZUNoYW5uZWwgPSBnZXRTaWRlQ2hhbm5lbCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIGNvbW1hUm91bmRUcmlwLFxuICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBvcHRpb25zLnNraXBOdWxscyxcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXQsXG4gICAgICAgICAgICBzaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGRlZmF1bHRzID0ge1xuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dFbXB0eUFycmF5czogZmFsc2UsXG4gICAgYWxsb3dQcm90b3R5cGVzOiBmYWxzZSxcbiAgICBhbGxvd1NwYXJzZTogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hOiBmYWxzZSxcbiAgICBkZWNvZGVEb3RJbktleXM6IGZhbHNlLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBkdXBsaWNhdGVzOiAnY29tYmluZScsXG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogZmFsc2UsXG4gICAgcGFyYW1ldGVyTGltaXQ6IDEwMDAsXG4gICAgcGFyc2VBcnJheXM6IHRydWUsXG4gICAgcGxhaW5PYmplY3RzOiBmYWxzZSxcbiAgICBzdHJpY3REZXB0aDogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICB2YXIgY2xlYW5TdHIgPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID8gc3RyLnJlcGxhY2UoL15cXD8vLCAnJykgOiBzdHI7XG4gICAgY2xlYW5TdHIgPSBjbGVhblN0ci5yZXBsYWNlKC8lNUIvZ2ksICdbJykucmVwbGFjZSgvJTVEL2dpLCAnXScpO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICdrZXknKTtcbiAgICAgICAgICAgIHZhbCA9IHV0aWxzLm1heWJlTWFwKFxuICAgICAgICAgICAgICAgIHBhcnNlQXJyYXlWYWx1ZShwYXJ0LnNsaWNlKHBvcyArIDEpLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZW5jb2RlZFZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZWNvZGVyKGVuY29kZWRWYWwsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydC5pbmRleE9mKCdbXT0nKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWwgPSBpc0FycmF5KHZhbCkgPyBbdmFsXSA6IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleGlzdGluZyA9IGhhcy5jYWxsKG9iaiwga2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2NvbWJpbmUnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nIHx8IG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgdmFyIGxlYWYgPSB2YWx1ZXNQYXJzZWQgPyB2YWwgOiBwYXJzZUFycmF5VmFsdWUodmFsLCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMuYWxsb3dFbXB0eUFycmF5cyAmJiAobGVhZiA9PT0gJycgfHwgKG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nICYmIGxlYWYgPT09IG51bGwpKVxuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGRlY29kZWRSb290ID0gb3B0aW9ucy5kZWNvZGVEb3RJbktleXMgPyBjbGVhblJvb3QucmVwbGFjZSgvJTJFL2csICcuJykgOiBjbGVhblJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChkZWNvZGVkUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcnNlQXJyYXlzICYmIGRlY29kZWRSb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gZGVjb2RlZFJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAmJiAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgICAgICBvYmpbaW5kZXhdID0gbGVhZjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlZFJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2RlY29kZWRSb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCkge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBvcHRpb25zLmRlcHRoID4gMCAmJiBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob3B0aW9ucy5kZXB0aCA+IDAgJiYgKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGNoZWNrIHN0cmljdERlcHRoIG9wdGlvbiBmb3IgdGhyb3csIGVsc2UganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0RGVwdGggPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnB1dCBkZXB0aCBleGNlZWRlZCBkZXB0aCBvcHRpb24gb2YgJyArIG9wdGlvbnMuZGVwdGggKyAnIGFuZCBzdHJpY3REZXB0aCBpcyB0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKTtcbn07XG5cbnZhciBub3JtYWxpemVQYXJzZU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgYWxsb3dFbXB0eUFycmF5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGRlY29kZURvdEluS2V5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVjb2RlciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0RlY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICB2YXIgY2hhcnNldCA9IHR5cGVvZiBvcHRzLmNoYXJzZXQgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuY2hhcnNldCA6IG9wdHMuY2hhcnNldDtcblxuICAgIHZhciBkdXBsaWNhdGVzID0gdHlwZW9mIG9wdHMuZHVwbGljYXRlcyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kdXBsaWNhdGVzIDogb3B0cy5kdXBsaWNhdGVzO1xuXG4gICAgaWYgKGR1cGxpY2F0ZXMgIT09ICdjb21iaW5lJyAmJiBkdXBsaWNhdGVzICE9PSAnZmlyc3QnICYmIGR1cGxpY2F0ZXMgIT09ICdsYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZHVwbGljYXRlcyBvcHRpb24gbXVzdCBiZSBlaXRoZXIgY29tYmluZSwgZmlyc3QsIG9yIGxhc3QnKTtcbiAgICB9XG5cbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IG9wdHMuZGVjb2RlRG90SW5LZXlzID09PSB0cnVlID8gdHJ1ZSA6IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd0RvdHM6IGFsbG93RG90cyxcbiAgICAgICAgYWxsb3dFbXB0eUFycmF5czogdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLmFsbG93RW1wdHlBcnJheXMgOiBkZWZhdWx0cy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICBhbGxvd1Byb3RvdHlwZXM6IHR5cGVvZiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXMsXG4gICAgICAgIGFsbG93U3BhcnNlOiB0eXBlb2Ygb3B0cy5hbGxvd1NwYXJzZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1NwYXJzZSA6IGRlZmF1bHRzLmFsbG93U3BhcnNlLFxuICAgICAgICBhcnJheUxpbWl0OiB0eXBlb2Ygb3B0cy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWE6IHR5cGVvZiBvcHRzLmNvbW1hID09PSAnYm9vbGVhbicgPyBvcHRzLmNvbW1hIDogZGVmYXVsdHMuY29tbWEsXG4gICAgICAgIGRlY29kZURvdEluS2V5czogdHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzID09PSAnYm9vbGVhbicgPyBvcHRzLmRlY29kZURvdEluS2V5cyA6IGRlZmF1bHRzLmRlY29kZURvdEluS2V5cyxcbiAgICAgICAgZGVjb2RlcjogdHlwZW9mIG9wdHMuZGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZGVjb2RlciA6IGRlZmF1bHRzLmRlY29kZXIsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAnc3RyaW5nJyB8fCB1dGlscy5pc1JlZ0V4cChvcHRzLmRlbGltaXRlcikgPyBvcHRzLmRlbGltaXRlciA6IGRlZmF1bHRzLmRlbGltaXRlcixcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uLCBuby1leHRyYS1wYXJlbnNcbiAgICAgICAgZGVwdGg6ICh0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ251bWJlcicgfHwgb3B0cy5kZXB0aCA9PT0gZmFsc2UpID8gK29wdHMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aCxcbiAgICAgICAgZHVwbGljYXRlczogZHVwbGljYXRlcyxcbiAgICAgICAgaWdub3JlUXVlcnlQcmVmaXg6IG9wdHMuaWdub3JlUXVlcnlQcmVmaXggPT09IHRydWUsXG4gICAgICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogdHlwZW9mIG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID09PSAnYm9vbGVhbicgPyBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA6IGRlZmF1bHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyxcbiAgICAgICAgcGFyYW1ldGVyTGltaXQ6IHR5cGVvZiBvcHRzLnBhcmFtZXRlckxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMucGFyYW1ldGVyTGltaXQgOiBkZWZhdWx0cy5wYXJhbWV0ZXJMaW1pdCxcbiAgICAgICAgcGFyc2VBcnJheXM6IG9wdHMucGFyc2VBcnJheXMgIT09IGZhbHNlLFxuICAgICAgICBwbGFpbk9iamVjdHM6IHR5cGVvZiBvcHRzLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHMsXG4gICAgICAgIHN0cmljdERlcHRoOiB0eXBlb2Ygb3B0cy5zdHJpY3REZXB0aCA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLnN0cmljdERlcHRoIDogZGVmYXVsdHMuc3RyaWN0RGVwdGgsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKTtcblxuICAgIGlmIChzdHIgPT09ICcnIHx8IHN0ciA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgfVxuXG4gICAgdmFyIHRlbXBPYmogPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHBhcnNlVmFsdWVzKHN0ciwgb3B0aW9ucykgOiBzdHI7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBrZXlzIGFuZCBzZXR1cCB0aGUgbmV3IG9iamVjdFxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0ZW1wT2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBuZXdPYmogPSBwYXJzZUtleXMoa2V5LCB0ZW1wT2JqW2tleV0sIG9wdGlvbnMsIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKTtcbiAgICAgICAgb2JqID0gdXRpbHMubWVyZ2Uob2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFsbG93U3BhcnNlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLmNvbXBhY3Qob2JqKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG4iLCIvL1xuLy8gVEhJUyBGSUxFIElTIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEISBETyBOT1QgRURJVCBCWSBIQU5EIVxuLy9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KClcbiAgICAgICAgOiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWRcbiAgICAgICAgICAgID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtYmFzZTY0L2lzc3Vlcy8xMTlcbiAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgdmVyc2lvbiBmb3Igbm9Db25mbGljdCgpXG4gICAgICAgICAgICAgICAgdmFyIF9CYXNlNjQgPSBnbG9iYWwuQmFzZTY0O1xuICAgICAgICAgICAgICAgIHZhciBnQmFzZTY0ID0gZmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgIGdCYXNlNjQubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkJhc2U2NCA9IF9CYXNlNjQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnQmFzZTY0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbC5NZXRlb3IpIHsgLy8gTWV0ZW9yLmpzXG4gICAgICAgICAgICAgICAgICAgIEJhc2U2NCA9IGdCYXNlNjQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdsb2JhbC5CYXNlNjQgPSBnQmFzZTY0O1xuICAgICAgICAgICAgfSkoKTtcbn0oKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGZcbiAgICA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93XG4gICAgICAgIDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxcbiAgICAgICAgICAgIDogdGhpcyksIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgLyoqXG4gICAgICogIGJhc2U2NC50c1xuICAgICAqXG4gICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgMy1DbGF1c2UgTGljZW5zZS5cbiAgICAgKiAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gICAgICpcbiAgICAgKiAgUmVmZXJlbmNlczpcbiAgICAgKiAgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NFxuICAgICAqXG4gICAgICogQGF1dGhvciBEYW4gS29nYWkgKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaSlcbiAgICAgKi9cbiAgICB2YXIgdmVyc2lvbiA9ICczLjcuNyc7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGxvd2VyY2FzZSBgdmVyc2lvbmAuXG4gICAgICovXG4gICAgdmFyIFZFUlNJT04gPSB2ZXJzaW9uO1xuICAgIHZhciBfaGFzQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJztcbiAgICB2YXIgX1REID0gdHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHREZWNvZGVyKCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIF9URSA9IHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RW5jb2RlcigpIDogdW5kZWZpbmVkO1xuICAgIHZhciBiNjRjaCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG4gICAgdmFyIGI2NGNocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGI2NGNoKTtcbiAgICB2YXIgYjY0dGFiID0gKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciB0YWIgPSB7fTtcbiAgICAgICAgYS5mb3JFYWNoKGZ1bmN0aW9uIChjLCBpKSB7IHJldHVybiB0YWJbY10gPSBpOyB9KTtcbiAgICAgICAgcmV0dXJuIHRhYjtcbiAgICB9KShiNjRjaHMpO1xuICAgIHZhciBiNjRyZSA9IC9eKD86W0EtWmEtelxcZCtcXC9dezR9KSo/KD86W0EtWmEtelxcZCtcXC9dezJ9KD86PT0pP3xbQS1aYS16XFxkK1xcL117M309Pyk/JC87XG4gICAgdmFyIF9mcm9tQ0MgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmJpbmQoU3RyaW5nKTtcbiAgICB2YXIgX1U4QWZyb20gPSB0eXBlb2YgVWludDhBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gVWludDhBcnJheS5mcm9tLmJpbmQoVWludDhBcnJheSlcbiAgICAgICAgOiBmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0LCAwKSk7IH07XG4gICAgdmFyIF9ta1VyaVNhZmUgPSBmdW5jdGlvbiAoc3JjKSB7IHJldHVybiBzcmNcbiAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpLnJlcGxhY2UoL1srXFwvXS9nLCBmdW5jdGlvbiAobTApIHsgcmV0dXJuIG0wID09ICcrJyA/ICctJyA6ICdfJzsgfSk7IH07XG4gICAgdmFyIF90aWR5QjY0ID0gZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9dL2csICcnKTsgfTtcbiAgICAvKipcbiAgICAgKiBwb2x5ZmlsbCB2ZXJzaW9uIG9mIGBidG9hYFxuICAgICAqL1xuICAgIHZhciBidG9hUG9seWZpbGwgPSBmdW5jdGlvbiAoYmluKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7XG4gICAgICAgIHZhciB1MzIsIGMwLCBjMSwgYzIsIGFzYyA9ICcnO1xuICAgICAgICB2YXIgcGFkID0gYmluLmxlbmd0aCAlIDM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGlmICgoYzAgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fFxuICAgICAgICAgICAgICAgIChjMSA9IGJpbi5jaGFyQ29kZUF0KGkrKykpID4gMjU1IHx8XG4gICAgICAgICAgICAgICAgKGMyID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBjaGFyYWN0ZXIgZm91bmQnKTtcbiAgICAgICAgICAgIHUzMiA9IChjMCA8PCAxNikgfCAoYzEgPDwgOCkgfCBjMjtcbiAgICAgICAgICAgIGFzYyArPSBiNjRjaHNbdTMyID4+IDE4ICYgNjNdXG4gICAgICAgICAgICAgICAgKyBiNjRjaHNbdTMyID4+IDEyICYgNjNdXG4gICAgICAgICAgICAgICAgKyBiNjRjaHNbdTMyID4+IDYgJiA2M11cbiAgICAgICAgICAgICAgICArIGI2NGNoc1t1MzIgJiA2M107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZCA/IGFzYy5zbGljZSgwLCBwYWQgLSAzKSArIFwiPT09XCIuc3Vic3RyaW5nKHBhZCkgOiBhc2M7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBkb2VzIHdoYXQgYHdpbmRvdy5idG9hYCBvZiB3ZWIgYnJvd3NlcnMgZG8uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGJpbiBiaW5hcnkgc3RyaW5nXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gICAgICovXG4gICAgdmFyIF9idG9hID0gdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicgPyBmdW5jdGlvbiAoYmluKSB7IHJldHVybiBidG9hKGJpbik7IH1cbiAgICAgICAgOiBfaGFzQnVmZmVyID8gZnVuY3Rpb24gKGJpbikgeyByZXR1cm4gQnVmZmVyLmZyb20oYmluLCAnYmluYXJ5JykudG9TdHJpbmcoJ2Jhc2U2NCcpOyB9XG4gICAgICAgICAgICA6IGJ0b2FQb2x5ZmlsbDtcbiAgICB2YXIgX2Zyb21VaW50OEFycmF5ID0gX2hhc0J1ZmZlclxuICAgICAgICA/IGZ1bmN0aW9uICh1OGEpIHsgcmV0dXJuIEJ1ZmZlci5mcm9tKHU4YSkudG9TdHJpbmcoJ2Jhc2U2NCcpOyB9XG4gICAgICAgIDogZnVuY3Rpb24gKHU4YSkge1xuICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyNzEwMDAxL2hvdy10by1jb252ZXJ0LXVpbnQ4LWFycmF5LXRvLWJhc2U2NC1lbmNvZGVkLXN0cmluZy8xMjcxMzMyNiMxMjcxMzMyNlxuICAgICAgICAgICAgdmFyIG1heGFyZ3MgPSAweDEwMDA7XG4gICAgICAgICAgICB2YXIgc3RycyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB1OGEubGVuZ3RoOyBpIDwgbDsgaSArPSBtYXhhcmdzKSB7XG4gICAgICAgICAgICAgICAgc3Rycy5wdXNoKF9mcm9tQ0MuYXBwbHkobnVsbCwgdThhLnN1YmFycmF5KGksIGkgKyBtYXhhcmdzKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9idG9hKHN0cnMuam9pbignJykpO1xuICAgICAgICB9O1xuICAgIC8qKlxuICAgICAqIGNvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIEJhc2U2NCBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXJsc2FmZV0gVVJMLWFuZC1maWxlbmFtZS1zYWZlIGEgbGEgUkZDNDY0OCDCpzVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgc3RyaW5nXG4gICAgICovXG4gICAgdmFyIGZyb21VaW50OEFycmF5ID0gZnVuY3Rpb24gKHU4YSwgdXJsc2FmZSkge1xuICAgICAgICBpZiAodXJsc2FmZSA9PT0gdm9pZCAwKSB7IHVybHNhZmUgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gdXJsc2FmZSA/IF9ta1VyaVNhZmUoX2Zyb21VaW50OEFycmF5KHU4YSkpIDogX2Zyb21VaW50OEFycmF5KHU4YSk7XG4gICAgfTtcbiAgICAvLyBUaGlzIHRyaWNrIGlzIGZvdW5kIGJyb2tlbiBodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtYmFzZTY0L2lzc3Vlcy8xMzBcbiAgICAvLyBjb25zdCB1dG9iID0gKHNyYzogc3RyaW5nKSA9PiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3JjKSk7XG4gICAgLy8gcmV2ZXJ0aW5nIGdvb2Qgb2xkIGZhdGlvbmVkIHJlZ2V4cFxuICAgIHZhciBjYl91dG9iID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKGMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdmFyIGNjID0gYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgcmV0dXJuIGNjIDwgMHg4MCA/IGNcbiAgICAgICAgICAgICAgICA6IGNjIDwgMHg4MDAgPyAoX2Zyb21DQygweGMwIHwgKGNjID4+PiA2KSlcbiAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpXG4gICAgICAgICAgICAgICAgICAgIDogKF9mcm9tQ0MoMHhlMCB8ICgoY2MgPj4+IDEyKSAmIDB4MGYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoKGNjID4+PiA2KSAmIDB4M2YpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNjID0gMHgxMDAwMFxuICAgICAgICAgICAgICAgICsgKGMuY2hhckNvZGVBdCgwKSAtIDB4RDgwMCkgKiAweDQwMFxuICAgICAgICAgICAgICAgICsgKGMuY2hhckNvZGVBdCgxKSAtIDB4REMwMCk7XG4gICAgICAgICAgICByZXR1cm4gKF9mcm9tQ0MoMHhmMCB8ICgoY2MgPj4+IDE4KSAmIDB4MDcpKVxuICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gMTIpICYgMHgzZikpXG4gICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoKGNjID4+PiA2KSAmIDB4M2YpKVxuICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKGNjICYgMHgzZikpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIHJlX3V0b2IgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGRl18W15cXHgwMC1cXHg3Rl0vZztcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaG91bGQgaGF2ZSBiZWVuIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgVVRGLTggc3RyaW5nXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVVRGLTE2IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciB1dG9iID0gZnVuY3Rpb24gKHUpIHsgcmV0dXJuIHUucmVwbGFjZShyZV91dG9iLCBjYl91dG9iKTsgfTtcbiAgICAvL1xuICAgIHZhciBfZW5jb2RlID0gX2hhc0J1ZmZlclxuICAgICAgICA/IGZ1bmN0aW9uIChzKSB7IHJldHVybiBCdWZmZXIuZnJvbShzLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTsgfVxuICAgICAgICA6IF9URVxuICAgICAgICAgICAgPyBmdW5jdGlvbiAocykgeyByZXR1cm4gX2Zyb21VaW50OEFycmF5KF9URS5lbmNvZGUocykpOyB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChzKSB7IHJldHVybiBfYnRvYSh1dG9iKHMpKTsgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBhIFVURi04LWVuY29kZWQgc3RyaW5nIHRvIGEgQmFzZTY0IHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cmxzYWZlXSBpZiBgdHJ1ZWAgbWFrZSB0aGUgcmVzdWx0IFVSTC1zYWZlXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBlbmNvZGUgPSBmdW5jdGlvbiAoc3JjLCB1cmxzYWZlKSB7XG4gICAgICAgIGlmICh1cmxzYWZlID09PSB2b2lkIDApIHsgdXJsc2FmZSA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiB1cmxzYWZlXG4gICAgICAgICAgICA/IF9ta1VyaVNhZmUoX2VuY29kZShzcmMpKVxuICAgICAgICAgICAgOiBfZW5jb2RlKHNyYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBhIFVURi04LWVuY29kZWQgc3RyaW5nIHRvIFVSTC1zYWZlIEJhc2U2NCBSRkM0NjQ4IMKnNS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgc3RyaW5nXG4gICAgICovXG4gICAgdmFyIGVuY29kZVVSSSA9IGZ1bmN0aW9uIChzcmMpIHsgcmV0dXJuIGVuY29kZShzcmMsIHRydWUpOyB9O1xuICAgIC8vIFRoaXMgdHJpY2sgaXMgZm91bmQgYnJva2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaS9qcy1iYXNlNjQvaXNzdWVzLzEzMFxuICAgIC8vIGNvbnN0IGJ0b3UgPSAoc3JjOiBzdHJpbmcpID0+IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3JjKSk7XG4gICAgLy8gcmV2ZXJ0aW5nIGdvb2Qgb2xkIGZhdGlvbmVkIHJlZ2V4cFxuICAgIHZhciByZV9idG91ID0gL1tcXHhDMC1cXHhERl1bXFx4ODAtXFx4QkZdfFtcXHhFMC1cXHhFRl1bXFx4ODAtXFx4QkZdezJ9fFtcXHhGMC1cXHhGN11bXFx4ODAtXFx4QkZdezN9L2c7XG4gICAgdmFyIGNiX2J0b3UgPSBmdW5jdGlvbiAoY2NjYykge1xuICAgICAgICBzd2l0Y2ggKGNjY2MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdmFyIGNwID0gKCgweDA3ICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxOClcbiAgICAgICAgICAgICAgICAgICAgfCAoKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMSkpIDw8IDEyKVxuICAgICAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgyKSkgPDwgNilcbiAgICAgICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgzKSksIG9mZnNldCA9IGNwIC0gMHgxMDAwMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9mcm9tQ0MoKG9mZnNldCA+Pj4gMTApICsgMHhEODAwKVxuICAgICAgICAgICAgICAgICAgICArIF9mcm9tQ0MoKG9mZnNldCAmIDB4M0ZGKSArIDB4REMwMCkpO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJvbUNDKCgoMHgwZiAmIGNjY2MuY2hhckNvZGVBdCgwKSkgPDwgMTIpXG4gICAgICAgICAgICAgICAgICAgIHwgKCgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDEpKSA8PCA2KVxuICAgICAgICAgICAgICAgICAgICB8ICgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDIpKSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJvbUNDKCgoMHgxZiAmIGNjY2MuY2hhckNvZGVBdCgwKSkgPDwgNilcbiAgICAgICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaG91bGQgaGF2ZSBiZWVuIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgVVRGLTE2IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBidG91ID0gZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIucmVwbGFjZShyZV9idG91LCBjYl9idG91KTsgfTtcbiAgICAvKipcbiAgICAgKiBwb2x5ZmlsbCB2ZXJzaW9uIG9mIGBhdG9iYFxuICAgICAqL1xuICAgIHZhciBhdG9iUG9seWZpbGwgPSBmdW5jdGlvbiAoYXNjKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7XG4gICAgICAgIGFzYyA9IGFzYy5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICAgICAgaWYgKCFiNjRyZS50ZXN0KGFzYykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxmb3JtZWQgYmFzZTY0LicpO1xuICAgICAgICBhc2MgKz0gJz09Jy5zbGljZSgyIC0gKGFzYy5sZW5ndGggJiAzKSk7XG4gICAgICAgIHZhciB1MjQsIGJpbiA9ICcnLCByMSwgcjI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXNjLmxlbmd0aDspIHtcbiAgICAgICAgICAgIHUyNCA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldIDw8IDE4XG4gICAgICAgICAgICAgICAgfCBiNjR0YWJbYXNjLmNoYXJBdChpKyspXSA8PCAxMlxuICAgICAgICAgICAgICAgIHwgKHIxID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0pIDw8IDZcbiAgICAgICAgICAgICAgICB8IChyMiA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldKTtcbiAgICAgICAgICAgIGJpbiArPSByMSA9PT0gNjQgPyBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSlcbiAgICAgICAgICAgICAgICA6IHIyID09PSA2NCA/IF9mcm9tQ0ModTI0ID4+IDE2ICYgMjU1LCB1MjQgPj4gOCAmIDI1NSlcbiAgICAgICAgICAgICAgICAgICAgOiBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSwgdTI0ID4+IDggJiAyNTUsIHUyNCAmIDI1NSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJpbjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGRvZXMgd2hhdCBgd2luZG93LmF0b2JgIG9mIHdlYiBicm93c2VycyBkby5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYXNjIEJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGJpbmFyeSBzdHJpbmdcbiAgICAgKi9cbiAgICB2YXIgX2F0b2IgPSB0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJyA/IGZ1bmN0aW9uIChhc2MpIHsgcmV0dXJuIGF0b2IoX3RpZHlCNjQoYXNjKSk7IH1cbiAgICAgICAgOiBfaGFzQnVmZmVyID8gZnVuY3Rpb24gKGFzYykgeyByZXR1cm4gQnVmZmVyLmZyb20oYXNjLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpOyB9XG4gICAgICAgICAgICA6IGF0b2JQb2x5ZmlsbDtcbiAgICAvL1xuICAgIHZhciBfdG9VaW50OEFycmF5ID0gX2hhc0J1ZmZlclxuICAgICAgICA/IGZ1bmN0aW9uIChhKSB7IHJldHVybiBfVThBZnJvbShCdWZmZXIuZnJvbShhLCAnYmFzZTY0JykpOyB9XG4gICAgICAgIDogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIF9VOEFmcm9tKF9hdG9iKGEpLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuY2hhckNvZGVBdCgwKTsgfSkpOyB9O1xuICAgIC8qKlxuICAgICAqIGNvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIFVpbnQ4QXJyYXkuXG4gICAgICovXG4gICAgdmFyIHRvVWludDhBcnJheSA9IGZ1bmN0aW9uIChhKSB7IHJldHVybiBfdG9VaW50OEFycmF5KF91blVSSShhKSk7IH07XG4gICAgLy9cbiAgICB2YXIgX2RlY29kZSA9IF9oYXNCdWZmZXJcbiAgICAgICAgPyBmdW5jdGlvbiAoYSkgeyByZXR1cm4gQnVmZmVyLmZyb20oYSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGY4Jyk7IH1cbiAgICAgICAgOiBfVERcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIF9URC5kZWNvZGUoX3RvVWludDhBcnJheShhKSk7IH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGJ0b3UoX2F0b2IoYSkpOyB9O1xuICAgIHZhciBfdW5VUkkgPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gX3RpZHlCNjQoYS5yZXBsYWNlKC9bLV9dL2csIGZ1bmN0aW9uIChtMCkgeyByZXR1cm4gbTAgPT0gJy0nID8gJysnIDogJy8nOyB9KSk7IH07XG4gICAgLyoqXG4gICAgICogY29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgVVRGLTggc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgQmFzZTY0IHN0cmluZy4gIEJvdGggbm9ybWFsIGFuZCBVUkwtc2FmZSBhcmUgc3VwcG9ydGVkXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVVRGLTggc3RyaW5nXG4gICAgICovXG4gICAgdmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzcmMpIHsgcmV0dXJuIF9kZWNvZGUoX3VuVVJJKHNyYykpOyB9O1xuICAgIC8qKlxuICAgICAqIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBCYXNlNjQgc3RyaW5nXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHNyYyBhIHZhbHVlIHRvIGNoZWNrXG4gICAgICAqL1xuICAgIHZhciBpc1ZhbGlkID0gZnVuY3Rpb24gKHNyYykge1xuICAgICAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBzID0gc3JjLnJlcGxhY2UoL1xccysvZywgJycpLnJlcGxhY2UoLz17MCwyfSQvLCAnJyk7XG4gICAgICAgIHJldHVybiAhL1teXFxzMC05YS16QS1aXFwrL10vLnRlc3QocykgfHwgIS9bXlxcczAtOWEtekEtWlxcLV9dLy50ZXN0KHMpO1xuICAgIH07XG4gICAgLy9cbiAgICB2YXIgX25vRW51bSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGV4dGVuZCBTdHJpbmcucHJvdG90eXBlIHdpdGggcmVsZXZhbnQgbWV0aG9kc1xuICAgICAqL1xuICAgIHZhciBleHRlbmRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYWRkID0gZnVuY3Rpb24gKG5hbWUsIGJvZHkpIHsgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCBuYW1lLCBfbm9FbnVtKGJvZHkpKTsgfTtcbiAgICAgICAgX2FkZCgnZnJvbUJhc2U2NCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlY29kZSh0aGlzKTsgfSk7XG4gICAgICAgIF9hZGQoJ3RvQmFzZTY0JywgZnVuY3Rpb24gKHVybHNhZmUpIHsgcmV0dXJuIGVuY29kZSh0aGlzLCB1cmxzYWZlKTsgfSk7XG4gICAgICAgIF9hZGQoJ3RvQmFzZTY0VVJJJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHRydWUpOyB9KTtcbiAgICAgICAgX2FkZCgndG9CYXNlNjRVUkwnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBlbmNvZGUodGhpcywgdHJ1ZSk7IH0pO1xuICAgICAgICBfYWRkKCd0b1VpbnQ4QXJyYXknLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0b1VpbnQ4QXJyYXkodGhpcyk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogZXh0ZW5kIFVpbnQ4QXJyYXkucHJvdG90eXBlIHdpdGggcmVsZXZhbnQgbWV0aG9kc1xuICAgICAqL1xuICAgIHZhciBleHRlbmRVaW50OEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2FkZCA9IGZ1bmN0aW9uIChuYW1lLCBib2R5KSB7IHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDhBcnJheS5wcm90b3R5cGUsIG5hbWUsIF9ub0VudW0oYm9keSkpOyB9O1xuICAgICAgICBfYWRkKCd0b0Jhc2U2NCcsIGZ1bmN0aW9uICh1cmxzYWZlKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB1cmxzYWZlKTsgfSk7XG4gICAgICAgIF9hZGQoJ3RvQmFzZTY0VVJJJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdHJ1ZSk7IH0pO1xuICAgICAgICBfYWRkKCd0b0Jhc2U2NFVSTCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZyb21VaW50OEFycmF5KHRoaXMsIHRydWUpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGV4dGVuZCBCdWlsdGluIHByb3RvdHlwZXMgd2l0aCByZWxldmFudCBtZXRob2RzXG4gICAgICovXG4gICAgdmFyIGV4dGVuZEJ1aWx0aW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBleHRlbmRTdHJpbmcoKTtcbiAgICAgICAgZXh0ZW5kVWludDhBcnJheSgpO1xuICAgIH07XG4gICAgdmFyIGdCYXNlNjQgPSB7XG4gICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgIFZFUlNJT046IFZFUlNJT04sXG4gICAgICAgIGF0b2I6IF9hdG9iLFxuICAgICAgICBhdG9iUG9seWZpbGw6IGF0b2JQb2x5ZmlsbCxcbiAgICAgICAgYnRvYTogX2J0b2EsXG4gICAgICAgIGJ0b2FQb2x5ZmlsbDogYnRvYVBvbHlmaWxsLFxuICAgICAgICBmcm9tQmFzZTY0OiBkZWNvZGUsXG4gICAgICAgIHRvQmFzZTY0OiBlbmNvZGUsXG4gICAgICAgIGVuY29kZTogZW5jb2RlLFxuICAgICAgICBlbmNvZGVVUkk6IGVuY29kZVVSSSxcbiAgICAgICAgZW5jb2RlVVJMOiBlbmNvZGVVUkksXG4gICAgICAgIHV0b2I6IHV0b2IsXG4gICAgICAgIGJ0b3U6IGJ0b3UsXG4gICAgICAgIGRlY29kZTogZGVjb2RlLFxuICAgICAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgICAgICBmcm9tVWludDhBcnJheTogZnJvbVVpbnQ4QXJyYXksXG4gICAgICAgIHRvVWludDhBcnJheTogdG9VaW50OEFycmF5LFxuICAgICAgICBleHRlbmRTdHJpbmc6IGV4dGVuZFN0cmluZyxcbiAgICAgICAgZXh0ZW5kVWludDhBcnJheTogZXh0ZW5kVWludDhBcnJheSxcbiAgICAgICAgZXh0ZW5kQnVpbHRpbnM6IGV4dGVuZEJ1aWx0aW5zXG4gICAgfTtcbiAgICAvL1xuICAgIC8vIGV4cG9ydCBCYXNlNjQgdG8gdGhlIG5hbWVzcGFjZVxuICAgIC8vXG4gICAgLy8gRVM1IGlzIHlldCB0byBoYXZlIE9iamVjdC5hc3NpZ24oKSB0aGF0IG1heSBtYWtlIHRyYW5zcGlsZXJzIHVuaGFwcHkuXG4gICAgLy8gZ0Jhc2U2NC5CYXNlNjQgPSBPYmplY3QuYXNzaWduKHt9LCBnQmFzZTY0KTtcbiAgICBnQmFzZTY0LkJhc2U2NCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGdCYXNlNjQpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgcmV0dXJuIGdCYXNlNjQuQmFzZTY0W2tdID0gZ0Jhc2U2NFtrXTsgfSk7XG4gICAgcmV0dXJuIGdCYXNlNjQ7XG59KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIgPSB2b2lkIDA7XG52YXIgZm9ybV9kYXRhXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImZvcm0tZGF0YVwiKSk7XG52YXIgcXNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicXNcIikpO1xudmFyIGpzX2Jhc2U2NF8xID0gcmVxdWlyZShcImpzLWJhc2U2NFwiKTtcbnZhciBwbGF0Zm9ybV8xID0gcmVxdWlyZShcIi4vcGxhdGZvcm0vXCIpO1xudmFyIERFRkFVTFRfUFJPWFlfUFJPVE9DT0wgPSBcImh0dHBcIjtcbnZhciBUSFJFU0hPTERfQVZPSURfUkVRVUVTVF9VUkxfVE9PX0xBUkdFID0gNDA5NjtcbnZhciBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICB0aGlzLmF1dGggPSBvcHRpb25zLmF1dGg7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKHtcbiAgICAgICAgICAgIGJhc2ljQXV0aDogb3B0aW9ucy5iYXNpY0F1dGgsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6IG9wdGlvbnMudXNlckFnZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKFwiaHR0cHNBZ2VudFwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChcImNsaWVudENlcnRBdXRoXCIgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGNsaWVudENlcnRBdXRoIGFsb25nIHdpdGggaHR0cHNBZ2VudC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmh0dHBzQWdlbnQgPSBvcHRpb25zLmh0dHBzQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXCJjbGllbnRDZXJ0QXV0aFwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Q2VydEF1dGggPSBvcHRpb25zLmNsaWVudENlcnRBdXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJveHkgPSBvcHRpb25zLnByb3h5O1xuICAgICAgICB0aGlzLnJlcXVlc3RUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc29ja2V0VGltZW91dCA9IG9wdGlvbnMuc29ja2V0VGltZW91dDtcbiAgICB9XG4gICAgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChtZXRob2QsIHBhdGgsIHBhcmFtcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZywgX2EsIHJlcXVlc3RVcmwsIF9iLCBmb3JtRGF0YSwgX2MsIF9kLCByZXF1ZXN0VXJsLCBfZSwgX2Y7XG4gICAgICAgICAgICB2YXIgX2csIF9oLCBfajtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2spIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9rLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7IG1ldGhvZDogbWV0aG9kLCBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsIHVybDogXCJcIi5jb25jYXQodGhpcy5iYXNlVXJsKS5jb25jYXQocGF0aCkgfSwgKG9wdGlvbnMgPyBvcHRpb25zIDoge30pKSwgcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHNBZ2VudDogdGhpcy5odHRwc0FnZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudENlcnRBdXRoOiB0aGlzLmNsaWVudENlcnRBdXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldFRpbWVvdXQ6IHRoaXMuc29ja2V0VGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgeyBwcm94eTogdGhpcy5idWlsZFByb3h5Q29uZmlnKHRoaXMucHJveHkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBtZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImdldFwiOiByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicG9zdFwiOiByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHV0XCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVcIjogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsID0gdGhpcy5idWlsZFJlcXVlc3RVcmwocGF0aCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlcXVlc3RVcmwubGVuZ3RoID4gVEhSRVNIT0xEX0FWT0lEX1JFUVVFU1RfVVJMX1RPT19MQVJHRSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBbX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9nID0geyBtZXRob2Q6IFwicG9zdFwiLCBoZWFkZXJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5oZWFkZXJzKSwgeyBcIlgtSFRUUC1NZXRob2QtT3ZlcnJpZGVcIjogXCJHRVRcIiB9KSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9fYXNzaWduLmFwcGx5KHZvaWQgMCwgX2IuY29uY2F0KFsoX2cuZGF0YSA9IF9rLnNlbnQoKSwgX2cpXSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IHVybDogcmVxdWVzdFVybCB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHBhcmFtcyBpbnN0YW5jZW9mIGZvcm1fZGF0YV8xLmRlZmF1bHQpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnVpbGREYXRhKHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IF9rLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVxdWVzdENvbmZpZyksIHsgaGVhZGVyczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZvcm1EYXRhLmdldEhlYWRlcnMgZG9lcyBub3QgZXhpc3QgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybURhdGEuZ2V0SGVhZGVycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLmhlYWRlcnMpLCBmb3JtRGF0YS5nZXRIZWFkZXJzKCkpIDogdGhpcy5oZWFkZXJzLCBkYXRhOiBmb3JtRGF0YSB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gW19fYXNzaWduKHt9LCByZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfaCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9fYXNzaWduLmFwcGx5KHZvaWQgMCwgX2MuY29uY2F0KFsoX2guZGF0YSA9IF9rLnNlbnQoKSwgX2gpXSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QgPSBbX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9qID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJ1aWxkRGF0YShwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24uYXBwbHkodm9pZCAwLCBfZC5jb25jYXQoWyhfai5kYXRhID0gX2suc2VudCgpLCBfaildKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UgPSB0aGlzLmJ1aWxkUmVxdWVzdFVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mID0gW3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsID0gX2UuYXBwbHkodGhpcywgX2YuY29uY2F0KFtfay5zZW50KCldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IHVybDogcmVxdWVzdFVybCB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIuY29uY2F0KG1ldGhvZCwgXCIgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2subGFiZWwgPSAxMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuYnVpbGRQcm94eUNvbmZpZyA9IGZ1bmN0aW9uIChwcm94eUNvbmZpZykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwcm94eUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm94eUNvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJveHkgPSBwcm94eUNvbmZpZztcbiAgICAgICAgaWYgKHByb3h5LmF1dGggJiZcbiAgICAgICAgICAgIChwcm94eS5hdXRoLnVzZXJuYW1lLmxlbmd0aCA9PT0gMCB8fCBwcm94eS5hdXRoLnBhc3N3b3JkLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHByb3h5LmF1dGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHJveHkucHJvdG9jb2wgPSAoX2EgPSBwcm94eS5wcm90b2NvbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogREVGQVVMVF9QUk9YWV9QUk9UT0NPTDtcbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH07XG4gICAgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLnByb3RvdHlwZS5idWlsZFJlcXVlc3RVcmwgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLmJhc2VVcmwpLmNvbmNhdChwYXRoLCBcIj9cIikuY29uY2F0KHFzXzEuZGVmYXVsdC5zdHJpbmdpZnkocGFyYW1zKSk7XG4gICAgfTtcbiAgICBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIucHJvdG90eXBlLmJ1aWxkRGF0YSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RUb2tlbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuYXV0aC50eXBlID09PSBcInNlc3Npb25cIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZXF1ZXN0VG9rZW4oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBmb3JtX2RhdGFfMS5kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZChcIl9fUkVRVUVTVF9UT0tFTl9fXCIsIHJlcXVlc3RUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBhcmFtc107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oeyBfX1JFUVVFU1RfVE9LRU5fXzogcmVxdWVzdFRva2VuIH0sIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBwYXJhbXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuYnVpbGRIZWFkZXJzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgYmFzaWNBdXRoID0gcGFyYW1zLmJhc2ljQXV0aCwgdXNlckFnZW50ID0gcGFyYW1zLnVzZXJBZ2VudDtcbiAgICAgICAgdmFyIGJhc2ljQXV0aEhlYWRlcnMgPSBiYXNpY0F1dGhcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IFwiQmFzaWMgXCIuY29uY2F0KGpzX2Jhc2U2NF8xLkJhc2U2NC5lbmNvZGUoXCJcIi5jb25jYXQoYmFzaWNBdXRoLnVzZXJuYW1lLCBcIjpcIikuY29uY2F0KGJhc2ljQXV0aC5wYXNzd29yZCkpKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge307XG4gICAgICAgIHZhciBwbGF0Zm9ybURlcHNIZWFkZXJzID0gcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuYnVpbGRIZWFkZXJzKHsgdXNlckFnZW50OiB1c2VyQWdlbnQgfSk7XG4gICAgICAgIHZhciBjb21tb25IZWFkZXJzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHBsYXRmb3JtRGVwc0hlYWRlcnMpLCBiYXNpY0F1dGhIZWFkZXJzKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmF1dGgudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQXV0aG9yaXphdGlvblwiOiBqc19iYXNlNjRfMS5CYXNlNjQuZW5jb2RlKFwiXCIuY29uY2F0KHRoaXMuYXV0aC51c2VybmFtZSwgXCI6XCIpLmNvbmNhdCh0aGlzLmF1dGgucGFzc3dvcmQpKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJhcGlUb2tlblwiOiB7XG4gICAgICAgICAgICAgICAgdmFyIGFwaVRva2VuID0gdGhpcy5hdXRoLmFwaVRva2VuO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFwaVRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQVBJLVRva2VuXCI6IGFwaVRva2VuLmpvaW4oXCIsXCIpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQVBJLVRva2VuXCI6IGFwaVRva2VuIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIm9BdXRoVG9rZW5cIjoge1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29tbW9uSGVhZGVycyksIHsgQXV0aG9yaXphdGlvbjogXCJCZWFyZXIgXCIuY29uY2F0KHRoaXMuYXV0aC5vQXV0aFRva2VuKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1SZXF1ZXN0ZWQtV2l0aFwiOiBcIlhNTEh0dHBSZXF1ZXN0XCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuZ2V0UmVxdWVzdFRva2VuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnJlcXVlc3RUb2tlbiA9PT0gbnVsbCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuZ2V0UmVxdWVzdFRva2VuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5yZXF1ZXN0VG9rZW4gPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMucmVxdWVzdFRva2VuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyO1xufSgpKTtcbmV4cG9ydHMuS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyID0gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZVJlc3BvbnNlSGFuZGxlciA9IHZvaWQgMDtcbnZhciBlcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JcIik7XG52YXIgS2ludG9uZVJlc3BvbnNlSGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBLaW50b25lUmVzcG9uc2VIYW5kbGVyKF9hKSB7XG4gICAgICAgIHZhciBlbmFibGVBYm9ydFNlYXJjaEVycm9yID0gX2EuZW5hYmxlQWJvcnRTZWFyY2hFcnJvcjtcbiAgICAgICAgdGhpcy5lbmFibGVBYm9ydFNlYXJjaEVycm9yID0gZW5hYmxlQWJvcnRTZWFyY2hFcnJvcjtcbiAgICB9XG4gICAgS2ludG9uZVJlc3BvbnNlSGFuZGxlci5wcm90b3R5cGUuaGFuZGxlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiByZXNwb25zZS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIF90aGlzLmhhbmRsZVN1Y2Nlc3NSZXNwb25zZShyZXMpOyB9LCBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIF90aGlzLmhhbmRsZUVycm9yUmVzcG9uc2UoZXJyb3IpOyB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXNwb25zZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZVN1Y2Nlc3NSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVBYm9ydFNlYXJjaEVycm9yICYmXG4gICAgICAgICAgICAvRmlsdGVyIGFib3J0ZWQgYmVjYXVzZSBvZiB0b28gbWFueSBzZWFyY2ggcmVzdWx0cy8udGVzdChyZXNwb25zZS5oZWFkZXJzW1wieC1jeWJvenUtd2FybmluZ1wiXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcl8xLktpbnRvbmVBYm9ydFNlYXJjaEVycm9yKHJlc3BvbnNlLmhlYWRlcnNbXCJ4LWN5Ym96dS13YXJuaW5nXCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXNwb25zZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZUVycm9yUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gRklYTUU6IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzIGVycm9yXG4gICAgICAgICAgICBpZiAoL21hYyB2ZXJpZnkgZmFpbHVyZS8udGVzdChlcnJvci50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2xpZW50Q2VydEF1dGggc2V0dGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvclJlc3BvbnNlID0gZXJyb3IucmVzcG9uc2U7XG4gICAgICAgIHZhciBkYXRhID0gZXJyb3JSZXNwb25zZS5kYXRhLCByZXN0ID0gX19yZXN0KGVycm9yUmVzcG9uc2UsIFtcImRhdGFcIl0pO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChyZXN0LnN0YXR1cywgXCI6IFwiKS5jb25jYXQocmVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IGVycm9yXzEuS2ludG9uZVJlc3RBUElFcnJvcihfX2Fzc2lnbih7IGRhdGE6IGRhdGEgfSwgcmVzdCkpO1xuICAgIH07XG4gICAgcmV0dXJuIEtpbnRvbmVSZXNwb25zZUhhbmRsZXI7XG59KCkpO1xuZXhwb3J0cy5LaW50b25lUmVzcG9uc2VIYW5kbGVyID0gS2ludG9uZVJlc3BvbnNlSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtpbnRvbmVSZXNwb25zZUhhbmRsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUNsaWVudCA9IHZvaWQgMDtcbnZhciBCdWxrUmVxdWVzdENsaWVudF8xID0gcmVxdWlyZShcIi4vY2xpZW50L0J1bGtSZXF1ZXN0Q2xpZW50XCIpO1xudmFyIEFwcENsaWVudF8xID0gcmVxdWlyZShcIi4vY2xpZW50L0FwcENsaWVudFwiKTtcbnZhciBSZWNvcmRDbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9SZWNvcmRDbGllbnRcIik7XG52YXIgU3BhY2VDbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9TcGFjZUNsaWVudFwiKTtcbnZhciBGaWxlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9jbGllbnQvRmlsZUNsaWVudFwiKTtcbnZhciBQbHVnaW5DbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9QbHVnaW5DbGllbnRcIik7XG52YXIgaHR0cF8xID0gcmVxdWlyZShcIi4vaHR0cC9cIik7XG52YXIgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXJcIik7XG52YXIgS2ludG9uZVJlc3BvbnNlSGFuZGxlcl8xID0gcmVxdWlyZShcIi4vS2ludG9uZVJlc3BvbnNlSGFuZGxlclwiKTtcbnZhciBwbGF0Zm9ybV8xID0gcmVxdWlyZShcIi4vcGxhdGZvcm1cIik7XG52YXIgVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXzEgPSByZXF1aXJlKFwiLi9wbGF0Zm9ybS9VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JcIik7XG52YXIgYnVpbGREaXNjcmltaW5hdGVkQXV0aCA9IGZ1bmN0aW9uIChhdXRoKSB7XG4gICAgaWYgKFwidXNlcm5hbWVcIiBpbiBhdXRoKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbih7IHR5cGU6IFwicGFzc3dvcmRcIiB9LCBhdXRoKTtcbiAgICB9XG4gICAgaWYgKFwiYXBpVG9rZW5cIiBpbiBhdXRoKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbih7IHR5cGU6IFwiYXBpVG9rZW5cIiB9LCBhdXRoKTtcbiAgICB9XG4gICAgaWYgKFwib0F1dGhUb2tlblwiIGluIGF1dGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKHsgdHlwZTogXCJvQXV0aFRva2VuXCIgfSwgYXV0aCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwbGF0Zm9ybV8xLnBsYXRmb3JtRGVwcy5nZXREZWZhdWx0QXV0aCgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2Vzc2lvbiBhdXRoZW50aWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIFwiLmNvbmNhdChlLnBsYXRmb3JtLCBcIiBlbnZpcm9ubWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufTtcbnZhciBLaW50b25lUmVzdEFQSUNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBLaW50b25lUmVzdEFQSUNsaWVudChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IHBsYXRmb3JtXzEucGxhdGZvcm1EZXBzXG4gICAgICAgICAgICAuYnVpbGRCYXNlVXJsKG9wdGlvbnMuYmFzZVVybClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpOyAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgdmFyIGF1dGggPSBidWlsZERpc2NyaW1pbmF0ZWRBdXRoKChfYSA9IG9wdGlvbnMuYXV0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30pO1xuICAgICAgICB2YXIgcmVxdWVzdENvbmZpZ0J1aWxkZXIgPSBuZXcgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyXzEuS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsIGF1dGg6IGF1dGggfSkpO1xuICAgICAgICB2YXIgcmVzcG9uc2VIYW5kbGVyID0gbmV3IEtpbnRvbmVSZXNwb25zZUhhbmRsZXJfMS5LaW50b25lUmVzcG9uc2VIYW5kbGVyKHtcbiAgICAgICAgICAgIGVuYWJsZUFib3J0U2VhcmNoRXJyb3I6IChfYyA9IChfYiA9IG9wdGlvbnMuZmVhdHVyZUZsYWdzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZW5hYmxlQWJvcnRTZWFyY2hFcnJvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaHR0cENsaWVudCA9IG5ldyBodHRwXzEuRGVmYXVsdEh0dHBDbGllbnQoe1xuICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyOiByZXNwb25zZUhhbmRsZXIsXG4gICAgICAgICAgICByZXF1ZXN0Q29uZmlnQnVpbGRlcjogcmVxdWVzdENvbmZpZ0J1aWxkZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZ3Vlc3RTcGFjZUlkID0gb3B0aW9ucy5ndWVzdFNwYWNlSWQ7XG4gICAgICAgIHRoaXMuYnVsa1JlcXVlc3RfID0gbmV3IEJ1bGtSZXF1ZXN0Q2xpZW50XzEuQnVsa1JlcXVlc3RDbGllbnQoaHR0cENsaWVudCwgZ3Vlc3RTcGFjZUlkKTtcbiAgICAgICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkQ2xpZW50XzEuUmVjb3JkQ2xpZW50KGh0dHBDbGllbnQsIHRoaXMuYnVsa1JlcXVlc3RfLCBndWVzdFNwYWNlSWQpO1xuICAgICAgICB0aGlzLmFwcCA9IG5ldyBBcHBDbGllbnRfMS5BcHBDbGllbnQoaHR0cENsaWVudCwgZ3Vlc3RTcGFjZUlkKTtcbiAgICAgICAgdGhpcy5zcGFjZSA9IG5ldyBTcGFjZUNsaWVudF8xLlNwYWNlQ2xpZW50KGh0dHBDbGllbnQsIGd1ZXN0U3BhY2VJZCk7XG4gICAgICAgIHRoaXMuZmlsZSA9IG5ldyBGaWxlQ2xpZW50XzEuRmlsZUNsaWVudChodHRwQ2xpZW50LCBndWVzdFNwYWNlSWQpO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IG5ldyBQbHVnaW5DbGllbnRfMS5QbHVnaW5DbGllbnQoaHR0cENsaWVudCk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShLaW50b25lUmVzdEFQSUNsaWVudCwgXCJ2ZXJzaW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuZ2V0VmVyc2lvbigpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgS2ludG9uZVJlc3RBUElDbGllbnQucHJvdG90eXBlLmdldEJhc2VVcmwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmw7XG4gICAgfTtcbiAgICBLaW50b25lUmVzdEFQSUNsaWVudC5wcm90b3R5cGUuYnVsa1JlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1bGtSZXF1ZXN0Xy5zZW5kKHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gS2ludG9uZVJlc3RBUElDbGllbnQ7XG59KCkpO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUNsaWVudCA9IEtpbnRvbmVSZXN0QVBJQ2xpZW50O1xudmFyIHZhbGlkYXRlT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFsaWRhdGVCYXNlVXJsKG9wdGlvbnMuYmFzZVVybCk7XG4gICAgdmFsaWRhdGVHdWVzdFNwYWNlSWQob3B0aW9ucy5ndWVzdFNwYWNlSWQpO1xuICAgIHZhbGlkYXRlU29ja2V0VGltZW91dChvcHRpb25zLnNvY2tldFRpbWVvdXQpO1xufTtcbnZhciB2YWxpZGF0ZUJhc2VVcmwgPSBmdW5jdGlvbiAoYmFzZVVybCkge1xuICAgIGlmIChiYXNlVXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdXJsID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICBpZiAodXJsLmhvc3RuYW1lICE9PSBcImxvY2FsaG9zdFwiICYmIHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm90b2NvbCBvZiBiYXNlVXJsIG11c3QgYmUgXCJodHRwc1wiLicpO1xuICAgIH1cbn07XG52YXIgdmFsaWRhdGVHdWVzdFNwYWNlSWQgPSBmdW5jdGlvbiAoZ3Vlc3RTcGFjZUlkKSB7XG4gICAgaWYgKGd1ZXN0U3BhY2VJZCA9PT0gXCJcIiB8fCBndWVzdFNwYWNlSWQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBndWVzdFNwYWNlSWQ6IGdvdCBbXCIuY29uY2F0KGd1ZXN0U3BhY2VJZCwgXCJdXCIpKTtcbiAgICB9XG59O1xudmFyIHZhbGlkYXRlU29ja2V0VGltZW91dCA9IGZ1bmN0aW9uIChzb2NrZXRUaW1lb3V0KSB7XG4gICAgaWYgKHNvY2tldFRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBudW1iZXIgPSBwYXJzZUZsb2F0KHNvY2tldFRpbWVvdXQudG9TdHJpbmcoKSk7XG4gICAgaWYgKGlzTmFOKG51bWJlcikgfHwgbnVtYmVyIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNvY2tldFRpbWVvdXQuIE11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuXCIpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LaW50b25lUmVzdEFQSUNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZVJlc3RBUElDbGllbnQgPSB2b2lkIDA7XG52YXIgcGxhdGZvcm1fMSA9IHJlcXVpcmUoXCIuL3BsYXRmb3JtL1wiKTtcbnZhciBicm93c2VyRGVwcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wbGF0Zm9ybS9icm93c2VyXCIpKTtcbigwLCBwbGF0Zm9ybV8xLmluamVjdFBsYXRmb3JtRGVwcykoYnJvd3NlckRlcHMpO1xudmFyIEtpbnRvbmVSZXN0QVBJQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9LaW50b25lUmVzdEFQSUNsaWVudFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIktpbnRvbmVSZXN0QVBJQ2xpZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBLaW50b25lUmVzdEFQSUNsaWVudF8xLktpbnRvbmVSZXN0QVBJQ2xpZW50OyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2Vycm9yXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmJyb3dzZXIuanMubWFwIiwiLy8gc3JjL3R5cGVzL2ZpZWxkLmQudHNcblxuZXhwb3J0IGVudW0gRmllbGRUeXBlIHtcbiAgICBDQUxDID0gXCJDQUxDXCIsXG4gICAgQ0FURUdPUlkgPSBcIkNBVEVHT1JZXCIsXG4gICAgQ0hFQ0tfQk9YID0gXCJDSEVDS19CT1hcIixcbiAgICBDUkVBVEVEX1RJTUUgPSBcIkNSRUFURURfVElNRVwiLFxuICAgIENSRUFUT1IgPSBcIkNSRUFUT1JcIixcbiAgICBEQVRFID0gXCJEQVRFXCIsXG4gICAgREFURVRJTUUgPSBcIkRBVEVUSU1FXCIsXG4gICAgRFJPUF9ET1dOID0gXCJEUk9QX0RPV05cIixcbiAgICBGSUxFID0gXCJGSUxFXCIsXG4gICAgR1JPVVAgPSBcIkdST1VQXCIsXG4gICAgR1JPVVBfU0VMRUNUID0gXCJHUk9VUF9TRUxFQ1RcIixcbiAgICBMSU5LID0gXCJMSU5LXCIsXG4gICAgTU9ESUZJRVIgPSBcIk1PRElGSUVSXCIsXG4gICAgTVVMVElfTElORV9URVhUID0gXCJNVUxUSV9MSU5FX1RFWFRcIixcbiAgICBNVUxUSV9TRUxFQ1QgPSBcIk1VTFRJX1NFTEVDVFwiLFxuICAgIE5VTUJFUiA9IFwiTlVNQkVSXCIsXG4gICAgT1JHQU5JWkFUSU9OX1NFTEVDVCA9IFwiT1JHQU5JWkFUSU9OX1NFTEVDVFwiLFxuICAgIFJBRElPX0JVVFRPTiA9IFwiUkFESU9fQlVUVE9OXCIsXG4gICAgUkVDT1JEX05VTUJFUiA9IFwiUkVDT1JEX05VTUJFUlwiLFxuICAgIFJFRkVSRU5DRV9UQUJMRSA9IFwiUkVGRVJFTkNFX1RBQkxFXCIsXG4gICAgUklDSF9URVhUID0gXCJSSUNIX1RFWFRcIixcbiAgICBTSU5HTEVfTElORV9URVhUID0gXCJTSU5HTEVfTElORV9URVhUXCIsXG4gICAgU1RBVFVTID0gXCJTVEFUVVNcIixcbiAgICBTVEFUVVNfQVNTSUdORUUgPSBcIlNUQVRVU19BU1NJR05FRVwiLFxuICAgIFNVQlRBQkxFID0gXCJTVUJUQUJMRVwiLFxuICAgIFRJTUUgPSBcIlRJTUVcIixcbiAgICBVUERBVEVEX1RJTUUgPSBcIlVQREFURURfVElNRVwiLFxuICAgIFVTRVJfU0VMRUNUID0gXCJVU0VSX1NFTEVDVFwiXG59XG5cbmV4cG9ydCBlbnVtIENhbGNGb3JtYXR7XG4gICAgTlVNQkVSID0gXCJOVU1CRVJcIixcbiAgICBOVU1CRVJfRElHSVQgPSBcIk5VTUJFUl9ESUdJVFwiLFxuICAgIERBVEVUSU1FID0gXCJEQVRFVElNRVwiLFxuICAgIERBVEUgPSBcIkRBVEVcIixcbiAgICBUSU1FID0gXCJUSU1FXCIsXG4gICAgSE9VUl9NSU5VVEU9IFwiSE9VUl9NSU5VVEVcIixcbiAgICBEQVlfSE9VUl9NSU5VVEU9IFwiREFZX0hPVVJfTUlOVVRFXCJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZEZvcm0ge1xuICAgIGNvZGU6IHN0cmluZztcbiAgICB0eXBlOiBGaWVsZFR5cGU7XG4gICAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICAgIG5vTGFiZWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkZvcm17XG4gICAgaW5kZXg6IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUZvcm0ge1xuICAgIGNvZGU6IHN0cmluZztcbiAgICB0eXBlOiAnVVNFUicgfCAnT1JHQU5JWkFUSU9OJyB8ICdHUk9VUCcgfCAnRlVOQ1RJT04nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGNGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIHVuaXQ/OiBzdHJpbmc7XG4gICAgZXhwcmVzc2lvbj86IHN0cmluZztcbiAgICBmb3JtYXQ/OkNhbGNGb3JtYXQ7XG4gICAgdW5pdFBvc2l0aW9uPzogJ0JFRk9SRScgfCAnQUZURVInO1xuICAgIGRpc3BsYXlTY2FsZT86IHN0cmluZztcbiAgICBoaWRlRXhwcmVzc2lvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIGRlZmF1bHROb3dWYWx1ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZXRpbWVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIGRlZmF1bHROb3dWYWx1ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjaW1hbEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XG4gICAgbWF4VmFsdWU/OiBzdHJpbmc7XG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAgIHVuaXRQb3NpdGlvbj86ICdCRUZPUkUnIHwgJ0FGVEVSJztcbiAgICBtaW5WYWx1ZT86IHN0cmluZztcbiAgICB1bml0Pzogc3RyaW5nO1xuICAgIHVuaXF1ZT86IGJvb2xlYW47XG4gICAgZGlzcGxheVNjYWxlPzogc3RyaW5nO1xuICAgIGRpZ2l0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFZGl0b3JGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlGb3JtIHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgdHlwZTogJ1VTRVInIHwgJ09SR0FOSVpBVElPTicgfCAnR1JPVVAnIHwgJ0ZVTkNUSU9OJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZE1hcHBpbmdGb3JtIHtcbiAgICByZWxhdGVkRmllbGQ6IHN0cmluZztcbiAgICBmaWVsZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIHRodW1ibmFpbFNpemU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIG9wZW5Hcm91cD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBTZWxlY3RGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGVudGl0aWVzOiBFbnRpdHlGb3JtW107XG4gICAgZGVmYXVsdFZhbHVlPzogRW50aXR5Rm9ybVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIHByb3RvY29sPzogJ1dFQicgfCAnQ0FMTCcgfCAnTUFJTCc7XG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAgIG1pbkxlbmd0aD86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIG1heExlbmd0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGxvb2t1cDoge1xuICAgICAgICBsb29rdXBQaWNrZXJGaWVsZHM6IHN0cmluZ1tdO1xuICAgICAgICByZWxhdGVkS2V5RmllbGQ6IHN0cmluZztcbiAgICAgICAgcmVsYXRlZEFwcDoge1xuICAgICAgICAgICAgYXBwOiBzdHJpbmc7XG4gICAgICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIGZpZWxkTWFwcGluZ3M6IEZpZWxkTWFwcGluZ0Zvcm1bXTtcbiAgICAgICAgc29ydD86IHN0cmluZztcbiAgICAgICAgZmlsdGVyQ29uZD86IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWVkQXRGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge31cblxuZXhwb3J0IGludGVyZmFjZSBNb2RpZmllckZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpcGxlQ2hlY2tGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZ1tdO1xuICAgIG9wdGlvbnM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogT3B0aW9uRm9ybTtcbiAgICB9O1xuICAgIGFsaWduPzogJ0hPUklaT05UQUwnIHwgJ1ZFUlRJQ0FMJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aXBsZUxpbmVUZXh0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlwbGVTZWxlY3RGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZ1tdO1xuICAgIG9wdGlvbnM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogT3B0aW9uRm9ybTtcbiAgICB9O1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemF0aW9uU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBlbnRpdGllczogRW50aXR5Rm9ybVtdO1xuICAgIGRlZmF1bHRWYWx1ZT86IEVudGl0eUZvcm1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRJZEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZVRhYmxlRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICByZWZlcmVuY2VUYWJsZToge1xuICAgICAgICBjb25kaXRpb246IHtcbiAgICAgICAgICAgIHJlbGF0ZWRGaWVsZDogc3RyaW5nO1xuICAgICAgICAgICAgZmllbGQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgICAgc2l6ZT86IHN0cmluZztcbiAgICAgICAgcmVsYXRlZEFwcDoge1xuICAgICAgICAgICAgYXBwOiBzdHJpbmc7XG4gICAgICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHNvcnQ/OiBzdHJpbmc7XG4gICAgICAgIGZpbHRlckNvbmQ/OiBzdHJpbmc7XG4gICAgICAgIGRpc3BsYXlGaWVsZHM6IHN0cmluZ1tdO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlQ2hlY2tGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgICBvcHRpb25zOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IE9wdGlvbkZvcm07XG4gICAgfTtcbiAgICBhbGlnbj86ICdIT1JJWk9OVEFMJyB8ICdWRVJUSUNBTCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlTGluZVRleHRGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGV4cHJlc3Npb24/OiBzdHJpbmc7XG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAgIG1pbkxlbmd0aD86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIG1heExlbmd0aD86IHN0cmluZztcbiAgICBoaWRlRXhwcmVzc2lvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBPcHRpb25Gb3JtO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzQXNzaWduZWVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c0ZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogQ2FsY0ZpZWxkRm9ybSB8IENhdGVnb3J5RmllbGRGb3JtIHwgRGF0ZUZpZWxkRm9ybSB8IERhdGV0aW1lRmllbGRGb3JtIHwgRGVjaW1hbEZpZWxkRm9ybSB8IEVkaXRvckZpZWxkRm9ybSB8IEZpbGVGaWVsZEZvcm0gfCBHcm91cEZpZWxkRm9ybSB8IEdyb3VwU2VsZWN0RmllbGRGb3JtIHwgTGlua0ZpZWxkRm9ybSB8IExvb2t1cEZpZWxkRm9ybSB8IE1vZGlmaWVkQXRGaWVsZEZvcm0gfCBNb2RpZmllckZpZWxkRm9ybSB8IE11bHRpcGxlQ2hlY2tGaWVsZEZvcm0gfCBNdWx0aXBsZUxpbmVUZXh0RmllbGRGb3JtIHwgTXVsdGlwbGVTZWxlY3RGaWVsZEZvcm0gfCBPcmdhbml6YXRpb25TZWxlY3RGaWVsZEZvcm0gfCBSZWNvcmRJZEZpZWxkRm9ybSB8IFJlZmVyZW5jZVRhYmxlRmllbGRGb3JtIHwgU2luZ2xlQ2hlY2tGaWVsZEZvcm0gfCBTaW5nbGVMaW5lVGV4dEZpZWxkRm9ybSB8IFNpbmdsZVNlbGVjdEZpZWxkRm9ybSB8IFN0YXR1c0Fzc2lnbmVlRmllbGRGb3JtIHwgU3RhdHVzRmllbGRGb3JtIHwgVGFibGVGb3JtIHwgVGltZUZpZWxkRm9ybSB8IFVzZXJTZWxlY3RGaWVsZEZvcm07XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XG4gICAgZGVmYXVsdE5vd1ZhbHVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBlbnRpdGllczogRW50aXR5Rm9ybVtdO1xuICAgIGRlZmF1bHRWYWx1ZT86IEVudGl0eUZvcm1bXTtcbn0iLCJpbXBvcnQgeyBGaWVsZEZvcm0sQ2FsY0ZpZWxkRm9ybSxGaWVsZFR5cGUsIENhbGNGb3JtYXR9IGZyb20gXCIuLi90eXBlcy9GaWVsZExheW91dFwiO1xuXG4vKipcbiAqIOmbhuioiOaTjeS9nOWtkFxuICovXG5leHBvcnQgZW51bSBPcGVyYXRvciB7XG4gICAgU1VNID0gXCJTVU1cIixcbiAgICBBVkcgPSBcIkFWR1wiLFxuICAgIE1BWCA9IFwiTUFYXCIsXG4gICAgTUlOID0gXCJNSU5cIixcbiAgICBDT1VOVCA9IFwiQ09VTlRcIixcbiAgICBGSVJTVCA9IFwiRklSU1RcIixcbiAgICBMQVNUID0gXCJMQVNUXCJcbn1cblxuLyoqXG4gKiDpm4boqIjplqLmlbBcbiAqL1xuXG5leHBvcnQgY2xhc3MgQWdncmVnYXRvciB7XG4gICAgcHJpdmF0ZSBkYXRhOiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIGZpZWxkOiBGaWVsZEZvcm07XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBzdHJpbmdbXSwgZmllbGQ6IEZpZWxkRm9ybSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b051bWJlckFycmF5KCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLmRhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5maWVsZC5jb2RlfSDjgI3jga/mlbDlgKTjgavlpInmj5vjgafjgY3jgarjgYTjgZ/jgoHjgIHoqIjnrpfjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgIJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudW1iZXJBcnJheTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1bSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xuICAgICAgICByZXR1cm4gbnVtYmVyQXJyYXkucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF2ZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IG51bWJlckFycmF5LnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbCwgMCk7XG4gICAgICAgIHJldHVybiB0b3RhbCAvIG51bWJlckFycmF5Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1heCgpOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSBGaWVsZFR5cGUuTlVNQkVSICkge1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLnRvTnVtYmVyQXJyYXkoKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCguLi5udW1iZXJBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5maWVsZC50eXBlPT09RmllbGRUeXBlLkNBTEMpe1xuICAgICAgICAgICAgY29uc3QgY2FsY0ZpZWxkID0gdGhpcy5maWVsZCBhcyBDYWxjRmllbGRGb3JtO1xuICAgICAgICAgICAgaWYoY2FsY0ZpZWxkLmZvcm1hdD09PUNhbGNGb3JtYXQuTlVNQkVSIHx8IGNhbGNGaWVsZC5mb3JtYXQ9PT1DYWxjRm9ybWF0Lk5VTUJFUl9ESUdJVCl7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLnRvTnVtYmVyQXJyYXkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoLi4ubnVtYmVyQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucmVkdWNlKChtYXgsIGl0ZW0pID0+IChpdGVtID4gbWF4ID8gaXRlbSA6IG1heCksIHRoaXMuZGF0YVswXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtaW4oKTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gRmllbGRUeXBlLk5VTUJFUiApIHtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlckFycmF5ID0gdGhpcy50b051bWJlckFycmF5KCk7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oLi4ubnVtYmVyQXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuZmllbGQudHlwZT09PUZpZWxkVHlwZS5DQUxDKXtcbiAgICAgICAgICAgIGNvbnN0IGNhbGNGaWVsZCA9IHRoaXMuZmllbGQgYXMgQ2FsY0ZpZWxkRm9ybTtcbiAgICAgICAgICAgIGlmKGNhbGNGaWVsZC5mb3JtYXQ9PT1DYWxjRm9ybWF0Lk5VTUJFUiB8fCBjYWxjRmllbGQuZm9ybWF0PT09Q2FsY0Zvcm1hdC5OVU1CRVJfRElHSVQpe1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlckFycmF5ID0gdGhpcy50b051bWJlckFycmF5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKC4uLm51bWJlckFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmRhdGE9PT1udWxsIHx8IHRoaXMuZGF0YS5sZW5ndGg9PT0wKXtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucmVkdWNlKChtaW4sIGl0ZW0pID0+IChpdGVtIDwgbWluID8gaXRlbSA6IG1pbiksIHRoaXMuZGF0YVswXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpcnN0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA/IHRoaXMuZGF0YVswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsYXN0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA/IHRoaXMuZGF0YVt0aGlzLmRhdGEubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGUob3BlcmF0b3I6IE9wZXJhdG9yKTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TVU06XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdW0oKTtcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkFWRzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF2ZygpO1xuICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuTUFYOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXgoKTtcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLk1JTjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluKCk7XG4gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5DT1VOVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnQoKTtcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkZJUlNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXJzdCgpO1xuICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuTEFTVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdCgpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQge1xuICBJQWN0aW9uLFxuICBJQWN0aW9uUmVzdWx0LFxuICBJQWN0aW9uTm9kZSxcbiAgSUFjdGlvblByb3BlcnR5LFxuICBJQ29udGV4dCxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHtLaW50b25lUmVzdEFQSUNsaWVudH0gZnJvbSAnQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50JztcbmltcG9ydCB7IEFnZ3JlZ2F0b3IsT3BlcmF0b3J9IGZyb20gJy4uL3V0aWwvYWdncmVnYXRlcyc7XG5pbXBvcnQgeyBGaWVsZEZvcm0gfSBmcm9tIFwiLi4vdHlwZXMvRmllbGRMYXlvdXRcIjtcblxuaW50ZXJmYWNlIElEYXRhUHJvY2Vzc2luZ1Byb3BzIHtcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgc291cmNlczogU291cmNlcztcbiAgY29uZGl0aW9uOiBzdHJpbmc7XG4gIHZlck5hbWU/OiBWZXJOYW1lO1xufVxuXG5pbnRlcmZhY2UgQ29uZGl0aW9uIHtcbiAgcXVlcnlTdHJpbmc6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFZlck5hbWUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgdmFyczogVmFyW107XG59XG5cbmludGVyZmFjZSBWYXIge1xuICBpZDogc3RyaW5nO1xuICBmaWVsZDogRmllbGRGb3JtO1xuICBsb2dpY2FsT3BlcmF0b3I6IENhbGNPcGVyYXRvcjtcbiAgdk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENhbGNPcGVyYXRvciB7XG4gIG9wZXJhdG9yOiBPcGVyYXRvcjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNvdXJjZXMge1xuICBhcHA6IEFwcDtcbiAgZmllbGRzOiBGaWVsZEZvcm1bXTtcbn1cblxuaW50ZXJmYWNlIEFwcCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbnR5cGUgUmVzdWx0ID0ge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnlbXTtcbiAgfTtcbn07XG5cbnR5cGUgQW55T2JqZWN0ID0ge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59O1xuXG5leHBvcnQgY2xhc3MgRGF0YVByb2Nlc3NpbmdBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gIHByb3BzOiBJRGF0YVByb2Nlc3NpbmdQcm9wcyA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLjg4fjg7zjgr/lh6bnkIZcIjtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIGRpc3BsYXlOYW1lOicnLFxuICAgICAgY29uZGl0aW9uOicnLFxuICAgICAgc291cmNlczp7XG4gICAgICAgIGFwcDp7XG4gICAgICAgICAgaWQ6XCJcIlxuICAgICAgICB9LFxuICAgICAgICBmaWVsZHM6W11cbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzKFxuICAgIGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLFxuICAgIGV2ZW50OiBhbnksXG4gICAgY29udGV4dDogSUNvbnRleHRcbiAgKTogUHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG5cbiAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJRGF0YVByb2Nlc3NpbmdQcm9wcztcbiAgICBjb25zdCBjb25kaXRpb24gPSBKU09OLnBhcnNlKHRoaXMucHJvcHMuY29uZGl0aW9uKSBhcyBDb25kaXRpb247XG4gICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgIGNhbk5leHQ6IHRydWUsXG4gICAgICByZXN1bHQ6IFwiXCIsXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFF1ZXJ5KGNvbmRpdGlvbi5xdWVyeVN0cmluZyxjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5zZWxlY3REYXRhKHF1ZXJ5KTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coXCJkYXRhIFwiLCBkYXRhKTtcblxuICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lKXtcbiAgICAgICAgIGNvbnN0IHZhclZhbHVlcz0gdGhpcy5wcm9wcy52ZXJOYW1lLnZhcnMucmVkdWNlKChhY2MsIGYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzPWRhdGFbZi5maWVsZC5jb2RlXS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGFnZyA9IG5ldyBBZ2dyZWdhdG9yKGRhdGFzLGYuZmllbGQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYWdnLmNhbGN1bGF0ZShmLmxvZ2ljYWxPcGVyYXRvci5vcGVyYXRvcilcbiAgICAgICAgICAgIGFjY1tmLnZOYW1lXT1yZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9IGFzIEFueU9iamVjdCk7XG4gICAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdPXZhclZhbHVlcztcbiAgICAgICAgY29uc29sZS5sb2coXCJjb250ZXh0IFwiLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0gc3RyIFxuICAgKiBAcGFyYW0gdmFycyBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBnZXRRdWVyeSA9IChzdHI6IHN0cmluZywgdmFyczogYW55KSA9PiB7XG4gICAgY29uc29sZS5sb2coc3RyKTtcbiAgICBjb25zdCByZWdleCA9IC92YXJcXCgoLio/KVxcKS9nO1xuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgdmFyTmFtZSA9IG1hdGNoWzFdO1xuICAgICAgaWYgKHZhck5hbWUgaW4gdmFycykge1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShtYXRjaFswXSwgdmFyc1t2YXJOYW1lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOWkieaVsCR7dmFyTmFtZX3jgYzopovjgaTjgYvjgorjgb7jgZvjgpNgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coc3RyKTtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIC8qKlxuICAgKiDjg4fjg7zjgr/jgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIHF1ZXJ5IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIHNlbGVjdERhdGEgPSBhc3luYyAoIHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXBpID0gbmV3IEtpbnRvbmVSZXN0QVBJQ2xpZW50KCk7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5wcm9wcy5zb3VyY2VzLmZpZWxkcy5tYXAoKGZpZWxkKT0+ZmllbGQuY29kZSk7XG4gICAgY29uc3QgcmVzcCA9ICBhd2FpdCBhcGkucmVjb3JkLmdldEFsbFJlY29yZHMoe1xuICAgICAgICBhcHA6IHRoaXMucHJvcHMuc291cmNlcy5hcHAuaWQsXG4gICAgICAgIGZpZWxkczpmaWVsZHMsXG4gICAgICAgIGNvbmRpdGlvbjpxdWVyeVxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQ6IFJlc3VsdCA9IHt9O1xuICAgICAgcmVzcC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnQpKSB7XG4gICAgICAgICAgaWYgKCFyZXN1bHRba2V5XSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB7IHR5cGU6IHZhbHVlLnR5cGUsIHZhbHVlOiBbXSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRba2V5XS52YWx1ZS5wdXNoKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgICBcbiAgfTtcblxuICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gIH1cbn1cblxubmV3IERhdGFQcm9jZXNzaW5nQWN0aW9uKCk7IiwiaW1wb3J0IHtcbiAgSUFjdGlvbixcbiAgSUFjdGlvblJlc3VsdCxcbiAgSUFjdGlvbk5vZGUsXG4gIElBY3Rpb25Qcm9wZXJ0eSxcbiAgSUNvbnRleHQsXG59IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IEtpbnRvbmVSZXN0QVBJQ2xpZW50IH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHsgTG9va3VwIH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL0tpbnRvbmVGaWVsZHMvdHlwZXMvcHJvcGVydHlcIjtcbmltcG9ydCB7IEZpZWxkRm9ybSwgRmllbGRUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL0ZpZWxkTGF5b3V0XCI7XG5pbnRlcmZhY2UgUHJvcHMge1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBzb3VyY2VzOiBTb3VyY2VzO1xuICBkYXRhTWFwcGluZzogRGF0YU1hcHBpbmc7XG59XG5cbmludGVyZmFjZSBEYXRhTWFwcGluZyB7XG4gIGRhdGE6IE1hcHBpbmdbXTtcbiAgY3JlYXRlV2l0aE51bGw6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBNYXBwaW5nIHtcbiAgaWQ6IHN0cmluZztcbiAgZnJvbTogRnJvbTtcbiAgdG86IFRvO1xuICBpc0tleTogYm9vbGVhbjtcbn1cblxuXG5cbmludGVyZmFjZSBUbyB7XG4gIGFwcDogQXBwO1xuICBmaWVsZHM6RmllbGRGb3JtW107XG4gIGlzRGlhbG9nVmlzaWJsZTogYm9vbGVhbjtcbn1cblxuXG5pbnRlcmZhY2UgRnJvbSB7XG4gIHNoYXJlZFRleHQ6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgb2JqZWN0VHlwZTogJ3ZhcmlhYmxlJ3wnZmllbGQnfCd0ZXh0Jztcbn1cblxuaW50ZXJmYWNlIElWYXIgZXh0ZW5kcyBGcm9te1xuICBuYW1lOntcbiAgICBuYW1lOnN0cmluZztcbiAgfVxufVxuXG5pbnRlcmZhY2UgSUZyb21GaWVsZCBleHRlbmRzIEZyb20sRmllbGRGb3Jte1xuXG59XG5pbnRlcmZhY2UgU291cmNlcyB7XG4gIGFwcDogQXBwO1xufVxuXG5pbnRlcmZhY2UgQXBwIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkYXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVXBkYXRlQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBkYXRhTWFwcGluZ1Byb3BzOiBQcm9wcztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLjg4fjg7zjgr/mm7TmlrBcIjtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XG4gICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzID0ge30gYXMgUHJvcHM7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICB9XG5cbiAgYXN5bmMgcHJvY2VzcyhcbiAgICBhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZSxcbiAgICBldmVudDogYW55LFxuICAgIGNvbnRleHQ6IElDb250ZXh0XG4gICk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgUHJvcHM7XG4gICAgY29uc29sZS5sb2coY29udGV4dCk7XG4gICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgIGNhbk5leHQ6IHRydWUsXG4gICAgICByZXN1bHQ6IFwiXCIsXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb29rdXBGaXhlZEZpZWxkQ29kZXMgPSBhd2FpdCBnZXRMb29rdXBGaXhlZEZpZWxkQ29kZXMoXG4gICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5zb3VyY2VzLmFwcC5pZFxuICAgICAgKTtcblxuICAgICAgLy8gY3JlYXRlV2l0aE51bGwg44GM5pyJ5Yq544Gq5aC05ZCI44Gv44CBNCDnlarnm67jga7jg5Hjg6njg6Hjg7zjgr/jg7zjgpIgdHJ1ZSDjgavjgZfjgaYgZG9VcGRhdGUg6Zai5pWw44OW44Op44Oz44OB44KS5a6f6KGM44GX44G+44GZ44CCXG4gICAgICBpZiAodGhpcy5kYXRhTWFwcGluZ1Byb3BzLmRhdGFNYXBwaW5nLmNyZWF0ZVdpdGhOdWxsKSB7XG4gICAgICAgIGF3YWl0IGRvVXBkYXRlKFxuICAgICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5kYXRhTWFwcGluZy5kYXRhLFxuICAgICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5zb3VyY2VzLmFwcC5pZCxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRydWUsIC8vIOOCreODvOOBjOOBquOBhOWgtOWQiOOAgeOBvuOBn+OBr+OCreODvOOBp+OCv+ODvOOCsuODg+ODiOOBjOimi+OBpOOBi+OCieOBquOBhOWgtOWQiOOBq+OAgeODnuODg+ODlOODs+OCsOadoeS7tuOBq+OCiOOBo+OBpuaWsOOBl+OBhOODrOOCs+ODvOODieOCkuS9nOaIkOOBmeOCi+OBi+OBqeOBhuOBi+OCkuaxuuWumuOBmeOCi+OBn+OCgeOBq+S9v+eUqOOBleOCjOOBvuOBmeOAglxuICAgICAgICAgIGxvb2t1cEZpeGVkRmllbGRDb2Rlc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8g44Kt44O844GM44Gq44GE44Go5pu05paw5a++6LGh44KS5Y+W5b6X44Gn44GN44Gq44GE44Gf44KB44CB44GT44Gu5pmC54K544Gn44Gu44G/5pu05paw44GM6KGM44KP44KM44G+44GZ44CCIGRvVXBkYXRlIOmWouaVsOOBriA0IOeVquebruOBruODkeODqeODoeODvOOCv+ODvOOBryBmYWxzZSDjgafjgZnjgIJcbiAgICAgICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzLmRhdGFNYXBwaW5nLmRhdGFcbiAgICAgICAgICAubWFwKChtKSA9PiBtLmlzS2V5KVxuICAgICAgICAgIC5maW5kKChpc0tleSkgPT4gaXNLZXkgPT09IHRydWUpXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgZG9VcGRhdGUoXG4gICAgICAgICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzLmRhdGFNYXBwaW5nLmRhdGEsXG4gICAgICAgICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzLnNvdXJjZXMuYXBwLmlkLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgbG9va3VwRml4ZWRGaWVsZENvZGVzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBkb0NyZWF0ZShcbiAgICAgICAgICB0aGlzLmRhdGFNYXBwaW5nUHJvcHMuZGF0YU1hcHBpbmcuZGF0YSxcbiAgICAgICAgICB0aGlzLmRhdGFNYXBwaW5nUHJvcHMuc291cmNlcy5hcHAuaWQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBsb29rdXBGaXhlZEZpZWxkQ29kZXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICByZXN1bHQuY2FuTmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcImRhdGFNYXBwaW5nUHJvcHNcIiwgdGhpcy5kYXRhTWFwcGluZ1Byb3BzKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gIH1cbn1cblxubmV3IERhdGFVcGRhdGVBY3Rpb24oKTtcblxuY29uc3QgZ2V0Q29udGV4dFZhckJ5UGF0aCA9IChvYmo6IGFueSwgcGF0aDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgb2JqKTtcbn07XG5cbmludGVyZmFjZSBVcGRhdGVSZWNvcmQge1xuICBpZDogc3RyaW5nO1xuICByZWNvcmQ6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICB2YWx1ZTogYW55O1xuICAgIH07XG4gIH07XG59XG5cbmNvbnN0IGNsaWVudCA9IG5ldyBLaW50b25lUmVzdEFQSUNsaWVudCgpO1xuXG5jb25zdCBnZXRGcm9tVmFsdWU9KGl0ZW06TWFwcGluZyxjb250ZXh0OklDb250ZXh0KT0+e1xuICBpZiAoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIikge1xuICAgIGNvbnN0IHJmcm9tID1pdGVtLmZyb20gYXMgSVZhcjtcbiAgICByZXR1cm4gIGdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMscmZyb20ubmFtZS5uYW1lKTtcbiAgfWVsc2UgaWYoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwiZmllbGRcIil7XG4gICAgY29uc3QgZmllbGQgPSBpdGVtLmZyb20gYXMgSUZyb21GaWVsZDtcbiAgICByZXR1cm4gY29udGV4dC5yZWNvcmRbZmllbGQuY29kZV0udmFsdWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIGl0ZW0uZnJvbS5zaGFyZWRUZXh0O1xuICB9XG59XG5cbmNvbnN0IGRvVXBkYXRlID0gYXN5bmMgKFxuICBtYXBwaW5nRGF0YTogTWFwcGluZ1tdLFxuICBhcHBJZDogc3RyaW5nLFxuICBjb250ZXh0OiBJQ29udGV4dCxcbiAgbmVlZENyZWF0ZTogYm9vbGVhbixcbiAgbG9va3VwRml4ZWRGaWVsZENvZGVzOiBzdHJpbmdbXVxuKSA9PiB7XG4gIGNvbnN0IHRhcmdldEZpZWxkID0gYXdhaXQgZmluZFVwZGF0ZUZpZWxkKG1hcHBpbmdEYXRhLCBhcHBJZCwgY29udGV4dCk7XG4gIGNvbnNvbGUubG9nKHRhcmdldEZpZWxkKTtcbiAgaWYgKHRhcmdldEZpZWxkLnJlY29yZHMubGVuZ3RoID09PSAwICYmIG5lZWRDcmVhdGUpIHtcbiAgICBhd2FpdCBkb0NyZWF0ZShtYXBwaW5nRGF0YSwgYXBwSWQsIGNvbnRleHQsIGxvb2t1cEZpeGVkRmllbGRDb2Rlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8g44Oe44OD44OU44Oz44Kw44OH44O844K/44KS5Y2Y57SU44Gq44Kq44OW44K444Kn44Kv44OI44Gr5Yem55CG44GX44CB44K944O844K55YCk44GM5aSJ5pWw44Gu5aC05ZCI44Gv5aSJ5pWw44KS572u44GN5o+b44GI44G+44GZ44CCXG4gICAgY29uc3QgbWFwcGluZ1J1bGVzID0gbWFwcGluZ0RhdGFcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKG0uZnJvbSkubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICFsb29rdXBGaXhlZEZpZWxkQ29kZXMuaW5jbHVkZXMobS50by5maWVsZHNbMF0uY29kZSlcbiAgICAgIClcbiAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgaWYgKG0uZnJvbS5vYmplY3RUeXBlID09PSBcInZhcmlhYmxlXCIpIHtcbiAgICAgICAgICBjb25zdCByZnJvbSA9bS5mcm9tIGFzIElWYXI7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRDb250ZXh0VmFyQnlQYXRoKGNvbnRleHQudmFyaWFibGVzLHJmcm9tLm5hbWUubmFtZSksXG4gICAgICAgICAgICBjb2RlOiBtLnRvLmZpZWxkc1swXS5jb2RlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1lbHNlIGlmKG0uZnJvbS5vYmplY3RUeXBlID09PSBcImZpZWxkXCIpe1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbS5mcm9tIGFzIElGcm9tRmllbGQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBjb250ZXh0LnJlY29yZFtmaWVsZC5jb2RlXS52YWx1ZSxcbiAgICAgICAgICAgIGNvZGU6IG0udG8uZmllbGRzWzBdLmNvZGUsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG0uZnJvbS5zaGFyZWRUZXh0LFxuICAgICAgICAgICAgY29kZTogbS50by5maWVsZHNbMF0uY29kZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZVJlY29yZHM6IFVwZGF0ZVJlY29yZFtdID0gdGFyZ2V0RmllbGQucmVjb3Jkcy5tYXAoXG4gICAgICAodGFyZ2V0UmVjb3JkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVJlY29yZDogVXBkYXRlUmVjb3JkW1wicmVjb3JkXCJdID0ge307XG5cbiAgICAgICAgLy8g44Oe44OD44OU44Oz44Kw5YaF44Gu44Or44O844Or44Gr44OS44OD44OI44GX44Gf44OV44Kj44O844Or44OJ44Gu44G/44GM5pu05paw44GV44KM44G+44GZ44CCXG4gICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBtYXBwaW5nUnVsZXMpIHtcbiAgICAgICAgICBpZiAodGFyZ2V0UmVjb3JkW21hcHBpbmcuY29kZV0pIHtcbiAgICAgICAgICAgIHVwZGF0ZVJlY29yZFttYXBwaW5nLmNvZGVdID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogbWFwcGluZy52YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogdGFyZ2V0UmVjb3JkLiRpZC52YWx1ZSBhcyBzdHJpbmcsXG4gICAgICAgICAgcmVjb3JkOiB1cGRhdGVSZWNvcmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnNvbGUubG9nKHVwZGF0ZVJlY29yZHMpO1xuICAgIGF3YWl0IGNsaWVudC5yZWNvcmQudXBkYXRlUmVjb3Jkcyh7XG4gICAgICBhcHA6IGFwcElkLFxuICAgICAgcmVjb3JkczogdXBkYXRlUmVjb3JkcyxcbiAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgbWFrZVF1ZXJ5PShmaWVsZDpGaWVsZEZvcm0sa2V5OmFueSk9PntcbiAgaWYoZmllbGQudHlwZT09PUZpZWxkVHlwZS5OVU1CRVIgfHwgZmllbGQudHlwZT09PUZpZWxkVHlwZS5SRUNPUkRfTlVNQkVSKXtcbiAgICByZXR1cm4gYCR7ZmllbGQuY29kZX0gPSAke051bWJlcihrZXkpfWBcbiAgfVxuICBpZih0eXBlb2Yga2V5PT09J3N0cmluZycpe1xuICAgIHJldHVybiBgJHtmaWVsZC5jb2RlfSA9IFwiJHtrZXl9XCJgXG4gIH1cbn1cblxuXG5jb25zdCBmaW5kVXBkYXRlRmllbGQgPSBhc3luYyAoXG4gIG1hcHBpbmdEYXRhOiBNYXBwaW5nW10sXG4gIGFwcElkOiBzdHJpbmcsXG4gIGNvbnRleHQ6IElDb250ZXh0XG4pID0+IHtcbiAgY29uc3QgcXVlcnlTdHIgPSBtYXBwaW5nRGF0YVxuICAgIC5maWx0ZXIoKG0pID0+IG0udG8uYXBwICYmIG0udG8uZmllbGRzICYmIG0udG8uZmllbGRzLmxlbmd0aCA+IDAgJiYgbS5pc0tleSlcbiAgICAubWFwKChtKSA9PiB7XG4gICAgICBpZiAobS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIikge1xuICAgICAgICBjb25zdCB2ZnJvbSA9IG0uZnJvbSBhcyBJVmFyO1xuICAgICAgICByZXR1cm4gbWFrZVF1ZXJ5KG0udG8uZmllbGRzWzBdLGdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMgLCB2ZnJvbS5uYW1lLm5hbWUpKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYobS5mcm9tLm9iamVjdFR5cGUgPT09IFwiZmllbGRcIil7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbS5mcm9tIGFzIElGcm9tRmllbGQ7XG4gICAgICAgIHJldHVybiBtYWtlUXVlcnkobS50by5maWVsZHNbMF0sY29udGV4dC5yZWNvcmRbZmllbGQuY29kZV0udmFsdWUpO1xuICAgICAgfSBcbiAgICAgIGVsc2V7XG4gICAgICAgIHJldHVybiBtYWtlUXVlcnkobS50by5maWVsZHNbMF0sbS5mcm9tLnNoYXJlZFRleHQpO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmpvaW4oXCImXCIpO1xuICAvLyDmpJzntKLmnaHku7bjgYznqbrjga7loLTlkIjjga/lhajjg6zjgrPjg7zjg4njgpLov5TjgZnjgZ/jgoHjgIHmpJzntKLlr77osaHjgYzopovjgaTjgYvjgonjgarjgYTloLTlkIjjga/mpJzntKLjga/ooYzjgo/jgozjgb7jgZvjgpPjgIJcbiAgaWYgKHF1ZXJ5U3RyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWNvcmRzOiBbXSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCBjbGllbnQucmVjb3JkLmdldFJlY29yZHMoe1xuICAgICAgYXBwOiBhcHBJZCxcbiAgICAgIC8vIHF1ZXJ5OiB1bmRlZmluZWRcbiAgICAgIHF1ZXJ5OiBxdWVyeVN0cixcbiAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgZG9DcmVhdGUgPSBhc3luYyAoXG4gIG1hcHBpbmdEYXRhOiBNYXBwaW5nW10sXG4gIGFwcElkOiBzdHJpbmcsXG4gIGNvbnRleHQ6IElDb250ZXh0LFxuICBsb29rdXBGaXhlZEZpZWxkQ29kZXM6IHN0cmluZ1tdXG4pID0+IHtcbiAgY29uc3QgZmlsdGVySGFuZGxlciA9ICAoaXRlbTpNYXBwaW5nKT0+e1xuICAgIGlmKCFpdGVtLnRvLmZpZWxkcyB8fCBpdGVtLnRvLmZpZWxkcy5sZW5ndGg9PT0wKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIiAmJiAoaXRlbS5mcm9tIGFzIElWYXIpLm5hbWUubmFtZSAgKXtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZihpdGVtLmZyb20ub2JqZWN0VHlwZSA9PT0gXCJmaWVsZFwiICYmIChpdGVtLmZyb20gYXMgSUZyb21GaWVsZCkuY29kZSl7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwidGV4dFwiICYmIGl0ZW0uZnJvbS5zaGFyZWRUZXh0IT09bnVsbCl7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlY29yZCA9IG1hcHBpbmdEYXRhXG4gICAgLmZpbHRlcihmaWx0ZXJIYW5kbGVyKVxuICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFsb29rdXBGaXhlZEZpZWxkQ29kZXMuaW5jbHVkZXMoaXRlbS50by5maWVsZHNbMF0uY29kZSkpXG4gICAgLnJlZHVjZSgoYWNjdW11bGF0b3IsIGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjY3VtdWxhdG9yLFxuICAgICAgICBbaXRlbS50by5maWVsZHNbMF0uY29kZV06IHtcbiAgICAgICAgICB2YWx1ZTogZ2V0RnJvbVZhbHVlKGl0ZW0sY29udGV4dCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sIHt9KTtcbiAgaWYgKHJlY29yZCAmJiBPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhyZWNvcmQpO1xuICAgIGF3YWl0IGNsaWVudC5yZWNvcmQuYWRkUmVjb3JkKHtcbiAgICAgIGFwcDphcHBJZCxcbiAgICAgIHJlY29yZDpyZWNvcmRcbiAgICB9KTtcbiAgICAvLyBhd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoXCIvay92MS9yZWNvcmQuanNvblwiLCB0cnVlKSwgXCJQT1NUXCIsIHtcbiAgICAvLyAgIGFwcDogYXBwSWQsXG4gICAgLy8gICByZWNvcmQ6IHJlY29yZCxcbiAgICAvLyB9KTtcbiAgfVxufTtcblxuY29uc3QgZ2V0TG9va3VwRml4ZWRGaWVsZENvZGVzID0gYXN5bmMgKGFwcElkOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGF3YWl0IGNsaWVudC5hcHBcbiAgICAuZ2V0Rm9ybUZpZWxkcyh7IGFwcDogYXBwSWQgfSlcbiAgICAudGhlbigocmVzcCkgPT5cbiAgICAgIE9iamVjdC52YWx1ZXMocmVzcC5wcm9wZXJ0aWVzKVxuICAgICAgICAuZmlsdGVyKChmKSA9PiAoZiBhcyBMb29rdXApLmxvb2t1cCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAuZmxhdE1hcCgoZikgPT4gKGYgYXMgTG9va3VwKS5sb29rdXAuZmllbGRNYXBwaW5ncy5tYXAoKG0pID0+IG0uZmllbGQpKVxuICAgICk7XG59O1xuIiwiaW1wb3J0IHtcbiAgSUFjdGlvbixcbiAgSUFjdGlvblJlc3VsdCxcbiAgSUFjdGlvbk5vZGUsXG4gIElBY3Rpb25Qcm9wZXJ0eSxcbiAgSUNvbnRleHQsXG4gIElGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuXG5cbmludGVyZmFjZSBJQ3VycmVudEZpZWxkR2V0UHJvcHMge1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBmaWVsZDogSUZpZWxkO1xuICB2ZXJOYW1lOiBWZXJOYW1lO1xufVxuXG5pbnRlcmZhY2UgVmVyTmFtZSB7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuXG5leHBvcnQgY2xhc3MgQ3VycmVudEZpZWxkR2V0QWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBwcm9wczogSUN1cnJlbnRGaWVsZEdldFByb3BzO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5hbWUgPSBcIuODleOCo+ODvOODq+ODieOBruWApOOCkuWPluW+l+OBmeOCi1wiO1xuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcbiAgICB0aGlzLnByb3BzID0ge30gYXMgSUN1cnJlbnRGaWVsZEdldFByb3BzO1xuICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3MoXG4gICAgYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsXG4gICAgZXZlbnQ6IGFueSxcbiAgICBjb250ZXh0OiBJQ29udGV4dFxuICApOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQ3VycmVudEZpZWxkR2V0UHJvcHM7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG5cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgIHJlc3VsdDogJycsXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDjg5XjgqPjg7zjg6vjg4lbJHt0aGlzLnByb3BzLmZpZWxkLmNvZGV9XeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAgmApO1xuICAgICAgfVxuICAgICAgLy/lpInmlbDoqK3lrppcbiAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcbiAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdPXJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgfVxuICAgIH0gXG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gIH1cbn1cblxubmV3IEN1cnJlbnRGaWVsZEdldEFjdGlvbigpO1xuIiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7ICBJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCwgSUNvbnRleHR9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElSZWd1bGFyQ2hlY2tQcm9wc3tcbiAgICBmaWVsZDpJRmllbGQ7Ly/jg4Hjgqfjg4Pjgq/jgZnjgovjg5XjgqPjg7zjg6vjg4njga7lr77osaFcbiAgICBtZXNzYWdlOnN0cmluZzsvL+OCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgIHJlZ0V4cHJlc3Npb246c3RyaW5nOy8v5q2j6KaP6KGo54++5byPXG59XG4vKipcbiAqIOato+imj+ihqOePvuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgUmVndWxhckNoZWNrQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklSZWd1bGFyQ2hlY2tQcm9wcztcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLm5hbWU9XCLmraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBtZXNzYWdlOicnLFxuICAgICAgICAgICAgcmVnRXhwcmVzc2lvbjonJ1xuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3JlZ0V4cHJlc3Npb24naW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJUmVndWxhckNoZWNrUHJvcHM7XG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBruioiOeul+e1kOaenOOCkuWPluW+l1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLnByb3BzLnJlZ0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgaWYoIXJlZ2V4LnRlc3QodmFsdWUpKXtcbiAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvcj10aGlzLnByb3BzLm1lc3NhZ2U7IFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG4gICAgXG59XG5uZXcgUmVndWxhckNoZWNrQWN0aW9uKCk7XG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgSUFjdGlvbiwgSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElNYWlsQ2hlY2tQcm9wcyB7XG4gICAgZmllbGQ6IElGaWVsZDsvL+ODgeOCp+ODg+OCr+OBmeOCi+ODleOCo+ODvOODq+ODieOBruWvvuixoVxuICAgIG1lc3NhZ2U6IHN0cmluZzsvL+OCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgIGVtYWlsQ2hlY2s6c3RyaW5nO1xufVxuLyoqXG4gKiDjg6Hjg7zjg6vjgqLjg4njg6zjgrnjg4Hjgqfjg4Pjgq/jgqLjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIE1haWxDaGVja0FjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gICAgcHJvcHM6IElNYWlsQ2hlY2tQcm9wcztcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjg4Hjgqfjg4Pjgq9cIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xuICAgICAgICB0aGlzLnByb3BzID0ge1xuICAgICAgICAgICAgZmllbGQ6IHsgY29kZTogJycgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgZW1haWxDaGVjazonJ1xuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsIGV2ZW50OiBhbnksY29udGV4dDpJQ29udGV4dCk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2VtYWlsQ2hlY2snIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSU1haWxDaGVja1Byb3BzO1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgICAgICAgICAgLy/lr77osaHjg5XjgqPjg7zjg6vjg4njga7lrZjlnKjjg4Hjgqfjg4Pjgq9cbiAgICAgICAgICAgIGlmKCEodGhpcy5wcm9wcy5maWVsZC5jb2RlIGluIHJlY29yZCkpe1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg44OV44Kj44O844Or44OJWyR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfV3jgYzopovjgaTjgYvjgorjgb7jgZvjgpPjgafjgZfjgZ/jgIJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0udmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmVtYWlsQ2hlY2sgPT09ICfljrPmoLwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEvXlthLXpBLVowLTlfLcKlLl0rQFthLXpBLVowLTlfLV0rKFxcLlthLXpBLVowLTlfLV0rKSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvciA9IHRoaXMucHJvcHMubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDsgXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQ9dHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZW1haWxDaGVjayA9PT0gJ+OChuOCi+OCgScpIHtcbiAgICAgICAgICAgICAgICBpZiAoIS9eW15AXStAW15AXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvciA9IHRoaXMucHJvcHMubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDsgXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQ9dHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgfVxuXG59XG5uZXcgTWFpbENoZWNrQWN0aW9uKCk7XG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSVN0ckNvdW50Q2hlY2tQcm9wc3tcbiAgICBmaWVsZDpJRmllbGQ7Ly/jg4Hjgqfjg4Pjgq/jgZnjgovjg5XjgqPjg7zjg6vjg4njga7lr77osaFcbiAgICBtZXNzYWdlOnN0cmluZzsvL+OCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgIG1heExlbmd0aDpudW1iZXI7Ly9cbn1cbi8qKlxuICog5q2j6KaP6KGo54++44OB44Kn44OD44Kv44Ki44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJDb3VudENoZWNrQWNpdG9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklTdHJDb3VudENoZWNrUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5paH5a2X5pWw44OB44Kn44OD44KvXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxuICAgICAgICAgICAgbWVzc2FnZTonJyxcbiAgICAgICAgICAgIG1heExlbmd0aDowXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnbWVzc2FnZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnc3RyRXhwcmVzc2lvbidpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSVN0ckNvdW50Q2hlY2tQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy5wcm9wcy5tYXhMZW5ndGg7XG4gICAgICAgICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJyApe1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9ZWxzZSBpZihtYXhMZW5ndGggPCB2YWx1ZS5sZW5ndGgpe1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gdGhpcy5wcm9wcy5tZXNzYWdlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3IgPSBudWxsOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgXG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxuICAgIFxufVxubmV3IFN0ckNvdW50Q2hlY2tBY2l0b24oKTtcbiIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElBY3Rpb24sIElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCAsSUNvbnRleHQsIElWYXJOYW1lfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElEYXRldGltZUdldHRlclByb3BzIHtcclxuICAgIC8qKuWkieaVsOOBruWQjeWJjSAqL1xyXG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcclxufVxyXG4vKipcclxuICog54++5Zyo5pel5pmC44KS5Y+W5b6X44GZ44KL44Ki44Kv44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0ZXRpbWVHZXR0ZXJBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIHByb3BzOiBJRGF0ZXRpbWVHZXR0ZXJQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwi54++5Zyo5pel5pmCXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xyXG4gICAgICAgIHRoaXMucHJvcHMgPSB7XHJcbiAgICAgICAgICAgIHZlck5hbWU6e25hbWU6Jyd9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LGNvbnRleHQ6SUNvbnRleHQpOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICBjYW5OZXh0OiB0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSURhdGV0aW1lR2V0dGVyUHJvcHM7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT10b2RheS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxufVxyXG5uZXcgRGF0ZXRpbWVHZXR0ZXJBY3Rpb24oKTtcclxuIiwiXG5cbmltcG9ydCB7IGVhY2ggfSBmcm9tIFwianF1ZXJ5XCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uVHJlZSB9IGZyb20gJy4uL3R5cGVzL0NvbmRpdGlvbnMnO1xuXG5cblxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElJbnNlcnRWYWx1ZVByb3Bze1xuICAgIGZpZWxkOklGaWVsZDtcbiAgICBjb25kaXRpb246c3RyaW5nO1xuICAgIHZhbHVlOnN0cmluZztcbiAgICBzaG93OnN0cmluZztcbn1cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEluc2VydFZhbHVlQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklJbnNlcnRWYWx1ZVByb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuWApOOCkuaMv+WFpeOBmeOCi1wiOy8vIERC44Gr55m76Yyy44GX44Gf44Ki44Kv44K344On44Oz5ZCNXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIC8v44OX44Ot44OR44OG44Kj5bGe5oCn44Gu5Yid5pyf5YyWXG4gICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxuICAgICAgICAgICAgY29uZGl0aW9uOicnLFxuICAgICAgICAgICAgdmFsdWU6JycsXG4gICAgICAgICAgICBzaG93OicnXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOepuueZveaWh+Wtl+OCkuepuueZveaWh+Wtl+OBjOmdnuWvvuW/nOOBruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOBquOBhOOBi+OAgeW/hemgiOmgheebruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOBquOBhOOBi+ODgeOCp+ODg+OCr+OBmeOCi1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLeWFpeWKm+WApOOBjOacieWKueOBquaXpeS7mOW9ouW8j+OBruWgtOWQiOOBr3RydWXjgpLov5TjgZfjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga/kvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgKi9cbiAgICBjaGVja0lucHV0VmFsdWVCbGFuayhmaWVsZFR5cGUgOnN0cmluZyB8IHVuZGVmaW5lZCxpbnB1dFZhbHVlIDpzdHJpbmcsZmllbGRDb2RlIDpzdHJpbmcsZmllbGRSZXF1aXJlZCA6Ym9vbGVhbiB8IHVuZGVmaW5lZCxldmVudCA6YW55KTogYm9vbGVhbntcblxuICAgICAgICBsZXQgdmFsdWVIYXNCbGFuaztcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgdmFsdWVIYXNCbGFuayA9IGlucHV0VmFsdWUubWF0Y2goL14oXFxzfOOAgCkqJC8pOy8v5YCk44GM5Y2K6KeS44K544Oa44O844K544O744K/44OW5paH5a2X44O75pS56KGM44O75pS544Oa44O844K444O75YWo6KeS44K544Oa44O844K544Gu44G/44Gn44GC44KL44GLXG5cblxuICAgICAgICAvL+WApOOBq+epuueZveaWh+Wtl+OBjOWFpeOBo+OBpuOBhOOCi+OAgW51bGzjga7jgajjgY3jga/jgIHjgqjjg6njg7zjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgICAgaWYodmFsdWVIYXNCbGFuayAhPT0gbnVsbCB8fCBpbnB1dFZhbHVlID09PSBudWxsIHx8IGlucHV0VmFsdWUgPT09ICcnKXtcbiAgICAgICAgICAgIC8v56m655m95paH5a2X44KS56m655m95paH5a2X44GM6Z2e5a++5b+c44Gu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44KL5aC05ZCI44CB5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICAgICAgICBpZihmaWVsZFR5cGUgPT09IFwiTlVNQkVSXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVcIiB8fCBmaWVsZFR5cGUgPT09IFwiREFURVRJTUVcIiB8fCBmaWVsZFR5cGUgPT09IFwiVElNRVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJVU0VSX1NFTEVDVFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWVsZFR5cGUgPT09IFwiT1JHQU5JWkFUSU9OX1NFTEVDVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJHUk9VUF9TRUxFQ1RcIiB8fCBmaWVsZFR5cGUgPT09IFwiUkFESU9fQlVUVE9OXCIgfHwgZmllbGRUeXBlID09PSBcIkRST1BfRE9XTlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJDSEVDS19CT1hcIiB8fCBmaWVsZFR5cGUgPT09IFwiTVVMVElfU0VMRUNUXCIpe1xuICAgICAgICAgICAgICAgIGV2ZW50LnJlY29yZFtmaWVsZENvZGVdWydlcnJvciddID0gXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OAgeWApOOBr+epuueZveaWh+Wtl+OBp+OBmeOAglwiOyAvL+ODrOOCs+ODvOODieOBq+OCqOODqeODvOOCkuihqOekulxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf44CB5YCk44Gv56m655m95paH5a2X44Gn44GZ44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuXG4gICAgICAgICAgICAvL+epuueZveaWh+Wtl+OCkuW/hemgiOmgheebruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOCi+WgtOWQiOOAgeS+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRSZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gv5b+F6aCI6aCF55uu44Gu44Gf44KB44CB56m655m95paH5a2X44Gv5oy/5YWl44Gn44GN44G+44Gb44KT44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njga/lv4XpoIjpoIXnm67jga7jgZ/jgoHjgIHnqbrnmb3mloflrZfjga/mjL/lhaXjgafjgY3jgb7jgZvjgpPjgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnqbrnmb3mloflrZfjga7lpInmlbDjgpLpnZ7lr77lv5zjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgarjgYTjgYvjgIHlv4XpoIjpoIXnm67jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgarjgYTjgYvjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRWYWx1ZSAtIOaMv+WFpeOBmeOCi+WApFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC3lhaXlipvlgKTjgYzmnInlirnjgarml6Xku5jlvaLlvI/jga7loLTlkIjjga90cnVl44KS6L+U44GX44CB44Gd44GG44Gn44Gq44GE5aC05ZCI44Gv5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICovXG4gICAgY2hlY2tWYXJpYWJsZVZhbHVlQmxhbmsoZmllbGRUeXBlIDpzdHJpbmcgfCB1bmRlZmluZWQsaW5wdXRWYWx1ZUFycmF5IDphbnksZmllbGRDb2RlIDpzdHJpbmcsZmllbGRSZXF1aXJlZCA6Ym9vbGVhbiB8IHVuZGVmaW5lZCxldmVudCA6YW55KTogYm9vbGVhbntcblxuICAgICAgICBsZXQgdmFyaWFibGVIYXNCbGFuaztcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgZm9yKGxldCBpID0wO2k8aW5wdXRWYWx1ZUFycmF5Lmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgLy/phY3liJfjga7opoHntKDjgatudWxs44GM44Gq44GE44GL44CB56m655m95paH5a2X44GM5YCk44Gr5ZCr44G+44KM44Gm44GE44Gq44GE44GL44OB44Kn44OD44Kv44GZ44KLXG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0VmFsdWVBcnJheVtpXSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICB2YXJpYWJsZUhhc0JsYW5rID0gaW5wdXRWYWx1ZUFycmF5W2ldLm1hdGNoKC9eKFxcc3zjgIApKiQvKTsvL+WApOOBjOWNiuinkuOCueODmuODvOOCueODu+OCv+ODluaWh+Wtl+ODu+aUueihjOODu+aUueODmuODvOOCuOODu+WFqOinkuOCueODmuODvOOCueOBruOBv+OBp+OBguOCi+OBi1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/lpInmlbDjga7lgKTjgavnqbrnmb3mloflrZfjgYzlhaXjgaPjgabjgYTjgovjgIHphY3liJfjgavopoHntKDjgYzjgarjgYTjgajjgY3jga/jgIHjgqjjg6njg7zjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgICAgaWYodmFyaWFibGVIYXNCbGFuayAhPT0gbnVsbCAmJiB2YXJpYWJsZUhhc0JsYW5rICE9PSB1bmRlZmluZWQgJiYgIHZhcmlhYmxlSGFzQmxhbmsgIT09IFwiXCIgJiYgaW5wdXRWYWx1ZUFycmF5Lmxlbmd0aCA9PT0gMCl7XG4gICAgICAgICAgICAvL+epuueZveaWh+Wtl+OCkuepuueZveaWh+Wtl+OBjOmdnuWvvuW/nOOBruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOCi+WgtOWQiOOAgeS+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAgICAgICAgaWYoZmllbGRUeXBlID09PSBcIk5VTUJFUlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVUSU1FXCIgfHwgZmllbGRUeXBlID09PSBcIlRJTUVcIiB8fCBmaWVsZFR5cGUgPT09IFwiVVNFUl9TRUxFQ1RcIlxuICAgICAgICAgICAgICAgIHx8IGZpZWxkVHlwZSA9PT0gXCJPUkdBTklaQVRJT05fU0VMRUNUXCIgfHwgZmllbGRUeXBlID09PSBcIkdST1VQX1NFTEVDVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJSQURJT19CVVRUT05cIiB8fCBmaWVsZFR5cGUgPT09IFwiRFJPUF9ET1dOXCIgfHwgZmllbGRUeXBlID09PSBcIkNIRUNLX0JPWFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJNVUxUSV9TRUxFQ1RcIil7XG4gICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf44CB5aSJ5pWw44Gu5YCk44Gv56m655m95paH5a2X44Gn44GZ44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/jgIHlpInmlbDjga7lgKTjga/nqbrnmb3mloflrZfjgafjgZnjgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG5cbiAgICAgICAgICAgIC8v56m655m95paH5a2X44KS5b+F6aCI6aCF55uu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44KL5aC05ZCI44CB5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXSA9IFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njga/lv4XpoIjpoIXnm67jgafjgYLjgorjgIHnqbrnmb3jg7vnqbrnmb3mloflrZfjga7lgKTjga7lpInmlbDjga/jgIHmjL/lhaXjgafjgY3jgb7jgZvjgpPjgIJcIjsgLy/jg6zjgrPjg7zjg4njgavjgqjjg6njg7zjgpLooajnpLpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBr+W/hemgiOmgheebruOBp+OBguOCiuOAgeepuueZveODu+epuueZveaWh+Wtl+OBruWApOOBruWkieaVsOOBr+OAgeaMv+WFpeOBp+OBjeOBvuOBm+OCk+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOWNiuinkuaVsOWtl+OBi+ODgeOCp+ODg+OCr+OBmeOCi+mWouaVsFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLeWFpeWKm+WApOOBjOacieWKueOBquaVsOWApOOBruWgtOWQiOOBr3RydWXjgpLov5TjgZfjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga/kvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgKi9cbiAgICBjaGVja0lucHV0TnVtYmVyKGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxldmVudCA6YW55KTogYm9vbGVhbntcbiAgICAgICAgbGV0IGlucHV0TnVtYmVyVmFsdWUgPSBOdW1iZXIoaW5wdXRWYWx1ZSk7Ly/mlbDlgKTlnovjgavlpInmj5tcblxuICAgICAgICAvL+aciemZkOaVsOOBi+OBqeOBhuOBi+WIpOWumlxuICAgICAgICBpZighaXNGaW5pdGUoaW5wdXROdW1iZXJWYWx1ZSkpe1xuICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pel5LuY5b2i5byP44Gn44GZ44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeacieWKueOBquaVsOWApOOBp+OBr+OBguOCiuOBvuOBm+OCk+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiog5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pel5LuY5b2i5byP44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pel5LuY5b2i5byP44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAqL1xuICAgIGNoZWNrSW5wdXREYXRlKGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxldmVudCA6YW55KTogYm9vbGVhbntcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgbGV0IHR3b0RpZ2l0TW9udGhEYXkgPSBpbnB1dFZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvKTsvLzTmoYHjga7mlbDlrZctMuahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XXG4gICAgICAgIGxldCBzaW5nbGVEaWdpdE1vbnRoRGF5ID0gaW5wdXRWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsxfSktKFxcZHsxfSkkLyk7Ly805qGB44Gu5pWw5a2XLTHmoYHjga7mlbDlrZctMuahgeOBruaVsOWtl1xuICAgICAgICBsZXQgc2luZ2xlRGlnaXRNb250aCA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7MX0pLShcXGR7Mn0pJC8pOy8vNOahgeOBruaVsOWtly0x5qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZdcbiAgICAgICAgbGV0IHNpbmdsZURpZ2l0RGF5ID0gaW5wdXRWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsxfSkkLyk7Ly805qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZctMeahgeOBruaVsOWtl1xuICAgICAgICBsZXQgZGF0ZVRpbWVNaWxsaVNlY29uZCA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pLihcXGR7MiwzfSlaJC8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPKOODn+ODquenkilcbiAgICAgICAgbGV0IGRhdGVUaW1lID0gaW5wdXRWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlUKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSlaJC8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPXG4gICAgICAgIGxldCBkYXRlO1xuICAgICAgICAvL2RhdGXlnovjgavlpInmj5tcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGlucHV0VmFsdWUpO1xuXG4gICAgICAgIC8vZGF0ZeWei+WkieaPm+OBp+OBjeOBn+OBi+eiuuiqjVxuICAgICAgICBpZihkYXRlICE9PSB1bmRlZmluZWQgJiYgIWlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7XG4gICAgICAgICAgICAvL+ato+imj+ihqOePvuODgeOCp+ODg+OCr+eiuuiqjVxuICAgICAgICAgICAgaWYodHdvRGlnaXRNb250aERheSA9PT0gbnVsbCAmJiBzaW5nbGVEaWdpdE1vbnRoID09PSBudWxsICYmIHNpbmdsZURpZ2l0RGF5ID09PSBudWxsICYmIHNpbmdsZURpZ2l0TW9udGhEYXkgPT09IG51bGwgJiYgZGF0ZVRpbWUgPT09IG51bGwgJiYgZGF0ZVRpbWVNaWxsaVNlY29uZCA9PT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnJlY29yZFtmaWVsZENvZGVdWydlcnJvciddID0gXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeeEoeWKueOBquaXpeS7mOW9ouW8j+OBp+OBmeOAglwiOyAvL+ODrOOCs+ODvOODieOBq+OCqOODqeODvOOCkuihqOekulxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeeEoeWKueOBquaXpeS7mOW9ouW8j+OBp+OBmeOAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiog5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pmC5Yi75b2i5byP44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pel5LuY5b2i5byP44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAqL1xuICAgIGNoZWNrSW5wdXRUaW1lKGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxldmVudCA6YW55KTogYm9vbGVhbntcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgbGV0IHRpbWVGb3JtYXQgPWlucHV0VmFsdWUubWF0Y2goL14oWzAtOV18MFswLTldfDFbMC05XXwyWzAtM10pOlswLTVdWzAtOV0kLyk7XG5cbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq/norroqo1cbiAgICAgICAgaWYodGltZUZvcm1hdCA9PT0gbnVsbCl7XG4gICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXSA9IFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lgKTjga/jgIHnhKHlirnjgarmmYLliLvlvaLlvI/jgafjgZnjgIJcIjsgLy/jg6zjgrPjg7zjg4njgavjgqjjg6njg7zjgpLooajnpLpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pmC5Yi75b2i5byP44Gn44GZ44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CC44CMMe+9njLmoYEgOiAy5qGB44CN44Gu5YCk44KS5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBruODleOCo+ODvOODq+ODieOCv+OCpOODl+OBjERBVEVUSU1F44Gn44GC44KM44Gw44CB5pmC5Yi744GC44KK44Gu5pel5LuY5b2i5byP5aSJ5o+b44GX44CBREFUReOBp+OBguOCjOOBsOaZguWIu+OBquOBl+OBruaXpeS7mOW9ouW8j+WkieaPm+OBmeOCi+mWouaVsFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC3mjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRUeXBlICAt44OV44Kj44O844Or44OJ44K/44Kk44OXXG4gICAgICogQHJldHVybiB7c3RyaW5nfSAt5YWl5Yqb5YCk44GM5pel5LuY5b2i5byP44Gr5aSJ5o+b44Gn44GN44Gf5aC05ZCI44Gv5paH5a2X5YiX44KS6L+U44GX44CB44Gd44GG44Gn44Gq44GE5aC05ZCI44Gv5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICovXG4gICAgY2hhbmdlRGF0ZUZvcm1hdChpbnB1dFZhbHVlIDpzdHJpbmcsIGZpZWxkVHlwZSA6c3RyaW5nLGZpZWxkQ29kZSA6c3RyaW5nLGV2ZW50IDphbnkpOiBzdHJpbmd7XG4gICAgICAgIGxldCBkYXRlVGltZTtcbiAgICAgICAgbGV0IGRhdGU7XG5cbiAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgpJkYXRl5Z6L44Gr5aSJ5o+bXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShpbnB1dFZhbHVlKTtcbiAgICAgICAgLy9kYXRl5Z6L5aSJ5o+b44Gn44GN44Gf44GL56K66KqNXG4gICAgICAgIGlmKGRhdGUgIT09IHVuZGVmaW5lZCAmJiAhaXNOYU4oZGF0ZS5nZXREYXRlKCkpKXtcblxuICAgICAgICAgICAgLy/ml6XmmYLjg5XjgqPjg7zjg6vjg4njga7loLTlkIjjgIHmmYLliLvjgYLjgorjga7ml6Xku5jlvaLlvI/lpInmj5tcbiAgICAgICAgICAgIGlmKGZpZWxkVHlwZSA9PT0gXCJEQVRFVElNRVwiKXtcbiAgICAgICAgICAgICAgICBkYXRlVGltZSA9ZGF0ZS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlVGltZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/ml6Xku5jjg5XjgqPjg7zjg6vjg4njga7loLTlkIjjgIHmmYLliLvjgarjgZfjga7ml6Xku5jjgavlvaLlvI/lpInmj5tcbiAgICAgICAgICAgIC8vVVRD44Gu5pmC5Yi744KS5oy/5YWl44GX44Gf44GE5aC05ZCI44CBSlNU44Gr5aSJ5o+b44GZ44KLXG4gICAgICAgICAgICBsZXQgZGF0ZVRpbWVNaWxsaVNlY29uZCA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pLihcXGR7MiwzfSlaJC8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPKOODn+ODquenkilcbiAgICAgICAgICAgIGxldCBkYXRlVGltZU5vdEluY2x1ZGluZ01pbGxpU2Vjb25kcyA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pWiQvKTsvL+aZguWIu+WFpeOCiuOBrlVUQ+OBruaXpeS7mOW9ouW8j1xuXG4gICAgICAgICAgICBpZihkYXRlVGltZU1pbGxpU2Vjb25kICE9PSBudWxsIHx8IGRhdGVUaW1lTm90SW5jbHVkaW5nTWlsbGlTZWNvbmRzICE9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAvL0pTVOOBq+WkieaPm1xuICAgICAgICAgICAgICAgIGxldCBqc3REYXRlPWRhdGUudG9Mb2NhbGVTdHJpbmcoXCJqYS1KUFwiLCB7IHRpbWVab25lOiBcIkFzaWEvVG9reW9cIiB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhqc3REYXRlKTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZUFycmF5PWpzdERhdGUubWF0Y2goLyhcXGR7NH0pXFwvKFxcZHsxLDJ9KVxcLyhcXGR7MSwyfSkvKTsvLzTmoYHjga7mlbDlrZctMe+9njLmoYHjga7mlbDlrZctMe+9njLmoYHjga7mlbDlrZdcbiAgICAgICAgICAgICAgICBpZihkYXRlQXJyYXkgIT09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgeWVhckluZGV4ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vbnRoSW5kZXggPSAyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF5SW5kZXggPSAzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZUZvcm1hdHRlZD1gJHtkYXRlQXJyYXlbeWVhckluZGV4XX0tJHtkYXRlQXJyYXlbbW9udGhJbmRleF19LSR7ZGF0ZUFycmF5W2RheUluZGV4XX1gXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlRm9ybWF0dGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9VVEPmmYLliLvjgafjgarjgYTlgKTjgpLmjL/lhaXjgZfjgZ/jgYTloLTlkIjjgIHlubTjgIHmnIjjgIHml6XjgpLmir3lh7rjgZfjgIHmnIgt5bm0LeaXpeOBruW9ouW8j+WkieaPm1xuICAgICAgICAgICAgbGV0IGRhdGVBcnJheT1pbnB1dFZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezEsMn0pLShcXGR7MSwyfSkkLyk7Ly805qGB44Gu5pWw5a2XLTHvvZ4y5qGB44Gu5pWw5a2XLTHvvZ4y5qGB44Gu5pWw5a2XXG4gICAgICAgICAgICBpZihkYXRlQXJyYXkgIT09IG51bGwpe1xuICAgICAgICAgICAgICAgIGxldCB5ZWFySW5kZXggPSAxO1xuICAgICAgICAgICAgICAgIGxldCBtb250aEluZGV4ID0gMjtcbiAgICAgICAgICAgICAgICBsZXQgZGF5SW5kZXggPSAzO1xuICAgICAgICAgICAgICAgIGxldCBkYXRlRm9ybWF0dGVkPWAke2RhdGVBcnJheVt5ZWFySW5kZXhdfS0ke2RhdGVBcnJheVttb250aEluZGV4XX0tJHtkYXRlQXJyYXlbZGF5SW5kZXhdfWBcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZUZvcm1hdHRlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pel5LuY5b2i5byP44Gn44GZ44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pel5LuY5b2i5byP44Gn44GZ44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOODleOCo+ODvOODq+ODieOCv+OCpOODlyjjg6njgrjjgqrjg5zjgr/jg7Pjg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg7vopIfmlbDpgbjmip7jg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Mp44Gu6YG45oqe6IKi44Gr5a2Y5Zyo44GZ44KL5YCk44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5YCk44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAqL1xuICAgIGNoZWNrSW5wdXRPcHRpb24oaW5wdXRWYWx1ZSA6c3RyaW5nLGZpZWxkT3B0aW9ucyA6c3RyaW5nIHwgdW5kZWZpbmVkLGZpZWxkQ29kZSA6c3RyaW5nLGV2ZW50IDphbnkpOiBib29sZWFuIHtcblxuICAgICAgICAvL+WFpeWKm+WApOOBjOmBuOaKnuiCouOBq+WtmOWcqOOBmeOCi+WApOOBi+ODgeOCp+ODg+OCr+OBl+OAgeWtmOWcqOOBl+OBn+OCiXRydWXjgpLov5TjgZlcbiAgICAgICAgaWYoZmllbGRPcHRpb25zICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBPYmplY3Qua2V5cyhmaWVsZE9wdGlvbnMpO1xuICAgICAgICAgICAgZm9yKHZhciBvcHRpb25zSW5kZXggaW4gb3B0aW9ucyl7XG4gICAgICAgICAgICAgICAgaWYob3B0aW9uc1tvcHRpb25zSW5kZXhdID09PSBpbnB1dFZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ109XCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuOBq+OBr+OAgeWtmOWcqOOBl+OBquOBhOWApOOCkuaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuOBq+OBr+OAgeWtmOWcqOOBl+OBquOBhOWApOOCkuaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhaXlipvlgKTjgYzjg5XjgqPjg7zjg6vjg4njgr/jgqTjg5co44Om44O844K244O86YG45oqeKeOBp+OAgeODpuODvOOCtuODvOaDheWgseOBq+WtmOWcqOOBmeOCi+WApOOBi+ODgeOCp+ODg+OCr+OBmeOCi+mWouaVsFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXG4gICAgICogQHJldHVybiB7c3RyaW5nIHwgYm9vbGVhbn0g5YWl5Yqb5YCk44GM55m76Yyy44GV44KM44Gm44GE44KL44Om44O844K244O85oOF5aCx44GL44KJ6KaL44Gk44GL44Gj44Gf5aC05ZCI44CBdHJ1ZeOCkui/lOOBl+OAgeimi+OBpOOBi+OCieOBquOBi+OBo+OBn+WgtOWQiOOAgWZhbHNl44KS6L+U44GZXG4gICAgICovXG4gICAgYXN5bmMgc2V0SW5wdXRVc2VyKGlucHV0VmFsdWUgOmFueSk6IFByb21pc2U8YW55IHwgYm9vbGVhbj57XG5cbiAgICAgICAgLy/jg6bjg7zjgrbjg7zlkI3jgpLmoLzntI3jgZnjgovlpInmlbBcbiAgICAgICAgbGV0IHVzZXJzTmFtZSA9IFtdO1xuXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8vQVBJ44Gn44Om44O844K244O85oOF5aCx44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICBjb25zdCByZXNwID1hd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoJy92MS91c2VycycsIHRydWUpLCAnR0VUJywge2NvZGVzOiBpbnB1dFZhbHVlLmpvaW4oJywnKX0pXG4gICAgICAgICAgICBsZXQgdXNlcnNJbmZvID0gcmVzcC51c2VycztcblxuICAgICAgICAgICAgaWYgKHVzZXJzSW5mby5sZW5ndGggIT09IGlucHV0VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8v5YWl5Yqb44GV44KM44Gf44Ot44Kw44Kk44Oz5ZCN44GM44Om44O844K244O85oOF5aCx44Gr55m76Yyy44GV44KM44Gm44GE44KL5aC05ZCI44CB44Gd44Gu44Om44O844K244O85ZCN44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleFVzZXJzSW5mbyBpbiB1c2Vyc0luZm8pIHtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGluZGV4SW5wdXRVc2VyIGluIGlucHV0VmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICBpZih1c2Vyc0luZm9baW5kZXhVc2Vyc0luZm9dLmNvZGUgPT09IGlucHV0VmFsdWVbaW5kZXhJbnB1dFVzZXJdKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzTmFtZS5wdXNoKHVzZXJzSW5mb1tpbmRleFVzZXJzSW5mb10ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8v44Om44O844K244O85ZCN44GM5Y+W5b6X44Gn44GN44Gf5aC05ZCI44CB44Ot44Kw44Kk44Oz5ZCN44Go44Om44O844K244O85ZCN44KS44OV44Kj44O844Or44OJ44Gr44K744OD44OI44GZ44KLXG4gICAgICAgICAgICBpZih1c2Vyc05hbWUgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNlcnNOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOODleOCo+ODvOODq+ODieOCv+OCpOODlyjntYTnuZTpgbjmip4p44Gn44CB57WE57mU5oOF5aCx44Gr5a2Y5Zyo44GZ44KL5YCk44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBib29sZWFufSDlhaXlipvlgKTjgYznmbvpjLLjgZXjgozjgabjgYTjgovntYTnuZTmg4XloLHjgYvjgonopovjgaTjgYvjgaPjgZ/loLTlkIjjgIF0cnVl44KS6L+U44GX44CB6KaL44Gk44GL44KJ44Gq44GL44Gj44Gf5aC05ZCI44CBZmFsc2XjgpLov5TjgZlcbiAgICAgKi9cbiAgICBhc3luYyBzZXRJbnB1dE9yZ2FuaXphdGlvbihpbnB1dFZhbHVlIDpzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IGJvb2xlYW4+e1xuXG4gICAgICAgIC8v57WE57mU5ZCN44KS5qC857SN44GZ44KL5aSJ5pWwXG4gICAgICAgIGxldCBvcmdhbml6YXRpb25OYW1lO1xuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25zSW5mb0NvbHVtbkluZGV4PTA7XG5cbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy9BUEnjgafntYTnuZTmg4XloLHjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPWF3YWl0IGtpbnRvbmUuYXBpKGtpbnRvbmUuYXBpLnVybCgnL3YxL29yZ2FuaXphdGlvbnMuanNvbicsIHRydWUpLCAnR0VUJywge2NvZGVzOltpbnB1dFZhbHVlIF19KVxuXG4gICAgICAgICAgICAvL+WFpeWKm+OBleOCjOOBn+e1hOe5lOOCs+ODvOODieOBjOe1hOe5lOaDheWgseOBq+eZu+mMsuOBleOCjOOBpuOBhOOCi+WgtOWQiOOAgeOBneOBrue1hOe5lOWQjeOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgICAgIGlmIChyZXNwLm9yZ2FuaXphdGlvbnNbb3JnYW5pemF0aW9uc0luZm9Db2x1bW5JbmRleF0uY29kZSA9PT0gaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25OYW1lPXJlc3Aub3JnYW5pemF0aW9uc1tvcmdhbml6YXRpb25zSW5mb0NvbHVtbkluZGV4XS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/ntYTnuZTlkI3jgYzlj5blvpfjgafjgY3jgZ/loLTlkIjjgIHntYTnuZTjgrPjg7zjg4njgajntYTnuZTlkI3jgpLjg5XjgqPjg7zjg6vjg4njgavjgrvjg4Pjg4jjgZnjgotcbiAgICAgICAgICAgIGlmKG9yZ2FuaXphdGlvbk5hbWUgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmdhbml6YXRpb25OYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOODleOCo+ODvOODq+ODieOCv+OCpOODlyjjgrDjg6vjg7zjg5fpgbjmip4p44Gn44CB44Kw44Or44O844OX5oOF5aCx44Gr5a2Y5Zyo44GZ44KL5YCk44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBib29sZWFufSDlhaXlipvlgKTjgYznmbvpjLLjgZXjgozjgabjgYTjgovjgrDjg6vjg7zjg5fmg4XloLHjgYvjgonopovjgaTjgYvjgaPjgZ/loLTlkIjjgIF0cnVl44KS6L+U44GX44CB6KaL44Gk44GL44KJ44Gq44GL44Gj44Gf5aC05ZCI44CBZmFsc2XjgpLov5TjgZlcbiAgICAgKi9cbiAgICBhc3luYyBzZXRJbnB1dEdyb3VwKGlucHV0VmFsdWUgOnN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgYm9vbGVhbj57XG5cbiAgICAgICAgLy/jgrDjg6vjg7zjg5flkI3jgpLmoLzntI3jgZnjgovlpInmlbBcbiAgICAgICAgbGV0IGdyb3Vwc05hbWU7XG4gICAgICAgIGNvbnN0IGdyb3Vwc0luZm9Db2x1bW5JbmRleD0wO1xuXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8vQVBJ44Gn44Kw44Or44O844OX5oOF5aCx44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICBjb25zdCByZXNwID1hd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoJy92MS9ncm91cHMuanNvbicsIHRydWUpLCAnR0VUJywge2NvZGVzOltpbnB1dFZhbHVlIF19KVxuXG4gICAgICAgICAgICAvL+WFpeWKm+OBleOCjOOBn+OCsOODq+ODvOODl+OCs+ODvOODieOBjOOCsOODq+ODvOODl+aDheWgseOBq+eZu+mMsuOBleOCjOOBpuOBhOOCi+WgtOWQiOOAgeOBneOBruOCsOODq+ODvOODl+WQjeOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgaWYgKHJlc3AuZ3JvdXBzW2dyb3Vwc0luZm9Db2x1bW5JbmRleF0uY29kZSA9PT0gaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGdyb3Vwc05hbWU9cmVzcC5ncm91cHNbZ3JvdXBzSW5mb0NvbHVtbkluZGV4XS5uYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+OCsOODq+ODvOODl+WQjeOBjOWPluW+l+OBp+OBjeOBn+WgtOWQiOOAgeOCsOODq+ODvOODl+OCs+ODvOODieOBqOOCsOODq+ODvOODl+WQjeOCkuODleOCo+ODvOODq+ODieOBq+OCu+ODg+ODiOOBmeOCi1xuICAgICAgICAgICAgaWYoZ3JvdXBzTmFtZSA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWNhdGNoe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyb3Vwc05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Om44O844K244O844Kq44OW44K444Kn44Kv44OI44KS5oy/5YWl44GZ44KL5aC05ZCI44CB5oy/5YWl5YWI44OV44Kj44O844Or44OJ44Gr44KI44Gj44Gm44CB6YGp5YiH44Gq44Kq44OW44K444Kn44Kv44OI44Gu5YCk44KS5Y+W5b6X44GX44CB44K744OD44OI44GZ44KLXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLeWFpeWKm+OBleOCjOOBn+WApFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3RWYWx1ZSAt44Kq44OW44K444Kn44Kv44OI5aSJ5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkVHlwZSAt5oy/5YWl5YWI44OV44Kj44O844Or44OJ44K/44Kk44OXXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkQ29kZSAt5oy/5YWl5YWI44OV44Kj44O844Or44OJ44K/44Kk44OXXG4gICAgICogQHJldHVybiB7c3RyaW5nfSAt5oy/5YWl5YWI44OV44Kj44O844Or44OJ44Gr44KI44Gj44Gm44CB44Ot44Kw44Kk44Oz44Om44O844K244O844Kq44OW44K444Kn44Kv44OI44Gu5L2V44Gu5YCk44KS6L+U44GZ44GL44CB5aSJ44KP44KLXG4gICAgICovXG4gICAgc2V0VmFsdWVPZlVzZXJPYmplY3QoaW5wdXRWYWx1ZSA6YW55LG9iamVjdFZhbHVlIDphbnksZmllbGRUeXBlIDogYW55LGZpZWxkQ29kZSA6IGFueSk6IGFueXtcblxuICAgICAgICAvL+WkieaVsOOBruWApFxuICAgICAgICBsZXQgdmFyaWFibGVWYWx1ZSA9IFtdO1xuXG4gICAgICAgIC8v44Om44O844K244O844Kq44OW44K444Kn44Kv44OI5oy/5YWl44Gn44GN44Gq44GE44OV44Kj44O844Or44OJ77yI5pel5LuY44CB5pWw5YCk77yJ44KS6YG45oqe44GX44Gm44GE44KL5aC05ZCI44CB44Ko44Op44O844KS5Ye644GZXG4gICAgICAgIGlmKGZpZWxkVHlwZSA9PT0gXCJOVU1CRVJcIiB8fCBmaWVsZFR5cGUgPT09IFwiREFURVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFVElNRVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJUSU1FXCIpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavjga/jgIHjg6bjg7zjgrbjg7zmg4XloLHjgpLmjL/lhaXjgafjgY3jgb7jgZvjgpPjgILlh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvL+ODpuODvOOCtuODvOmBuOaKnuODleOCo+ODvOODq+ODieOBq+aMv+WFpeaZguOAgeODpuODvOOCtuODvOOCquODluOCuOOCp+OCr+ODiOOBrmNvZGXjgpLku6PlhaXjgZnjgotcbiAgICAgICAgaWYoZmllbGRUeXBlID09PSAnVVNFUl9TRUxFQ1QnKXtcbiAgICAgICAgICAgIC8v5aSJ5pWw44Gu5YCk5Y+W5b6XXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheShvYmplY3RWYWx1ZSkpe1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZS5jb2RlKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8b2JqZWN0VmFsdWUubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZVtpXS5jb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAvL+ODpuODvOOCtuODvOmBuOaKnuODleOCo+ODvOODq+ODieS7peWkluOBq+aMv+WFpeaZguOAgeODpuODvOOCtuODvOOCquODluOCuOOCp+OCr+ODiOOBruWApOOBruaMh+WumuOBjOOBguOCjOOBsOOAgeOBneOBruWApOOCkuS7o+WFpeOBmeOCi1xuICAgICAgICAgICAgaWYoaW5wdXRWYWx1ZS5pbmNsdWRlcygnLm5hbWUnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuZW1haWwnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuZW1wbG95ZWVOdW1iZXInKVxuICAgICAgICAgICAgICAgIHx8IGlucHV0VmFsdWUuaW5jbHVkZXMoJy5leHRlbnNpb25OdW1iZXInKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuaWQnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuaXNHdWVzdCcpfHwgaW5wdXRWYWx1ZS5pbmNsdWRlcygnLnRpbWV6b25lJylcbiAgICAgICAgICAgICAgICB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcubGFuZ3VhZ2UnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcubW9iaWxlUGhvbmUnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcucGhvbmUnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcudXJsJykpe1xuXG4gICAgICAgICAgICAgICAgLy/lgKTjgpLmjL/lhaXjgZnjgovlpInmlbDlkI3lj5blvpdcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0UHJvcGVydHlOYW1lID0gaW5wdXRWYWx1ZS5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgICAgICAgIGlmKCFBcnJheS5pc0FycmF5KG9iamVjdFZhbHVlKSl7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZVtvYmplY3RQcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxvYmplY3RWYWx1ZS5sZW5ndGg7aSsrKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZVtpXVtvYmplY3RQcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/jg6bjg7zjgrbjg7zpgbjmip7jg5XjgqPjg7zjg6vjg4nku6XlpJbjgavmjL/lhaXmmYLjgIHjg6bjg7zjgrbjg7zjgqrjg5bjgrjjgqfjgq/jg4jjga7lgKTjga7mjIflrprjgYzjgarjgZHjgozjgbDjgIFjb2Rl44KS5Luj5YWl44GZ44KLXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheShvYmplY3RWYWx1ZSkpe1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlLnB1c2gob2JqZWN0VmFsdWUuY29kZSk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8b2JqZWN0VmFsdWUubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlLnB1c2gob2JqZWN0VmFsdWVbaV0uY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih2YXJpYWJsZVZhbHVlID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lpInmlbDjga/jgIHnhKHlirnjgarlhaXlipvlvaLlvI/jgafjgZnjgIJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFyaWFibGVWYWx1ZTtcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGVcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG5cbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2ZpZWxkJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSAmJiAhKCd2YWx1ZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkQ29sdW1uSW5kZXg9MTtcblxuICAgICAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPjgafpgbjmip7jgZXjgozjgZ/jg5XjgqPjg7zjg6vjg4lcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkPXRoaXMuYWN0aW9uUHJvcHNbZmllbGRDb2x1bW5JbmRleF0ucHJvcHMubW9kZWxWYWx1ZS50eXBlO1xuXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+OBruWApOOCkuaMv+WFpeOBmeOCi+ODleOCo+ODvOODq+ODieOBjOacqumBuOaKnuOBruWgtOWQiOOAgeS+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAgICAgICAgaWYoZmllbGQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBp+OAgeWApOOCkuaMv+WFpeOBmeOCi+ODleOCo+ODvOODq+ODieOBjOaMh+WumuOBleOCjOOBpuOBhOOBquOBi+OBo+OBn+OBn+OCgeOAgeWHpueQhuOBjOS4reaWreOBleOCjOOBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPjga7lgKTjgpLmjL/lhaXjgZnjgovjg5XjgqPjg7zjg6vjg4njgYzpnZ7lr77lv5zjg5XjgqPjg7zjg6vjg4njga7loLTlkIjjgIHkvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgICAgICAgIC8v5re75LuY44OV44Kh44Kk44Or44O744OG44O844OW44Or44O744Kr44OG44K044Oq44O844O744K544OG44O844K/44K544O75L2c5oiQ6ICF44O75pu05paw6ICF44O75L2c5qWt6ICF44O744Oq44OT44K444On44Oz55Wq5Y+344O744Os44Kz44O844OJ55Wq5Y+344O744Os44Kz44O844OJSUTjg7voqIjnrpfjg7vkvZzmiJDml6XmmYLjg7vmm7TmlrDml6XmmYLjg5XjgqPjg7zjg6vjg4njgYzpgbjmip7jgZXjgozjgabjgYTjgovloLTlkIjjgIHkvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgICAgICAgIGlmKGZpZWxkID09PSBcIkZJTEVcIiB8fCBmaWVsZCA9PT0gXCJTVUJUQUJMRVwiIHx8IGZpZWxkID09PSBcIkNBVEVHT1JZXCIgfHwgZmllbGQgPT09IFwiU1RBVFVTXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgZmllbGQgPT09IFwiU1RBVFVTX0FTU0lHTkVFXCIgfHwgZmllbGQgPT09IFwiQ1JFQVRPUlwiIHx8IGZpZWxkID09PSBcIk1PRElGSUVSXCIgfHwgZmllbGQgPT09IFwiX19SRVZJU0lPTl9fXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkID09PSBcIlJFQ09SRF9OVU1CRVJcInx8IGZpZWxkID09PSBcIl9fSURfX1wiIHx8IGZpZWxkID09PVwiQ0FMQ1wiIHx8IGZpZWxkID09PSBcIkNSRUFURURfVElNRVwiIHx8IGZpZWxkID09PSBcIlVQREFURURfVElNRVwiICl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gn44CB6YG45oqe44GV44KM44Gf44OV44Kj44O844Or44OJ44Gv44CB5YCk44KS5oy/5YWl44GZ44KL44Kz44Oz44Od44O844ON44Oz44OI44Gn44Gv6Z2e5a++5b+c44Gu44OV44Kj44O844Or44OJ44Gu44Gf44KB44CB5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+aXouWumuOBruODl+ODreODkeODhuOCo+OBruOCpOODs+OCv+ODvOODleOCp+ODvOOCueOBuOWkieaPm+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUluc2VydFZhbHVlUHJvcHM7XG5cbiAgICAgICAgICAgIC8v44OX44Ot44OR44OG44Kj44Gu5oy/5YWl44GZ44KL5YCk44KS5Y+W5b6XXG4gICAgICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IHRoaXMucHJvcHMudmFsdWU7XG4gICAgICAgICAgICAvL+ODleOCo+ODvOODq+ODieOBrueorumhnuOCkuWPluW+l1xuICAgICAgICAgICAgY29uc3QgZmllbGRUeXBlID0gdGhpcy5wcm9wcy5maWVsZC50eXBlO1xuICAgICAgICAgICAgLy/jg5XjgqPjg7zjg6vjg4njgYzlv4XpoIjpoIXnm67jgarjga7jgYvlj5blvpdcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVxdWlyZWQ9dGhpcy5wcm9wcy5maWVsZC5yZXF1aXJlZDtcbiAgICAgICAgICAgIC8v5oy/5YWl44GZ44KL44OV44Kj44O844Or44OJ44Gu44Kz44O844OJ44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCBmaWVsZENvZGU9dGhpcy5wcm9wcy5maWVsZC5jb2RlO1xuICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjga7lvaLlvI/vvIjmiYvlhaXlipvjgYvlpInmlbDvvInjgpLlj5blvpdcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFZhbHVlVHlwZT10aGlzLnByb3BzLnNob3c7XG4gICAgICAgICAgICAvL+ODqeOCuOOCquODnOOCv+ODs+ODu+ODgeOCp+ODg+OCr+ODnOODg+OCr+OCueODu+ikh+aVsOmBuOaKnuODu+ODieODreODg+ODl+ODgOOCpuODs+OBrumBuOaKnuiCouOCkuWPluW+l1xuICAgICAgICAgICAgbGV0IGZpZWxkT3B0aW9ucyA9dGhpcy5wcm9wcy5maWVsZC5vcHRpb25zO1xuICAgICAgICAgICAgLy/lpInmlbDjga7lgKTjgpLmoLzntI3jgZnjgotcbiAgICAgICAgICAgIGxldCB2YXJpYWJsZVZhbHVlIDphbnk7XG4gICAgICAgICAgICAvL+aMv+WFpeOBmeOCi+WApOOCkuagvOe0jeOBmeOCi1xuICAgICAgICAgICAgbGV0IGZpZWxkVmFsdWVBcnJheSA9IFtdO1xuICAgICAgICAgICAgbGV0IG5vdElucHV0RXJyb3I7XG4gICAgICAgICAgICAvL2NvbnRleHTjgavlrZjlnKjjgZnjgovlpInmlbDlkI3jgpLmoLzntI3jgZnjgotcbiAgICAgICAgICAgIGxldCBjb250ZXh0SGFzVmFyaWFibGVzTmFtZXM7XG5cbiAgICAgICAgICAgIC8v5aSJ5pWw44Gu5aC05ZCI44CB5YCk44GM5Y+W5b6X44Gn44GN44KL44GL44OB44Kn44OD44KvXG4gICAgICAgICAgICBpZihpbnNlcnRWYWx1ZVR5cGUgPT09IFwi5aSJ5pWwXCIpe1xuXG4gICAgICAgICAgICAgICAgLy/lpInmlbDjga7lgKTjgpLlkbzjgbPlh7rjgZfjgabku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICBjb25zdCBnZXRDb250ZXh0VmFyQnlQYXRoID0gKG9iajogYW55LCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoXCIuXCIpLnJlZHVjZSgobywgaykgPT4gKG8gfHwge30pW2tdLCBvYmopO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvL2NvbnRleHTjgavlrZjlnKjjgZnjgovlpInmlbDlkI3jgpLlhajjgablj5blvpfjgZnjgotcbiAgICAgICAgICAgICAgICBjb250ZXh0SGFzVmFyaWFibGVzTmFtZXMgPSBPYmplY3Qua2V5cyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgICAgICAgLy9jb250ZXh044Gr5aSJ5pWw44GMMeOBpOOCguWtmOWcqOOBl+OBquOBhOWgtOWQiOOAgeOCqOODqeODvOOCkuWHuuOBmVxuICAgICAgICAgICAgICAgIGlmKGNvbnRleHRIYXNWYXJpYWJsZXNOYW1lcy5sZW5ndGggPT09IDApe1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+WkieaVsOOBr+OAgeWtmOWcqOOBl+OBquOBhOOBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRWYXJpYWJsZXNOYW1lO1xuICAgICAgICAgICAgICAgIC8v5YWl5Yqb5YCk44GM44Kq44OW44K444Kn44Kv44OI5aSJ5pWw44Gu5aSJ5pWw5ZCN44Gn44GC44KK44CB44OX44Ot44OR44OG44Kj44Gu5oyH5a6a44GM44GC44KL5aC05ZCI44CB5aSJ5pWw5ZCN44Gu44G/5Y+W5b6XXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAnLifjgojjgorliY3jga7mloflrZfjgpLmir3lh7pcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYXJpYWJsZXNOYW1lID0gZmllbGRWYWx1ZS5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICcuJ+OBjOWQq+OBvuOCjOOBpuOBhOOBquOBhOWgtOWQiOOAgeOBneOBruOBvuOBvui/lOOBmVxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhcmlhYmxlc05hbWUgPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBpbnB1dFZhcmlhYmxlc0V4aXN0O1xuICAgICAgICAgICAgICAgIC8v5YWl5Yqb44GV44KM44Gf5aSJ5pWw5ZCN44GM44CBY29udGV4dOOBruWkieaVsOOBq+WtmOWcqOOBmeOCi+WgtOWQiOOAgWlucHV0VmFyaWFibGVzRXhpc3Tjgat0cnVl44Gr5Luj5YWl44GZ44KLXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTwgY29udGV4dEhhc1ZhcmlhYmxlc05hbWVzLmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZihpbnB1dFZhcmlhYmxlc05hbWUgPT09IGNvbnRleHRIYXNWYXJpYWJsZXNOYW1lc1tpXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhcmlhYmxlc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v5YWl5Yqb44GV44KM44Gf5aSJ5pWw5ZCN44GM44CBY29udGV4dOOBruWkieaVsOOBq+WtmOWcqOOBl+OBquOBhOWgtOWQiOOAgeOCqOODqeODvOOCkuihqOekuuOBmeOCi1xuICAgICAgICAgICAgICAgIGlmKCFpbnB1dFZhcmlhYmxlc0V4aXN0KXtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/lpInmlbDjga/jgIHlrZjlnKjjgZfjgarjgYTjgZ/jgoHjgIHlh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoaW5wdXRWYXJpYWJsZXNOYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgLy/lhaXlipvjgZXjgozjgZ/lpInmlbDlkI3jga7lgKTjgpLlj5blvpdcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IGdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMsaW5wdXRWYXJpYWJsZXNOYW1lKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v5paH5a2X5YiX5Z6L44Gu44OV44Kj44O844Or44OJ5Lul5aSW44Gr44CB56m655m95paH5a2X44Gu5aSJ5pWw44Gu5YCk44KS5oy/5YWl44GZ44KL5aC05ZCI44CB44Ko44Op44O844KS5Ye644GZXG4gICAgICAgICAgICAgICAgaWYodmFyaWFibGVWYWx1ZSA9PT0gXCJcIiB8fCB2YXJpYWJsZVZhbHVlID09PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoZmllbGRUeXBlID09PSBcIk5VTUJFUlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVUSU1FXCIgfHwgZmllbGRUeXBlID09PSBcIlRJTUVcIiB8fCBmaWVsZFR5cGUgPT09IFwiVVNFUl9TRUxFQ1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmllbGRUeXBlID09PSBcIk9SR0FOSVpBVElPTl9TRUxFQ1RcIiB8fCBmaWVsZFR5cGUgPT09IFwiR1JPVVBfU0VMRUNUXCIgfHwgZmllbGRUeXBlID09PSBcIlJBRElPX0JVVFRPTlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEUk9QX0RPV05cIiB8fCBmaWVsZFR5cGUgPT09IFwiQ0hFQ0tfQk9YXCIgfHwgZmllbGRUeXBlID09PSBcIk1VTFRJX1NFTEVDVFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf5aSJ5pWw44Gv44CB5YCk44GMbnVsbOOBruOBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgLy/lpInmlbDjgYzjgqrjg5bjgrjjgqfjgq/jg4jjga7loLTlkIjjgIHjg5fjg63jg5Hjg4bjgqPjgpLlj5blvpfjgZfjgIHkvZXjga7jgqrjg5bjgrjjgqfjgq/jg4jjgYvliKTmlq3jgZnjgotcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFyaWFibGVWYWx1ZSA9PT0gJ29iamVjdCcpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0UHJvcGVydGllcz1bXVxuXG4gICAgICAgICAgICAgICAgICAgIGlmKHZhcmlhYmxlVmFsdWUubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RQcm9wZXJ0aWVzPU9iamVjdC5rZXlzKHZhcmlhYmxlVmFsdWVbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh2YXJpYWJsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vKOODreOCsOOCpOODs+ODpuODvOOCtuODvOODu+WApOWPluW+l+OBruOCs+ODs+ODneODvOODjeODs+ODiOOBi+OCieOBrinjg6bjg7zjgrbjg7zjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjL/lhaXmmYLjgIHmjL/lhaXlhYjjg5XjgqPjg7zjg6vjg4njgavjgojjgaPjgabjgIHlgKTjgpLmjIflrprjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgaWYob2JqZWN0UHJvcGVydGllcy5pbmNsdWRlcygnY29kZScpICYmIG9iamVjdFByb3BlcnRpZXMuaW5jbHVkZXMoJ25hbWUnKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlPXRoaXMuc2V0VmFsdWVPZlVzZXJPYmplY3QoZmllbGRWYWx1ZSx2YXJpYWJsZVZhbHVlLGZpZWxkVHlwZSxmaWVsZENvZGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+ODpuODvOOCtuODvOOCquODluOCuOOCp+OCr+ODiOOBi+OCieWPluW+l+OBl+OBn+WApOOCkuOAgWZpZWxkVmFsdWVBcnJheeOBq+S7o+WFpVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YXJpYWJsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZUFycmF5LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIC8v44Kq44OW44K444Kn44Kv44OI5aSJ5pWw44Gn44Gq44GE5aC05ZCI44CB5aSJ5pWw44KSZmllbGRWYWx1ZUFycmF544Gr5Luj5YWlXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUgPSBjb250ZXh0LnZhcmlhYmxlc1tmaWVsZFZhbHVlXVxuICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlQXJyYXlbMF0gPSB2YXJpYWJsZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v5aSJ5pWw44GMZmllbGRWYWx1ZUFycmF544Gr5Luj5YWl44Gn44GN44Gq44GL44Gj44Gf5aC05ZCI44CB44Ko44Op44O844KS5Ye644GZXG4gICAgICAgICAgICAgICAgaWYoZmllbGRWYWx1ZUFycmF5ID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WkieaVsOOBr+OAgeeEoeWKueOBquWFpeWKm+W9ouW8j+OBp+OBmeOAglwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL+WkieaVsOOBruWApOOBq+OCqOODqeODvO+8iOepuuaWh+Wtl+ODu+epuueZveaWh+Wtl+OBrua3t+WFpe+8ieOBjOOBquOBhOOBk+OBqOOCkuODgeOCp+ODg+OCr+OBmeOCi1xuICAgICAgICAgICAgICAgIG5vdElucHV0RXJyb3I9dGhpcy5jaGVja1ZhcmlhYmxlVmFsdWVCbGFuayhmaWVsZFR5cGUsZmllbGRWYWx1ZUFycmF5LGZpZWxkQ29kZSxmaWVsZFJlcXVpcmVkLGV2ZW50KTtcblxuICAgICAgICAgICAgLy/miYvlhaXlipvjga7lgKTjgpLmjL/lhaXjgZnjgovloLTlkIjjgIHmjL/lhaXjgZnjgovlgKTjgpJmaWVsZEFycmF544Gr5Luj5YWlXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlQXJyYXkucHVzaChmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAvL+WFpeWKm+OCqOODqeODvO+8iOepuueZveaWh+Wtl+OBrua3t+WFpe+8ieOBjOOBquOBhOOBk+OBqOOCkuODgeOCp+ODg+OCr1xuICAgICAgICAgICAgICAgIG5vdElucHV0RXJyb3I9dGhpcy5jaGVja0lucHV0VmFsdWVCbGFuayhmaWVsZFR5cGUsZmllbGRWYWx1ZSxmaWVsZENvZGUsZmllbGRSZXF1aXJlZCxldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8v5b2i5byP5aSJ5o+b44CB5Z6L5aSJ5o+b44GX44Gf5YCk44KS5qC857SN44GZ44KL5aSJ5pWwXG4gICAgICAgICAgICBsZXQgY29ycmVjdEZvcm1hdHRlZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy/lvaLlvI/lpInmj5vjgIHlnovlpInmj5vjgZfjgZ/lgKTjgpLmoLzntI3jgZnjgovphY3liJdcbiAgICAgICAgICAgIGxldCBjb3JyZWN0VmFsdWVzIDphbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBrue1kOaenOOBjHRydWXjgIHlhaXlipvjgqjjg6njg7zvvIjnqbrnmb3mloflrZfjga7mt7flhaXvvInjgYzjgarjgYTloLTlkIjjgIHmjL/lhaXjgZnjgovlgKTjgpLjg5XjgqPjg7zjg6vjg4njgr/jgqTjg5fliKXjgavjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgICAgICAgIGlmKG5vdElucHV0RXJyb3Ipe1xuXG4gICAgICAgICAgICAgICAgLy/mloflrZfliJflnovjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICBpZihmaWVsZFR5cGUgPT09IFwiU0lOR0xFX0xJTkVfVEVYVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJNVUxUSV9MSU5FX1RFWFRcIiB8fCBmaWVsZFR5cGUgPT09IFwiUklDSF9URVhUXCIgfHwgZmllbGRUeXBlID09PSBcIkxJTktcIiApe1xuICAgICAgICAgICAgICAgICAgICBjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgPSBmaWVsZFZhbHVlQXJyYXkuam9pbignLCcpO1xuXG4gICAgICAgICAgICAgICAgLy/mlbDlgKTlnovjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIHmlbDlgKTlnovjgavlnovlpInmj5vjgZfjgaZjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiTlVNQkVSXCIgKXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0TnVtYmVyKGZpZWxkVmFsdWVBcnJheVswXSxmaWVsZENvZGUsZXZlbnQpKXsvL+WFpeWKm+WApOODgeOCp+ODg+OCr1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdEZvcm1hdHRlZFZhbHVlID0gTnVtYmVyKGZpZWxkVmFsdWVBcnJheVswXSk7Ly/lnovlpInmj5tcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/ml6Xku5jjg7vml6XmmYLlnovjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIHmjIflrprjga7ml6Xku5jjg7vml6XmmYLjgavlvaLlvI/lpInmj5vjgZfjgaZjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiREFURVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFVElNRVwiICl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuY2hlY2tJbnB1dERhdGUoZmllbGRWYWx1ZUFycmF5WzBdLGZpZWxkQ29kZSxldmVudCkpey8v5YWl5Yqb5YCk44OB44Kn44OD44KvXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuY2hhbmdlRGF0ZUZvcm1hdChmaWVsZFZhbHVlQXJyYXlbMF0sZmllbGRUeXBlLGZpZWxkQ29kZSxldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1hdHRlZERhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdHRlZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/mmYLliLvjg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiVElNRVwiKXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0VGltZShmaWVsZFZhbHVlQXJyYXlbMF0sZmllbGRDb2RlLGV2ZW50KSl7Ly/lhaXlipvlgKTjg4Hjgqfjg4Pjgq9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZpZWxkVmFsdWVBcnJheVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/jg6njgrjjgqrjg5zjgr/jg7Pjg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Pjga7jg5XjgqPjg7zjg6vjg4njga7pgbjmip7ogqLjgajlhaXlipvlgKTjgYzkuIDoh7TjgZfjgZ/loLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiUkFESU9fQlVUVE9OXCIgfHwgZmllbGRUeXBlID09PSBcIkRST1BfRE9XTlwiKXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0T3B0aW9uKGZpZWxkVmFsdWVBcnJheVswXSxmaWVsZE9wdGlvbnMsZmllbGRDb2RlLGV2ZW50KSl7Ly/lhaXlipvlgKTjg4Hjgqfjg4Pjgq9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZpZWxkVmFsdWVBcnJheVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/jg4Hjgqfjg4Pjgq/jg5zjg4Pjgq/jgrnjg7vopIfmlbDpgbjmip7jga7jg5XjgqPjg7zjg6vjg4njga7pgbjmip7ogqLjgajlhaXlipvlgKTjgYzkuIDoh7TjgZfjgZ/loLTlkIjjgIFjb3JyZWN0VmFsdWVz44Gu6YWN5YiX44Gr5Luj5YWl44GZ44KLXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIkNIRUNLX0JPWFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJNVUxUSV9TRUxFQ1RcIiApe1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrSW5wdXRPcHRpb24oZmllbGRWYWx1ZUFycmF5WzBdLGZpZWxkT3B0aW9ucyxmaWVsZENvZGUsZXZlbnQpKXsvL+WFpeWKm+WApOODgeOCp+ODg+OCr1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdFZhbHVlc1swXSA9IGZpZWxkVmFsdWVBcnJheVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/jg6bjg7zjgrbjg7zmg4XloLHjg5XjgqPjg7zjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/lgKTjgYzpganliIfjgarloLTlkIjjgIFjb3JyZWN0VmFsdWVzKOmFjeWIlynjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiVVNFUl9TRUxFQ1RcIil7XG4gICAgICAgICAgICAgICAgICAgIC8v5oy/5YWl44GZ44KL5YCk44GM44Om44O844K244O85oOF5aCx44GL44KJ6KaL44Gk44GL44KM44Gw44CB44Om44O844K244O85ZCN44KS5qC857SNXG4gICAgICAgICAgICAgICAgICAgIGxldCB1c2Vyc05hbWU9YXdhaXQgdGhpcy5zZXRJbnB1dFVzZXIoZmllbGRWYWx1ZUFycmF5KTtcblxuICAgICAgICAgICAgICAgICAgICAvL+ODpuODvOOCtuODvOWQjeOBjOagvOe0jeOBp+OBjeOBpuOBhOOCi+WgtOWQiOOAgeODreOCsOOCpOODs+WQjeOBqOODpuODvOOCtuODvOWQjeOCkmNvcnJlY3RWYWx1ZXPvvIjphY3liJfvvInjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgaWYoIXVzZXJzTmFtZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXT1cIuODpuODvOOCtuODvOmBuOaKnuOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+ODpuODvOOCtuODvOaDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44Om44O844K244O86YG45oqe44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf44Om44O844K244O85oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpbmRleElucHV0VXNlciBpbiBmaWVsZFZhbHVlQXJyYXkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdFZhbHVlcy5wdXNoKHsgY29kZTogZmllbGRWYWx1ZUFycmF5W2luZGV4SW5wdXRVc2VyXSwgbmFtZTogdXNlcnNOYW1lW2luZGV4SW5wdXRVc2VyXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/ntYTnuZTmg4XloLHjg5XjgqPjg7zjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/lgKTjgYzpganliIfjgarloLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiT1JHQU5JWkFUSU9OX1NFTEVDVFwiKXtcbiAgICAgICAgICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgYzntYTnuZTmg4XloLHjgYvjgonopovjgaTjgYvjgozjgbDjgIHntYTnuZTlkI3jgpLmoLzntI1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9yZ2FuaXphdGlvbnM9YXdhaXQgdGhpcy5zZXRJbnB1dE9yZ2FuaXphdGlvbihmaWVsZFZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL+e1hOe5lOWQjeOBjOagvOe0jeOBp+OBjeOBpuOBhOOCi+WgtOWQiOOAgee1hOe5lOOCs+ODvOODieOBqOe1hOe5lOWQjeOCkmNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xuICAgICAgICAgICAgICAgICAgICBpZighb3JnYW5pemF0aW9ucyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXT1cIue1hOe5lOmBuOaKnuODleOCo+ODvOODq+ODieOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+e1hOe5lOaDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi57WE57mU6YG45oqe44OV44Kj44O844Or44OJ44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf57WE57mU5oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZT1beyBjb2RlOiBmaWVsZFZhbHVlLCBuYW1lOiBvcmdhbml6YXRpb25zfV07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v44Kw44Or44O844OX5oOF5aCx44OV44Kj44O844OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf5YCk44GM6YGp5YiH44Gq5aC05ZCI44CBY29ycmVjdEZvcm1hdHRlZFZhbHVl44Gr5Luj5YWl44GZ44KLXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIkdST1VQX1NFTEVDVFwiKXtcbiAgICAgICAgICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgYzjgrDjg6vjg7zjg5fmg4XloLHjgYvjgonopovjgaTjgYvjgozjgbDjgIHjgrDjg6vjg7zjg5flkI3jgpLmoLzntI1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3Vwcz1hd2FpdCB0aGlzLnNldElucHV0R3JvdXAoZmllbGRWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy/jgrDjg6vjg7zjg5flkI3jgYzmoLzntI3jgafjgY3jgabjgYTjgovloLTlkIjjgIHjgrDjg6vjg7zjg5fjgrPjg7zjg4njgajjgrDjg6vjg7zjg5flkI3jgpJjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgaWYoIWdyb3Vwcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXT1cIuOCsOODq+ODvOODl+mBuOaKnuODleOCo+ODvOODq+ODieOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OCsOODq+ODvOODl+aDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44Kw44Or44O844OX6YG45oqe44OV44Kj44O844Or44OJ44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf44Kw44Or44O844OX5oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZT1beyBjb2RlOiBmaWVsZFZhbHVlLCBuYW1lOiBncm91cHN9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0ID0gdGhpcy5nZXRDb25kaXRpb25SZXN1bHQoY29udGV4dCk7XG4gICAgICAgICAgICAvL+S/neWtmOaIkOWKn+OCpOODmeODs+ODiOOBruWgtOWQiOOAgWtpbnRvbmUgYXN5bmMvYXdhaXQg44Gr44KI44KL6Z2e5ZCM5pyf5Yem55CG44Gn44OV44Kj44O844Or44OJ44Gr5YCk44KS5oy/5YWl44GZ44KLXG4gICAgICAgICAgICBpZighZXZlbnQudHlwZT8uaW5jbHVkZXMoJ3N1Y2Nlc3MnKSl7XG5cbiAgICAgICAgICAgICAgICAvL+adoeS7tuW8j+OBrue1kOaenOOBjHRydWXjgYvjgaTmjL/lhaXjgZnjgovlgKTjgYzlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4nvvIjjg6njgrjjgqrjg5zjgr/jg7Pjg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg7vjg4Hjgqfjg4Pjgq/jg5zjg4Pjgq/jgrnjg7vopIfmlbDpgbjmip7jg7vmloflrZfliJfkuIDooYzjg7vmloflrZfliJfopIfmlbDooYzjg7vjg6rjg4Pjg4Hjgqjjg4fjgqPjgr/jg7vmlbDlgKTjg7vml6Xku5jjg7vml6XmmYLjg7vmmYLliLvvvInjgavjgrvjg4Pjg4hcbiAgICAgICAgICAgICAgICBpZihjb25kaXRpb25SZXN1bHQpe1xuICAgICAgICAgICAgICAgICAgICAvL+WApOOCkuato+OBl+OBhOW9ouW8j+OBq+WkieaPm+OBp+OBjeOBn+WgtOWQiOOAgeODleOCo+ODvOODq+ODieOBq+WApOOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAgICAgICAgICAgICAgICBpZihjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy/lgKTjgpLmraPjgZfjgYTlvaLlvI/vvIjphY3liJfvvInjgavlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4njgavlgKTvvIjphY3liJfvvInjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RWYWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1lbHNle1xuXG4gICAgICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgpLmjL/lhaXlhYjjg5XjgqPjg7zjg6vjg4njgavlgKTjgpLjgrvjg4Pjg4jjgZfjgIFraW50b25lQVBJ44Gr44KI44Gj44Gm44Os44Kz44O844OJ5pu05paw44KS6KGM44GGXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gc2V0VXBkYXRlRGF0YShjb25kaXRpb25SZXN1bHQ6Ym9vbGVhbixmaWVsZENvZGU6c3RyaW5nLGV2ZW50OmFueSxjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgOmFueSxjb3JyZWN0VmFsdWVzIDphbnkpIHtcblxuICAgICAgICAgICAgICAgICAgICAvL+WApOOCkuato+OBl+OBhOW9ouW8j+OBq+WkieaPm+OBp+OBjeOBn+WgtOWQiOOAgeODleOCo+ODvOODq+ODieOBq+WApOOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAgICAgICAgICAgICAgICBpZihjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy/lgKTjgpLmraPjgZfjgYTlvaLlvI/vvIjphY3liJfvvInjgavlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4njgavlgKTvvIjphY3liJfvvInjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RWYWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyDmnaHku7bjgYznnJ/jga7loLTlkIjjga7lh6bnkIbjgIFraW50b25lQVBJ44Gr44KI44KL6Z2e5ZCM5pyf5Yem55CG77yI44Os44Kz44O844OJ5pu05paw77yJXG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlRGF0YShmaWVsZENvZGUsZXZlbnQsY29ycmVjdEZvcm1hdHRlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZURhdGEoZmllbGRDb2RlLGV2ZW50LGNvcnJlY3RWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9raW50b25lIGFzeW5jL2F3YWl0IOOBq+OCiOOCi+mdnuWQjOacn+WHpueQhu+8iOODrOOCs+ODvOODieabtOaWsO+8iVxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhdGEoZmllbGRDb2RlOnN0cmluZyxldmVudDphbnksaW5zZXJ0VmFsdWU6YW55KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkUmVjb3JkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogZXZlbnQuYXBwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICBldmVudC5yZWNvcmRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IHtbZmllbGRDb2RlXTp7XCJ2YWx1ZVwiOmluc2VydFZhbHVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0FQSeOBp+ODpuODvOOCtuODvOaDheWgseOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcCA9YXdhaXQga2ludG9uZS5hcGkoa2ludG9uZS5hcGkudXJsKCcvay92MS9yZWNvcmQnLCB0cnVlKSwgJ1BVVCcsIHVwZGF0ZWRSZWNvcmQpXG5cbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8g6Zai5pWw44Gu5ZG844Gz5Ye644GXXG4gICAgICAgICAgICAgICAgc2V0VXBkYXRlRGF0YShjb25kaXRpb25SZXN1bHQsZmllbGRDb2RlLGV2ZW50LGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSxjb3JyZWN0VmFsdWVzKTtcblxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzdWx0PSB7XG4gICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9Y2F0Y2goZXJyb3I6YW55KXtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9dHJ1ZTsvL+asoeOBruODjuODvOODieOBr+WHpueQhuOCkue2muOBkeOCi1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQg5p2h5Lu25byP44KS5a6f6KGM44GZ44KLXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDphbnkpOmJvb2xlYW57XG4gICAgICAgIC8v44OX44Ot44OR44OG44KjYGNvbmRpdGlvbmDjgYvjgonmnaHku7bjg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgICAgY29uc3QgdHJlZSA9dGhpcy5nZXRDb25kaXRpb24odGhpcy5wcm9wcy5jb25kaXRpb24pO1xuICAgICAgICBpZighdHJlZSl7XG4gICAgICAgICAgICAvL+adoeS7tuOCkuioreWumuOBleOCjOOBpuOBhOOBvuOBm+OCk1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyZWUuZXZhbHVhdGUodHJlZS5yb290LGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25kaXRpb24g5p2h5Lu25byP44OE44Oq44O844KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb24oY29uZGl0aW9uOnN0cmluZyk6Q29uZGl0aW9uVHJlZXxudWxse1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25zdCB0cmVlID0gbmV3IENvbmRpdGlvblRyZWUoKTtcbiAgICAgICAgICAgIHRyZWUuZnJvbUpzb24oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIGlmKHRyZWUuZ2V0Q29uZGl0aW9ucyh0cmVlLnJvb3QpLmxlbmd0aD4wKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG5cbn1cbm5ldyBJbnNlcnRWYWx1ZUFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0LCBJVmFyTmFtZX0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSUdldFZhbHVlUHJvcHN7XG4gICAgZmllbGQ6SUZpZWxkOy8v44OB44Kn44OD44Kv44GZ44KL44OV44Kj44O844Or44OJ44Gu5a++6LGhXG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcbn1cbi8qKlxuICog5q2j6KaP6KGo54++44OB44Kn44OD44Kv44Ki44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBHZXRWYWx1ZUFjaXRvbiBpbXBsZW1lbnRzIElBY3Rpb257XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcbiAgICBwcm9wczpJR2V0VmFsdWVQcm9wcztcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLm5hbWU9XCLlgKTjgpLlj5blvpfjgZnjgotcIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICB2ZXJOYW1lOntuYW1lOicnfVxuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3Zlck5hbWUnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJR2V0VmFsdWVQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lICYmIHRoaXMucHJvcHMudmVyTmFtZS5uYW1lIT09Jycpe1xuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIC8vIGV2ZW50LmVycm9yPWVycm9yO1xuICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxuICAgIFxufVxubmV3IEdldFZhbHVlQWNpdG9uKCk7XG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyBJRmllbGQsIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXIgfSBmcm9tIFwiLi4vdXRpbC9mb3JtYXRcIjtcclxuXHJcbi8v5Y+zVUnnlLvpnaJwcm9wZXJ0eeOBrm5hbWU65Z6L77yaXHJcbmludGVyZmFjZSBJU3RyaW5nSm9pblByb3Bze1xyXG4gICAgLy/kv53lrZjlhYjjg5XjgqPjg7zjg6vjg4lcclxuICAgIHNhdmVGaWVsZDpJRmllbGQ7XHJcbiAgICAvL+e1kOWQiOWFg+ODleOCo+ODvOODq+ODiTFcclxuICAgIGpvaW5GaWVsZDE6SUZpZWxkO1xyXG4gICAgLy/ntZDlkIjlhYPjg5XjgqPjg7zjg6vjg4kyXHJcbiAgICBqb2luRmllbGQyOklGaWVsZDtcclxuICAgIC8v5Yy65YiH44KK5paH5a2XXHJcbiAgICBkZWxpbWl0ZXI6c3RyaW5nO1xyXG59XHJcblxyXG4vL0lBY3Rpb27jgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgpLlrp/oo4XjgZnjgovmlrDjgZfjgYTjgq/jg6njgrlBY3Rpb27jgpLkvZzmiJDvvJpcclxuZXhwb3J0IGNsYXNzIFN0cmluZ0pvaW5BY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgLy9pbXBvcnTjgYvjgonlsI7lhaXpoZXnpLrlrprnvqlcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIC8v5LiK5pa544GuaW50ZXJmYWNlIFByb3Bz44GL44KJ44CBcHJvcHPlj5fjgZHjgovlsZ7mgKfjgpLlrprnvqnvvJpcclxuICAgIHByb3BzOklTdHJpbmdKb2luUHJvcHM7XHJcbiAgICAvL+mWouaVsOWumue+qeOBq+W/heimgeOBqumhnuWQjeOCkuani+evie+8mlxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvL3BnQWRtaW5EQuOBq+eZu+mMsuOBl+OBn+OCouOCr+OCt+ODp+ODs+WQjShuYW1lL3N1YnRpdGxlKeS4gOiHtOOBmeOCi+W/heimgeOBjOOBguOCi++8mlxyXG4gICAgICAgIHRoaXMubmFtZT1cIuaWh+Wtl+e1kOWQiFwiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgICAgIC8v44OX44Ot44OR44OG44Kj5bGe5oCn5Yid5pyf5YyW77yaXHJcbiAgICAgICAgdGhpcy5wcm9wcz17XHJcbiAgICAgICAgICAgIHNhdmVGaWVsZDp7Y29kZTonJ30sXHJcbiAgICAgICAgICAgIGpvaW5GaWVsZDE6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICBqb2luRmllbGQyOntjb2RlOicnfSxcclxuICAgICAgICAgICAgZGVsaW1pdGVyOicnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Oq44K744OD44OI5LiK6KiY55m76Yyy6KGo77yaXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu5Yem55CG44KS5a6f6KOF44GZ44KLXHJcbiAqIEBwYXJhbSBhY3Rpb25Ob2RlIOOCouOCr+OCt+ODp+ODs+ODjuODvOODiVxyXG4gKiBAcGFyYW0gZXZlbnQgS2ludG9uZeOBruOCpOODmeODs+ODiFxyXG4gKiBAcGFyYW0gY29udGV4dCDjgrPjg7Pjg4bjgq3jgrnjg4jvvIjjg6zjgrPjg7zjg4njgIHlpInmlbDmg4XloLHjgpLmjIHjgaPjgabjgYTjgovvvIlcclxuICogQHJldHVybnMgXHJcbiAqL1xyXG4gICAgLy/pnZ7lkIzmnJ/lh6bnkIbjgYLjgovplqLmlbDkuIvjga7jgYLjgovlsZ7mgKfvvJpcclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnkpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICAvL+W+jOe2meWHpueQhuS4jeWPr++8mlxyXG4gICAgICAgICAgICBjYW5OZXh0OmZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgovvvJpcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+ioreWumuOBruODh+ODvOOCv+Wei+OBr+W/heimgeOBquaDheWgseWQq+OCgeOBvuOBmeOBi++8n+WFqOmDqOS4jeWtmOWcqOaZgnJldHVybjpcclxuICAgICAgICAgICAgaWYgKCEoJ3NhdmVGaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnam9pbkZpZWxkMScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnam9pbkZpZWxkMicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/ml6Llrprjga7jg5fjg63jg5Hjg4bjgqPjga7jgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgbjlpInmj5vvvJpcclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSVN0cmluZ0pvaW5Qcm9wcztcclxuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xyXG5cclxuICAgICAgICAgICAgLy9raW50b25l44OV44Kj44O844Or44OJ44K/44Kk44OX5Y+W5b6X77yaXHJcbiAgICAgICAgICAgIGNvbnN0IGpvaW5GaWVsZDF0eXBlPXRoaXMucHJvcHMuam9pbkZpZWxkMS50eXBlO1xyXG4gICAgICAgICAgICBjb25zdCBqb2luRmllbGQydHlwZT10aGlzLnByb3BzLmpvaW5GaWVsZDIudHlwZTtcclxuICAgICAgICAgICAgY29uc3Qgc2F2ZUZpZWxkdHlwZT10aGlzLnByb3BzLnNhdmVGaWVsZC50eXBlO1xyXG5cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8vIC8v5L+d5a2Y5YWI44OV44Kj44O844Or44OJ44Gv5paH5a2X5YiX44OV44Kj44O844Or44OJ44Gn44Gv44Gq44GE5aC05ZCI44CB44Ko44Op44O855m655Sf77yaXHJcbiAgICAgICAgICAgIGlmKCEoc2F2ZUZpZWxkdHlwZT09PSdTSU5HTEVfTElORV9URVhUJ3x8c2F2ZUZpZWxkdHlwZT09PSdNVUxUSV9MSU5FX1RFWFQnfHxzYXZlRmllbGR0eXBlPT09J1JJQ0hfVEVYVCcpKXtcclxuICAgICAgICAgICAgICAgIGV2ZW50LmVycm9yPSdb44Ko44Op44O844Oh44OD44K744O844K4Xe+8mue1kOWQiOS/neWtmOWFiOWvvuW/nOS4jeWPr+OAgue1kOWQiOOBl+OBvuOBm+OCkyc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZS5pbmNsdWRlcygnc3VjY2VzcycpKXtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXCJbd2luZG93cyBhbGVydF3vvJpcIitldmVudC5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8v5YCk5Y+W5b6X5pa55rOV5a6a576p77yaXHJcbiAgICBmdW5jdGlvbiBnZXRWYWx1ZSh2YWx1ZTpzdHJpbmcsdHlwZTpzdHJpbmd8dW5kZWZpbmVkLGZpZWxkQ29kZTpzdHJpbmcsZXZlbnQ6YW55KXtcclxuICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT11bmRlZmluZWR8fGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZT09PW51bGwpe1xyXG4gICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZT0nJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/kvZzmiJDogIXjgIHmm7TmlrDogIXvvJpcclxuICAgICAgICBpZih0eXBlPT09J0NSRUFUT1InfHx0eXBlPT09J01PRElGSUVSJyl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlLm5hbWU7XHJcbiAgICAgICAgLy/ml6XmmYLjgIHkvZzmiJDml6XmmYLjgIHmm7TmlrDml6XmmYLvvJpcclxuICAgICAgICB9ZWxzZSBpZih0eXBlPT09J0RBVEVUSU1FJ3x8dHlwZT09PSdDUkVBVEVEX1RJTUUnfHx0eXBlPT09J1VQREFURURfVElNRScpe1xyXG4gICAgICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWUhPT11bmRlZmluZWQgJiYgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBGb3JtYXR0ZXIuZGF0ZUZvcm1hdChuZXcgRGF0ZShldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWUpLCd5eXl5LU1NLWRkIEhIOm1tJyk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1ldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy/jg6bjg7zjgrbpgbjmip7jgIHntYTnuZTpgbjmip7jgIHjgrDjg6vjg7zjg5fpgbjmip7jgIHmt7vku5jjg5XjgqHjgqTjg6vlkI3jgIHkvZzmpa3ogIXjgIHjgqvjg4bjgrTjg6rjg7zvvJpcclxuICAgICAgICB9ZWxzZSBpZih0eXBlPT09J1VTRVJfU0VMRUNUJ3x8dHlwZT09PSdPUkdBTklaQVRJT05fU0VMRUNUJ3x8dHlwZT09PSdHUk9VUF9TRUxFQ1QnfHx0eXBlPT09J0ZJTEUnfHx0eXBlPT09J1NUQVRVU19BU1NJR05FRScpe1xyXG4gICAgICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT11bmRlZmluZWQgfHwgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlPT09Jycpe1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW90b3RleHQ9ZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGFycj1bXTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8bW90b3RleHQubGVuZ3RoO2krKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2gobW90b3RleHRbaV0ubmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL+mFjeWIl+imgee0oOOCkizjgafpgKPntZDjgZfjgabmloflrZfliJfjgpLkvZzmiJDvvJpcclxuICAgICAgICAgICAgICAgIHZhbHVlPWFyci5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvL+OCq+ODhuOCtOODquODvOOAgeODgeOCp+ODg+OCr+ODnOODg+OCr+OCueOAgeikh+aVsOmBuOaKnu+8mlxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGU9PT0nQ0FURUdPUlknfHx0eXBlPT09J0NIRUNLX0JPWCd8fHR5cGU9PT0nTVVMVElfU0VMRUNUJyl7XHJcbiAgICAgICAgICAgIGlmKGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZT09PXVuZGVmaW5lZCB8fCBldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT0nJyl7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb3RvdGV4dD1ldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXJyPVtdO1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxtb3RvdGV4dC5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChtb3RvdGV4dFtpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL+mFjeWIl+imgee0oOOCkizjgafpgKPntZDjgZfjgabmloflrZfliJfjgpLkvZzmiJDvvJpcclxuICAgICAgICAgICAgICAgIHZhbHVlPWFyci5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvL+ips+e0sOeUu+mdouODl+ODreOCu+OCueWun+ihjOW+jOOBruOCueODhuODvOOCv+OCue+8mlxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGU9PT0nU1RBVFVTJyYmZXZlbnQudHlwZS5pbmNsdWRlcygncHJvY2VzcycpKXtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudC5uZXh0U3RhdHVzLnZhbHVlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09bnVsbCl7XHJcbiAgICAgICAgICAgIHZhbHVlPScnO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB2YWx1ZTsgICAgIFxyXG4gICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8v5YCk5Y+W5b6X5pa55rOV5ZG85Ye677yaXHJcbiAgICAgICAgICAgIGxldCBqb2luVmFsdWUxOnN0cmluZz0nJztcclxuICAgICAgICAgICAgam9pblZhbHVlMT1nZXRWYWx1ZShqb2luVmFsdWUxLGpvaW5GaWVsZDF0eXBlLHRoaXMucHJvcHMuam9pbkZpZWxkMS5jb2RlLGV2ZW50KTtcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICBsZXQgam9pblZhbHVlMjpzdHJpbmc9Jyc7XHJcbiAgICAgICAgICAgIGpvaW5WYWx1ZTI9Z2V0VmFsdWUoam9pblZhbHVlMixqb2luRmllbGQydHlwZSx0aGlzLnByb3BzLmpvaW5GaWVsZDIuY29kZSxldmVudCk7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgY29uc3QgY29uU3RyaW5nID0gdGhpcy5wcm9wcy5kZWxpbWl0ZXI7XHJcbiAgICAgICAgICAgIGxldCBzYXZlVmFsdWU6c3RyaW5nPScnO1xyXG4gICAgICAgICAgICAvL+WJjeW+jOe1kOWQiOWFg+OBjOepuueZveOBquOCieWMuuWIh+OCiuaWh+Wtl+OCguepuueZveOBq+OBmeOCiyjkvos6MS0444GuOOeEoeOBhOOBquOCiTHjgIIxLTjjga4x54Sh44GE44Gq44KJOOOAgjHnqbrnmb0444GuOOeEoeOBhOOBquOCiTHjgILntZDlkIjlhYPlhajpg6jnqbrnmb3jgarjgonlhajpg6jnqbrnmb0pOlxyXG4gICAgICAgICAgICBpZihqb2luVmFsdWUxPT09JycmJmpvaW5WYWx1ZTI9PT0nJyl7XHJcbiAgICAgICAgICAgICAgICBzYXZlVmFsdWU9Jyc7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGpvaW5WYWx1ZTE9PT0nJyYmam9pblZhbHVlMiE9PScnKXtcclxuICAgICAgICAgICAgICAgIHNhdmVWYWx1ZT1qb2luVmFsdWUyO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihqb2luVmFsdWUyPT09JycmJmpvaW5WYWx1ZTEhPT0nJyl7XHJcbiAgICAgICAgICAgICAgICBzYXZlVmFsdWU9am9pblZhbHVlMTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoam9pblZhbHVlMSE9PScnJiZqb2luVmFsdWUyIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgc2F2ZVZhbHVlPWAke2pvaW5WYWx1ZTF9JHtjb25TdHJpbmd9JHtqb2luVmFsdWUyfWBcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgLy/mlrDopo8v5pu05pawL+S4gOimp+S/neWtmOaIkOWKn+W+jOOBruS7peWkluOBrmV2ZW5044GnUFVU5L2/55So44GX44Gq44GE77yaXHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudHlwZS5pbmNsdWRlcygnc3VjY2VzcycpKXtcclxuICAgICAgICAgICAgICAgICAvL+S/neWtmOWFiOODleOCo+ODvOODq+ODieOBq+WApOOCu+ODg+ODiO+8mlxyXG4gICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLnNhdmVGaWVsZC5jb2RlXS52YWx1ZT1zYXZlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgLy93aW5kb3cuYWxlcnQoXCLmloflrZfntZDlkIjooYzjgYTjgb7jgZfjgZ/jgIJcIit0aGlzLnByb3BzLmpvaW5GaWVsZDEubmFtZStcIjpcIitqb2luVmFsdWUxK1wiLFwiK3RoaXMucHJvcHMuam9pbkZpZWxkMi5uYW1lK1wiOlwiK2pvaW5WYWx1ZTIrXCLjgIJcIik7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgLy9raW50b25lIGFzeW5jL2F3YWl0IOOBq+OCiOOCi+mdnuWQjOacn+WHpueQhijmiJDlip/jgqTjg5njg7Pjg4hSRVNUIEFQSeWHpueQhuaZginvvJpcclxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJlY29yZChmaWVsZENvZGU6c3RyaW5nLGV2ZW50OmFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkUmVjb3JkID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBldmVudC5hcHBJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAgZXZlbnQucmVjb3JkSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IHtbZmllbGRDb2RlXTp7XCJ2YWx1ZVwiOnNhdmVWYWx1ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbnRvbmUuYXBpKGtpbnRvbmUuYXBpLnVybCgnL2svdjEvcmVjb3JkJywgdHJ1ZSksICdQVVQnLCB1cGRhdGVkUmVjb3JkLCAocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8va2ludG9uZeS/neWtmOWFiOODleOCo+ODvOODq+ODieWtmOWcqOeiuuiqje+8mlxyXG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuc2F2ZUZpZWxkLmNvZGVdLnZhbHVlPXNhdmVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIC8va2ludG9uZSBhc3luYy9hd2FpdCDjgavjgojjgovpnZ7lkIzmnJ/lh6bnkIbvvJpcclxuICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVJlY29yZCh0aGlzLnByb3BzLnNhdmVGaWVsZC5jb2RlLGV2ZW50KTsgICBcclxuICAgICAgICAgICAgICAgIC8v5LiA6Kan55S76Z2i5pu05paw5oiQ5Yqf5b6M5omL5YuV44Oq44Ot44O844OJ44GP44Gg44GV44GE77yaICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUuaW5jbHVkZXMoJ2luZGV4Jykpe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmFsZXJ0KFwi5paH5a2X57WQ5ZCI6KGM44GE44G+44GX44Gf44CCXCIrdGhpcy5wcm9wcy5qb2luRmllbGQxLm5hbWUrXCI6XCIram9pblZhbHVlMStcIixcIit0aGlzLnByb3BzLmpvaW5GaWVsZDIubmFtZStcIjpcIitqb2luVmFsdWUyK1wi44CC5LiA6Kan55S76Z2i5pu05paw5oiQ5Yqf5b6M6Ieq5YuV44Oq44Ot44O844OJ44GX44G+44Gb44KT44CC5b+F6KaB44Gr5b+c44GY44Gm5omL5YuV44Oq44Ot44O844OJ44GP44Gg44GV44GE44CCXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChcIuaWh+Wtl+e1kOWQiOOBq+OBr+OAgeS4gOimp+eUu+mdouabtOaWsOaIkOWKn+W+jOiHquWLleODquODreODvOODieOBl+OBvuOBm+OCk+OAguW/heimgeOBq+W/nOOBmOOBpuaJi+WLleODquODreODvOODieOBj+OBoOOBleOBhOOAglwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgcmVzdWx0PSB7XHJcbiAgICAgICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfWNhdGNoKGVycm9yKXs7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlLmluY2x1ZGVzKCdzdWNjZXNzJykpe1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KFwiW3dpbmRvd3MgYWxlcnRd77ya5Yem55CG5Lit55Ww5bi444GM55m655Sf44GX44G+44GX44Gf44CC57WQ5ZCI44GX44G+44Gb44KT44CC44K344K544OG44Og5ouF5b2T6ICF44G444GK5ZWP5ZCI44Gb44GP44Gg44GV44GE44CCZXJyb3Ljg6Hjg4Pjgrvjg7zjgrjvvJpcIitlcnJvcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBldmVudC5lcnJvcj1cIlvjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrhd77ya5Yem55CG5Lit55Ww5bi444GM55m655Sf44GX44G+44GX44Gf44CC57WQ5ZCI44GX44G+44Gb44KT44CC44K344K544OG44Og5ouF5b2T6ICF44G444GK5ZWP5ZCI44Gb44GP44Gg44GV44GE44CCZXJyb3Ljg6Hjg4Pjgrvjg7zjgrjvvJpcIitlcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNhbk5leHQ6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XHJcbiAgICB9XHJcbn1cclxubmV3IFN0cmluZ0pvaW5BY3Rpb24oKTsiLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuXG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG4gICAgaW50ZXJmYWNlIEZ1bGxXaWR0aFByb3Bze1xuICAgICAgICBmaWVsZDpJRmllbGRcbiAgICB9XG4vKipcbiAqIOWFqOinkuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgRnVsbFdpZHRoQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOkZ1bGxXaWR0aFByb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuWFqOinkuODgeOCp+ODg+OCr1wiOyAvKiBwZ2FkbWlu44GubmFtZeOBqOWQjOanmCAgKi9cbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ31cbiAgICAgICAgfVxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0PXtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2ZpZWxkJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBGdWxsV2lkdGhQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXT8udmFsdWU7XG4gICAgICAgICAgICAvL+adoeS7tuWIhuWykFxuICAgICAgICAgICAgLy/mnKrlhaXlipvmmYLjga/kvZXjgoLlh6bnkIbjgpLjgZvjgZrntYLkuoZcbiAgICAgICAgICAgIGlmKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09Jycpe1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPW51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+WNiuinkuOBjOWQq+OBvuOCjOOBpuOBhOOBn+WgtOWQiHJlc3VsdOOBjGZhbHNlXG4gICAgICAgICAgICBpZighdGhpcy5jb250YWluc0Z1bGxXaWR0aENoYXJzKHZhbHVlKSAmJiAhKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09JycpKXtcbiAgICAgICAgICAgICAgICAvL+OCqOODqeODvOaZguOBq+WHuuWKm+OBleOCjOOCi+aWh+Wtl+ioreWumlxuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPVwi5Y2K6KeS44GM5ZCr44G+44KM44Gm44GE44G+44GZXCI7XG4gICAgICAgICAgICAgICAgLy/mrKHjga7lh6bnkIbjgpLkuK3mraLjgZnjgovlgKToqK3lrppcbiAgICAgICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3I9bnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmVzdWx044OX44Ot44OR44OG44Kj5oyH5a6aXG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIC8v5L6L5aSW5Yem55CGXG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICAvLyBldmVudC5lcnJvcj1lcnJvcjtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8g5YWo44Gm5YWo6KeS44Gu5paH5a2X5YiX44Gu5aC05ZCI44GvdHJ1ZeOAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr2ZhbHNlXG4gICAgY29udGFpbnNGdWxsV2lkdGhDaGFycyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgICAgICAvLyDljYrop5Loi7HmlbDlrZfjgqvjg4roqJjlj7fjgpLpmaTlpJZcbiAgICAgICAgLy/lhajop5LjgYvjganjgYbjgYtcbiAgICAgICAgY29uc3QgY2hlY2tSZWdleD1cIl5bXlxceDAxLVxceDdFXFx1RkY2MS1cXHVGRjlGXSskXCI7XG5cbiAgICAgICAgLy/mraPopo/ooajnj77jgqrjg5bjgrjjgqfjgq/jg4jnlJ/miJBcbiAgICAgICAgY29uc3QgZnVsbFdpZHRoUmVnZXggPSBuZXcgUmVnRXhwKGNoZWNrUmVnZXgpO1xuXG4gICAgICAgIC8v5q2j6KaP6KGo54++44OB44Kn44OD44KvXG4gICAgICAgIHJldHVybiBmdWxsV2lkdGhSZWdleC50ZXN0KHRleHQpO1xuICAgIH1cblxuICAgIC8v5oi744KK5YCk44KS5oyB44Gf44Gq44GE44Gf44KBdm9pZOWei1xuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbn1cbm5ldyBGdWxsV2lkdGhBY3Rpb24oKTsiLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuXG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG4gICAgaW50ZXJmYWNlIEhhbGZXaWR0aFByb3Bze1xuICAgICAgICBmaWVsZDpJRmllbGRcbiAgICB9XG4vKipcbiAqIOWNiuinkuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgSGFsZldpZHRoQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOkhhbGZXaWR0aFByb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuWNiuinkuODgeOCp+ODg+OCr1wiOyAvKiBwZ2FkbWlu44GubmFtZeOBqOWQjOanmCAgKi9cbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ31cbiAgICAgICAgfVxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0PXtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2ZpZWxkJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBIYWxmV2lkdGhQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXT8udmFsdWU7XG4gICAgICAgICAgICAvL+adoeS7tuWIhuWykFxuICAgICAgICAgICAgLy/mnKrlhaXlipvmmYLjga/kvZXjgoLlh6bnkIbjgpLjgZvjgZrntYLkuoZcbiAgICAgICAgICAgIGlmKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09Jycpe1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPW51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+WFqOinkuOBjOWQq+OBvuOCjOOBpuOBhOOBn+WgtOWQiOS/neWtmOWHpueQhuS4reatoijjgqjjg6njg7zlh6bnkIYpXG4gICAgICAgICAgICBpZighdGhpcy5jb250YWluc0hhbGZXaWR0aENoYXJzKHZhbHVlKSl7XG4gICAgICAgICAgICAgICAgLy/jgqjjg6njg7zmmYLjgavlh7rlipvjgZXjgozjgovmloflrZfoqK3lrppcbiAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvcj1cIuWFqOinkuOBjOWQq+OBvuOCjOOBpuOBhOOBvuOBmVwiO1xuICAgICAgICAgICAgICAgIC8v5qyh44Gu5Yem55CG44KS5Lit5q2i44GZ44KL5YCk6Kit5a6aXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPW51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+WNiuinkuOBruWgtOWQiOWVj+mhjOOBquOBj+Wun+ihjFxuICAgICAgICAgICAgLy9yZXN1bHTjg5fjg63jg5Hjg4bjgqPmjIflrppcbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OnRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIC8v5L6L5aSW5Yem55CGXG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICAvLyBldmVudC5lcnJvcj1lcnJvcjtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8g5YWo44Gm5YWo6KeS44Gu5paH5a2X5YiX44Gu5aC05ZCI44GvdHJ1ZeOAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr2ZhbHNlXG4gICAgY29udGFpbnNIYWxmV2lkdGhDaGFycyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBjaGVja1JlZ2V4ID0gXCJeW1xceDAxLVxceDdFXFx1RkY2MS1cXHVGRjlGXSskXCI7XG4gICAgICAgIC8v5q2j6KaP6KGo54++44Kq44OW44K444Kn44Kv44OI55Sf5oiQXG4gICAgICAgIGNvbnN0IGhhbGZXaWR0aFJlZ2V4ID0gbmV3IFJlZ0V4cChjaGVja1JlZ2V4KTtcblxuICAgICAgICAvL+ato+imj+ihqOePvuODgeOCp+ODg+OCr1xuICAgICAgICByZXR1cm4gaGFsZldpZHRoUmVnZXgudGVzdCh0ZXh0KTtcbiAgICB9XG4gICAgLy/miLvjgorlgKTjgpLmjIHjgZ/jgarjgYTjgZ/jgoF2b2lk5Z6LXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxufVxubmV3IEhhbGZXaWR0aEFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQge1xuICBJQWN0aW9uLFxuICBJQWN0aW9uUmVzdWx0LFxuICBJQWN0aW9uTm9kZSxcbiAgSUFjdGlvblByb3BlcnR5LFxuICBJRmllbGQsXG4gIElDb250ZXh0LFxuICBJVmFyTmFtZSxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSBcIi4uL3R5cGVzL0NvbmRpdGlvbnNcIjtcblxuLyoqXG4gKiAg44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXG4gKi9cbmludGVyZmFjZSBJQ29udmVyc2lvblByb3BzIHtcbiAgZmllbGQ6IElGaWVsZDtcbiAgY29udmVyc2lvbjogc3RyaW5nO1xuICB2ZXJOYW1lOiBJVmFyTmFtZTtcbn1cblxuY29uc3QgZnVsbFdpZHRoVG9IYWxmV2lkdGhNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gIOOCrDogXCLvvbbvvp5cIixcbiAg44KuOiBcIu+9t+++nlwiLFxuICDjgrA6IFwi7724776eXCIsXG4gIOOCsjogXCLvvbnvvp5cIixcbiAg44K0OiBcIu+9uu++nlwiLFxuICDjgrY6IFwi7727776eXCIsXG4gIOOCuDogXCLvvbzvvp5cIixcbiAg44K6OiBcIu+9ve++nlwiLFxuICDjgrw6IFwi772+776eXCIsXG4gIOOCvjogXCLvvb/vvp5cIixcbiAg44OAOiBcIu++gO++nlwiLFxuICDjg4I6IFwi776B776eXCIsXG4gIOODhTogXCLvvoLvvp5cIixcbiAg44OHOiBcIu++g+++nlwiLFxuICDjg4k6IFwi776E776eXCIsXG4gIOODkDogXCLvvorvvp5cIixcbiAg44OTOiBcIu++i+++nlwiLFxuICDjg5Y6IFwi776M776eXCIsXG4gIOODmTogXCLvvo3vvp5cIixcbiAg44OcOiBcIu++ju++nlwiLFxuICDjg5E6IFwi776K776fXCIsXG4gIOODlDogXCLvvovvvp9cIixcbiAg44OXOiBcIu++jO++n1wiLFxuICDjg5o6IFwi776N776fXCIsXG4gIOODnTogXCLvvo7vvp9cIixcbiAg44O0OiBcIu+9s+++nlwiLFxuICDjg7c6IFwi776c776eXCIsXG4gIOODujogXCLvvabvvp5cIixcbiAg44KiOiBcIu+9sVwiLFxuICDjgqQ6IFwi772yXCIsXG4gIOOCpjogXCLvvbNcIixcbiAg44KoOiBcIu+9tFwiLFxuICDjgqo6IFwi7721XCIsXG4gIOOCqzogXCLvvbZcIixcbiAg44KtOiBcIu+9t1wiLFxuICDjgq86IFwi7724XCIsXG4gIOOCsTogXCLvvblcIixcbiAg44KzOiBcIu+9ulwiLFxuICDjgrU6IFwi7727XCIsXG4gIOOCtzogXCLvvbxcIixcbiAg44K5OiBcIu+9vVwiLFxuICDjgrs6IFwi772+XCIsXG4gIOOCvTogXCLvvb9cIixcbiAg44K/OiBcIu++gFwiLFxuICDjg4E6IFwi776BXCIsXG4gIOODhDogXCLvvoJcIixcbiAg44OGOiBcIu++g1wiLFxuICDjg4g6IFwi776EXCIsXG4gIOODijogXCLvvoVcIixcbiAg44OLOiBcIu++hlwiLFxuICDjg4w6IFwi776HXCIsXG4gIOODjTogXCLvvohcIixcbiAg44OOOiBcIu++iVwiLFxuICDjg486IFwi776KXCIsXG4gIOODkjogXCLvvotcIixcbiAg44OVOiBcIu++jFwiLFxuICDjg5g6IFwi776NXCIsXG4gIOODmzogXCLvvo5cIixcbiAg44OeOiBcIu++j1wiLFxuICDjg586IFwi776QXCIsXG4gIOODoDogXCLvvpFcIixcbiAg44OhOiBcIu++klwiLFxuICDjg6I6IFwi776TXCIsXG4gIOODpDogXCLvvpRcIixcbiAg44OmOiBcIu++lVwiLFxuICDjg6g6IFwi776WXCIsXG4gIOODqTogXCLvvpdcIixcbiAg44OqOiBcIu++mFwiLFxuICDjg6s6IFwi776ZXCIsXG4gIOODrDogXCLvvppcIixcbiAg44OtOiBcIu++m1wiLFxuICDjg686IFwi776cXCIsXG4gIOODsjogXCLvvaZcIixcbiAg44OzOiBcIu++nVwiLFxuICDjgqE6IFwi772nXCIsXG4gIOOCozogXCLvvahcIixcbiAg44KlOiBcIu+9qVwiLFxuICDjgqc6IFwi772qXCIsXG4gIOOCqTogXCLvvatcIixcbiAg44ODOiBcIu+9r1wiLFxuICDjg6M6IFwi772sXCIsXG4gIOODpTogXCLvva1cIixcbiAg44OnOiBcIu+9rlwiLFxuICBcIuOAglwiOiBcIu+9oVwiLFxuICBcIuOAgVwiOiBcIu+9pFwiLFxuICDjg7w6IFwi772wXCIsXG4gIFwi44CMXCI6IFwi772iXCIsXG4gIFwi44CNXCI6IFwi772jXCIsXG4gIFwi44O7XCI6IFwi772lXCIsXG4gIFwi44CAXCI6IFwiIFwiLCAvLyDlhajop5Ljgrnjg5rjg7zjgrnjgoLljYrop5Ljgrnjg5rjg7zjgrnjgavlpInmj5tcbn07XG5cbmNvbnN0IGhhbGZXaWR0aFRvRnVsbFdpZHRoTWFwOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICDvvbbvvp46IFwi44KsXCIsXG4gIO+9t+++njogXCLjgq5cIixcbiAg7724776eOiBcIuOCsFwiLFxuICDvvbnvvp46IFwi44KyXCIsXG4gIO+9uu++njogXCLjgrRcIixcbiAg7727776eOiBcIuOCtlwiLFxuICDvvbzvvp46IFwi44K4XCIsXG4gIO+9ve++njogXCLjgrpcIixcbiAg772+776eOiBcIuOCvFwiLFxuICDvvb/vvp46IFwi44K+XCIsXG4gIO++gO++njogXCLjg4BcIixcbiAg776B776eOiBcIuODglwiLFxuICDvvoLvvp46IFwi44OFXCIsXG4gIO++g+++njogXCLjg4dcIixcbiAg776E776eOiBcIuODiVwiLFxuICDvvorvvp46IFwi44OQXCIsXG4gIO++i+++njogXCLjg5NcIixcbiAg776M776eOiBcIuODllwiLFxuICDvvo3vvp46IFwi44OZXCIsXG4gIO++ju++njogXCLjg5xcIixcbiAg776K776fOiBcIuODkVwiLFxuICDvvovvvp86IFwi44OUXCIsXG4gIO++jO++nzogXCLjg5dcIixcbiAg776N776fOiBcIuODmlwiLFxuICDvvo7vvp86IFwi44OdXCIsXG4gIO+9s+++njogXCLjg7RcIixcbiAg776c776eOiBcIuODt1wiLFxuICDvvabvvp46IFwi44O6XCIsXG4gIO+9sTogXCLjgqJcIixcbiAg772yOiBcIuOCpFwiLFxuICDvvbM6IFwi44KmXCIsXG4gIO+9tDogXCLjgqhcIixcbiAg7721OiBcIuOCqlwiLFxuICDvvbY6IFwi44KrXCIsXG4gIO+9tzogXCLjgq1cIixcbiAg7724OiBcIuOCr1wiLFxuICDvvbk6IFwi44KxXCIsXG4gIO+9ujogXCLjgrNcIixcbiAg7727OiBcIuOCtVwiLFxuICDvvbw6IFwi44K3XCIsXG4gIO+9vTogXCLjgrlcIixcbiAg772+OiBcIuOCu1wiLFxuICDvvb86IFwi44K9XCIsXG4gIO++gDogXCLjgr9cIixcbiAg776BOiBcIuODgVwiLFxuICDvvoI6IFwi44OEXCIsXG4gIO++gzogXCLjg4ZcIixcbiAg776EOiBcIuODiFwiLFxuICDvvoU6IFwi44OKXCIsXG4gIO++hjogXCLjg4tcIixcbiAg776HOiBcIuODjFwiLFxuICDvvog6IFwi44ONXCIsXG4gIO++iTogXCLjg45cIixcbiAg776KOiBcIuODj1wiLFxuICDvvos6IFwi44OSXCIsXG4gIO++jDogXCLjg5VcIixcbiAg776NOiBcIuODmFwiLFxuICDvvo46IFwi44ObXCIsXG4gIO++jzogXCLjg55cIixcbiAg776QOiBcIuODn1wiLFxuICDvvpE6IFwi44OgXCIsXG4gIO++kjogXCLjg6FcIixcbiAg776TOiBcIuODolwiLFxuICDvvpQ6IFwi44OkXCIsXG4gIO++lTogXCLjg6ZcIixcbiAg776WOiBcIuODqFwiLFxuICDvvpc6IFwi44OpXCIsXG4gIO++mDogXCLjg6pcIixcbiAg776ZOiBcIuODq1wiLFxuICDvvpo6IFwi44OsXCIsXG4gIO++mzogXCLjg61cIixcbiAg776cOiBcIuODr1wiLFxuICDvvaY6IFwi44OyXCIsXG4gIO++nTogXCLjg7NcIixcbiAg772nOiBcIuOCoVwiLFxuICDvvag6IFwi44KjXCIsXG4gIO+9qTogXCLjgqVcIixcbiAg772qOiBcIuOCp1wiLFxuICDvvas6IFwi44KpXCIsXG4gIO+9rzogXCLjg4NcIixcbiAg772sOiBcIuODo1wiLFxuICDvva06IFwi44OlXCIsXG4gIO+9rjogXCLjg6dcIixcbiAgXCLvvaFcIjogXCLjgIJcIixcbiAgXCLvvaRcIjogXCLjgIFcIixcbiAg772wOiBcIuODvFwiLFxuICBcIu+9olwiOiBcIuOAjFwiLFxuICBcIu+9o1wiOiBcIuOAjVwiLFxuICBcIu+9pVwiOiBcIuODu1wiLFxuICBcIiBcIjogXCLjgIBcIixcbn07XG5cbi8qKlxuICog5YWo6KeSL+WNiuinkuWkieaPm+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgRnVsbEhhbGZDb252ZXJzaW9uQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBwcm9wczogSUNvbnZlcnNpb25Qcm9wcztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLlhajop5Iv5Y2K6KeS5aSJ5o+bXCI7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICBmaWVsZDogeyBjb2RlOiBcIlwiIH0sXG4gICAgICBjb252ZXJzaW9uOiBcIlwiLFxuICAgICAgdmVyTmFtZTogeyBuYW1lOiBcIlwiIH0sXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gIH1cblxuICAvKipcbiAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAqIEBwYXJhbSBhY3Rpb25Ob2RlXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgcHJvY2VzcyhcbiAgICBhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZSxcbiAgICBldmVudDogYW55LFxuICAgIGNvbnRleHQ6IElDb250ZXh0XG4gICk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICBjYW5OZXh0OiB0cnVlLFxuICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICBpZiAoXG4gICAgICAgICEoXCJmaWVsZFwiIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmXG4gICAgICAgICEoXCJjb252ZXJzaW9uXCIgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiZcbiAgICAgICAgIShcInZlck5hbWVcIiBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElDb252ZXJzaW9uUHJvcHM7XG5cbiAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICBpZiAoISh0aGlzLnByb3BzLmZpZWxkLmNvZGUgaW4gcmVjb3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdPy52YWx1ZTtcblxuICAgICAgLy/mnaHku7bliIblspBcbiAgICAgIC8v5pyq5YWl5Yqb5pmC44Gv5L2V44KC5Yem55CG44KS44Gb44Ga57WC5LqGXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvciA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9wcy5jb252ZXJzaW9uID09PSBcIuWFqOinklwiKSB7XG4gICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXSA9IHRoaXMudG9GdWxsV2lkdGgodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucHJvcHMuY29udmVyc2lvbiA9PT0gXCLljYrop5JcIikge1xuICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV0gPSB0aGlzLnRvSGFsZldpZHRoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vcmVzdWx044OX44Ot44OR44OG44Kj5oyH5a6aXG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIGNhbk5leHQ6IHRydWUsXG4gICAgICAgIHJlc3VsdDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAvL+S+i+WkluWHpueQhlxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvciwgYWN0aW9uTm9kZSk7XG4gICAgICByZXN1bHQuY2FuTmV4dCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvLyDljYrop5LjgYvjgonlhajop5LjgavlpInmj5tcbiAgdG9GdWxsV2lkdGgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8v5Y2K6KeS44Gu6Iux5pWw5a2X44Go6KiY5Y+344KS5qSc57Si44GX44CB5Y2K6KeS44GL44KJ5YWo6KeS44Gr5aSJ5o+b77yI5Y2K6KeS44Kz44O844OJ44GrIDB4RkVFMCDjgpLotrPjgZfjgablhajop5LjgavjgZnjgovvvIlcbiAgICBsZXQgcmV0U3RyID0gc3RyLnJlcGxhY2UoL1tBLVphLXowLTkhLX5dL2csIGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzLmNoYXJDb2RlQXQoMCkgKyAweGZlZTApO1xuICAgICAgLy/ljYrop5Ljgqvjgr/jgqvjg4rjgarjganjgpLmpJzntKLjgZfjgIHlhajop5LjgavlpInmj5vjgZnjgovjgZ/jgoHjga7jg57jg4Pjg5Tjg7PjgrDjgqrjg5bjgrjjgqfjgq/jg4jvvIhoYWxmV2lkdGhUb0Z1bGxXaWR0aE1hcO+8ieOBp+WFqOinkuaWh+Wtl+OBq+WkieaPm1xuICAgIH0pO1xuICAgIHJldFN0ciA9IHJldFN0ci5yZXBsYWNlKC9bXFx1RkY2MS1cXHVGRjlGIF0vZywgZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBoYWxmV2lkdGhUb0Z1bGxXaWR0aE1hcFtzXSB8fCBzO1xuICAgIH0pO1xuICAgIHJldHVybiByZXRTdHI7XG4gIH1cblxuICB0b0hhbGZXaWR0aChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy/lhajop5Ljga7oi7HmlbDlrZfjgoToqJjlj7fjgpLmpJzntKLjgZfjgIHlhajop5LjgYvjgonljYrop5LjgavlpInmj5vjgZfjgb7jgZnvvIjlhajop5LjgrPjg7zjg4njgYvjgokgMHhGRUUwIOOCkuW8leOBhOOBpuWNiuinkuOBq+OBmeOCi++8iVxuICAgIGxldCByZXRTdHIgPSBzdHIucmVwbGFjZSgvW++8gS3vvZ5dL2csIGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzLmNoYXJDb2RlQXQoMCkgLSAweGZlZTApO1xuICAgICAgLy/lhajop5LniYfku67lkI3oqJjlj7fjgrnjg5rjg7zjgrnjgarjganjgpLmpJzntKLjgZfjgIHljYrop5LjgavlpInmj5vjgZnjgovjgZ/jgoHjga7jg57jg4Pjg5Tjg7PjgrDjgqrjg5bjgrjjgqfjgq/jg4goIGhhbGZXaWR0aFRvRnVsbFdpZHRoTWFwICnjgafljYrop5LmloflrZfjgavlpInmj5tcbiAgICB9KTtcbiAgICByZXRTdHIgPSByZXRTdHIucmVwbGFjZSgvW+OCrC3jg7TjgqEt44Oz44CC44CB44O844CM44CN44O744CAXS9nLCBmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIGZ1bGxXaWR0aFRvSGFsZldpZHRoTWFwW3NdIHx8IHM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldFN0cjtcbiAgfVxuXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xuICAgIH1cbn1cbm5ldyBGdWxsSGFsZkNvbnZlcnNpb25BY3Rpb24oKTtcbiIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElGaWVsZCxJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksSUNvbnRleHQsSVZhck5hbWV9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG4vL+WPs1VJ55S76Z2icHJvcGVydHnjga5uYW1lOuWei++8mlxyXG5pbnRlcmZhY2UgSUxvZ2luVXNlckdldHRlclByb3Bze1xyXG4gICAgLy/lpInmlbDlkI3jgavjgrvjg4Pjg4jvvJrlgKTjgYzjgqrjg5bjgrjjgqfjgq/jg4jjga7lvaLlvI9cclxuICAgIHZlck5hbWU6SVZhck5hbWU7XHJcbn1cclxuLy9JQWN0aW9u44Kk44Oz44K/44OV44Kn44O844K544KS5a6f6KOF44GZ44KL5paw44GX44GE44Kv44Op44K5QWN0aW9u44KS5L2c5oiQ77yaXHJcbmV4cG9ydCBjbGFzcyBMb2dpblVzZXJHZXR0ZXJBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgLy9pbXBvcnTjgYvjgonlsI7lhaXpoZXnpLrlrprnvqlcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIC8v5LiK5pa544GuaW50ZXJmYWNlIFByb3Bz44GL44KJ44CBcHJvcHPlj5fjgZHjgovlsZ7mgKfjgpLlrprnvqnvvJpcclxuICAgIHByb3BzOklMb2dpblVzZXJHZXR0ZXJQcm9wcztcclxuICAgIC8v6Zai5pWw5a6a576p44Gr5b+F6KaB44Gq6aGe5ZCN44KS5qeL56+J77yaXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIC8vcGdBZG1pbkRC44Gr55m76Yyy44GX44Gf44Ki44Kv44K344On44Oz5ZCNKG5hbWUvc3VidGl0bGUp5LiA6Ie044GZ44KL5b+F6KaB44GM44GC44KL77yaXHJcbiAgICAgICAgdGhpcy5uYW1lPVwi44Ot44Kw44Kk44Oz44Om44O844K244O85Y+W5b6XXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPlsZ7mgKfliJ3mnJ/ljJbvvJpcclxuICAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgdmVyTmFtZTp7bmFtZTonJ31cclxuICAgICAgICB9XHJcbiAgICAgICAgLy/jg6rjgrvjg4Pjg4jkuIroqJjnmbvpjLLooajvvJpcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICB9XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lh6bnkIbjgpLlrp/oo4XjgZnjgotcclxuICogQHBhcmFtIGFjdGlvbk5vZGUg44Ki44Kv44K344On44Oz44OO44O844OJXHJcbiAqIEBwYXJhbSBldmVudCBLaW50b25l44Gu44Kk44OZ44Oz44OIXHJcbiAqIEBwYXJhbSBjb250ZXh0IOOCs+ODs+ODhuOCreOCueODiO+8iOODrOOCs+ODvOODieOAgeWkieaVsOaDheWgseOCkuaMgeOBo+OBpuOBhOOCi++8iVxyXG4gKiBAcmV0dXJucyBcclxuICovXHJcbuOAgOOAgC8v6Z2e5ZCM5pyf5Yem55CG44GC44KL6Zai5pWw5LiL44Gu44GC44KL5bGe5oCn77yaXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi++8mlxyXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcbiAgICAgICAgICAgIC8v44OX44Ot44OR44OG44Kj6Kit5a6a44Gu44OH44O844K/5Z6L44Gv5b+F6KaB44Gq5oOF5aCx5ZCr44KB44G+44GZ44GL77yf5YWo6YOo5LiN5a2Y5Zyo5pmCcmV0dXJuOlxyXG4gICAgICAgICAgICBpZiAoISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL+aXouWumuOBruODl+ODreODkeODhuOCo+OBruOCpOODs+OCv+ODleOCp+ODvOOCueOBuOWkieaPm++8mlxyXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJTG9naW5Vc2VyR2V0dGVyUHJvcHM7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSYmdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWUhPT0nJyl7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV09a2ludG9uZS5nZXRMb2dpblVzZXIoKTtcclxuICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5hbGVydChcIuWkieaVsOWQjVwiK3RoaXMucHJvcHMudmVyTmFtZS5uYW1lK1wi44Gu5YCk44GvXCIrY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdK1wi44Gn44GZXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQucmVjb3JkW1wi5aSJ5pWw6YGL55So5YWI44Gu44Om44O844K26YG45oqe44OV44Kj44O844Or44OJXCJdLnZhbHVlPSBbe2NvZGU6Y29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdLmNvZGV9XTtcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICB9Y2F0Y2goZXJyb3I6YW55KXs7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY2FuTmV4dDpmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgTG9naW5Vc2VyR2V0dGVyQWN0aW9uKCk7IiwiLyohXG4gICogQm9vdHN0cmFwIGRhdGEuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkRhdGEgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50TWFwLnNldChlbGVtZW50LCBuZXcgTWFwKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KTtcblxuICAgICAgLy8gbWFrZSBpdCBjbGVhciB3ZSBvbmx5IHdhbnQgb25lIGluc3RhbmNlIHBlciBlbGVtZW50XG4gICAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgICAgaWYgKCFpbnN0YW5jZU1hcC5oYXMoa2V5KSAmJiBpbnN0YW5jZU1hcC5zaXplICE9PSAwKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgICB9LFxuICAgIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXQoZWxlbWVudCkuZ2V0KGtleSkgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKGVsZW1lbnQsIGtleSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSk7XG5cbiAgICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgZWxlbWVudE1hcC5kZWxldGUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBkYXRhO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGluZGV4LmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLkluZGV4ID0ge30pKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCB1dGlsL2luZGV4LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBjb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbiAgY29uc3QgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwO1xuICBjb25zdCBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJztcblxuICAvKipcbiAgICogUHJvcGVybHkgZXNjYXBlIElEcyBzZWxlY3RvcnMgdG8gaGFuZGxlIHdlaXJkIElEc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGNvbnN0IHBhcnNlU2VsZWN0b3IgPSBzZWxlY3RvciA9PiB7XG4gICAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgbmVlZHMgZXNjYXBpbmcgdG8gaGFuZGxlIElEcyAoaHRtbDUrKSBjb250YWluaW5nIGZvciBpbnN0YW5jZSAvXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLyMoW15cXHNcIiMnXSspL2csIChtYXRjaCwgaWQpID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9O1xuXG4gIC8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuICBjb25zdCB0b1R5cGUgPSBvYmplY3QgPT4ge1xuICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgVXRpbCBBUElcbiAgICovXG5cbiAgY29uc3QgZ2V0VUlEID0gcHJlZml4ID0+IHtcbiAgICBkbyB7XG4gICAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gICAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSk7XG4gICAgcmV0dXJuIHByZWZpeDtcbiAgfTtcbiAgY29uc3QgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAgbGV0IHtcbiAgICAgIHRyYW5zaXRpb25EdXJhdGlvbixcbiAgICAgIHRyYW5zaXRpb25EZWxheVxuICAgIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICBjb25zdCBmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpO1xuXG4gICAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICAgIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF07XG4gICAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gICAgcmV0dXJuIChOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KSkgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUjtcbiAgfTtcbiAgY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSk7XG4gIH07XG4gIGNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgb2JqZWN0ID0gb2JqZWN0WzBdO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdC5ub2RlVHlwZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH07XG4gIGNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAgIC8vIGl0J3MgYSBqUXVlcnkgb2JqZWN0IG9yIGEgbm9kZSBlbGVtZW50XG4gICAgaWYgKGlzRWxlbWVudChvYmplY3QpKSB7XG4gICAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgY29uc3QgaXNWaXNpYmxlID0gZWxlbWVudCA9PiB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudCkgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50SXNWaXNpYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJztcbiAgICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGNvbnN0IGNsb3NlZERldGFpbHMgPSBlbGVtZW50LmNsb3Nlc3QoJ2RldGFpbHM6bm90KFtvcGVuXSknKTtcbiAgICBpZiAoIWNsb3NlZERldGFpbHMpIHtcbiAgICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICAgIH1cbiAgICBpZiAoY2xvc2VkRGV0YWlscyAhPT0gZWxlbWVudCkge1xuICAgICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgICAgaWYgKHN1bW1hcnkgJiYgc3VtbWFyeS5wYXJlbnROb2RlICE9PSBjbG9zZWREZXRhaWxzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdW1tYXJ5ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGU7XG4gIH07XG4gIGNvbnN0IGlzRGlzYWJsZWQgPSBlbGVtZW50ID0+IHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVsZW1lbnQuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpICE9PSAnZmFsc2UnO1xuICB9O1xuICBjb25zdCBmaW5kU2hhZG93Um9vdCA9IGVsZW1lbnQgPT4ge1xuICAgIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dGFjaFNoYWRvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ2FuIGZpbmQgdGhlIHNoYWRvdyByb290IG90aGVyd2lzZSBpdCdsbCByZXR1cm4gdGhlIGRvY3VtZW50XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGw7XG4gICAgfVxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gd2hlbiB3ZSBkb24ndCBmaW5kIGEgc2hhZG93IHJvb3RcbiAgICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaW5kU2hhZG93Um9vdChlbGVtZW50LnBhcmVudE5vZGUpO1xuICB9O1xuICBjb25zdCBub29wID0gKCkgPT4ge307XG5cbiAgLyoqXG4gICAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cbiAgICovXG4gIGNvbnN0IHJlZmxvdyA9IGVsZW1lbnQgPT4ge1xuICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICB9O1xuICBjb25zdCBnZXRqUXVlcnkgPSAoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5qUXVlcnkgJiYgIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLWJzLW5vLWpxdWVyeScpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIGNvbnN0IERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MgPSBbXTtcbiAgY29uc3Qgb25ET01Db250ZW50TG9hZGVkID0gY2FsbGJhY2sgPT4ge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIC8vIGFkZCBsaXN0ZW5lciBvbiB0aGUgZmlyc3QgY2FsbCB3aGVuIHRoZSBkb2N1bWVudCBpcyBpbiBsb2FkaW5nIHN0YXRlXG4gICAgICBpZiAoIURPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNSVEwgPSAoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJztcbiAgY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgICBvbkRPTUNvbnRlbnRMb2FkZWQoKCkgPT4ge1xuICAgICAgY29uc3QgJCA9IGdldGpRdWVyeSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoJCkge1xuICAgICAgICBjb25zdCBuYW1lID0gcGx1Z2luLk5BTUU7XG4gICAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAgICQuZm5bbmFtZV0gPSBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgICAkLmZuW25hbWVdLkNvbnN0cnVjdG9yID0gcGx1Z2luO1xuICAgICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICAgJC5mbltuYW1lXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZXhlY3V0ZSA9IChwb3NzaWJsZUNhbGxiYWNrLCBhcmdzID0gW10sIGRlZmF1bHRWYWx1ZSA9IHBvc3NpYmxlQ2FsbGJhY2spID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHBvc3NpYmxlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBwb3NzaWJsZUNhbGxiYWNrKC4uLmFyZ3MpIDogZGVmYXVsdFZhbHVlO1xuICB9O1xuICBjb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gICAgaWYgKCF3YWl0Rm9yVHJhbnNpdGlvbikge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDU7XG4gICAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZztcbiAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgICB0YXJnZXRcbiAgICB9KSA9PiB7XG4gICAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcik7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0sIGVtdWxhdGVkRHVyYXRpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgICAgVGhlIGxpc3Qgb2YgZWxlbWVudHNcbiAgICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAgICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICAgKiBAcGFyYW0gaXNDeWNsZUFsbG93ZWRcbiAgICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAgICovXG4gIGNvbnN0IGdldE5leHRBY3RpdmVFbGVtZW50ID0gKGxpc3QsIGFjdGl2ZUVsZW1lbnQsIHNob3VsZEdldE5leHQsIGlzQ3ljbGVBbGxvd2VkKSA9PiB7XG4gICAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KTtcblxuICAgIC8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IHJldHVybiBhbiBlbGVtZW50XG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gIXNob3VsZEdldE5leHQgJiYgaXNDeWNsZUFsbG93ZWQgPyBsaXN0W2xpc3RMZW5ndGggLSAxXSA6IGxpc3RbMF07XG4gICAgfVxuICAgIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTE7XG4gICAgaWYgKGlzQ3ljbGVBbGxvd2VkKSB7XG4gICAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RbTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGxpc3RMZW5ndGggLSAxKSldO1xuICB9O1xuXG4gIGV4cG9ydHMuZGVmaW5lSlF1ZXJ5UGx1Z2luID0gZGVmaW5lSlF1ZXJ5UGx1Z2luO1xuICBleHBvcnRzLmV4ZWN1dGUgPSBleGVjdXRlO1xuICBleHBvcnRzLmV4ZWN1dGVBZnRlclRyYW5zaXRpb24gPSBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uO1xuICBleHBvcnRzLmZpbmRTaGFkb3dSb290ID0gZmluZFNoYWRvd1Jvb3Q7XG4gIGV4cG9ydHMuZ2V0RWxlbWVudCA9IGdldEVsZW1lbnQ7XG4gIGV4cG9ydHMuZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSBnZXROZXh0QWN0aXZlRWxlbWVudDtcbiAgZXhwb3J0cy5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50O1xuICBleHBvcnRzLmdldFVJRCA9IGdldFVJRDtcbiAgZXhwb3J0cy5nZXRqUXVlcnkgPSBnZXRqUXVlcnk7XG4gIGV4cG9ydHMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIGV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuICBleHBvcnRzLmlzUlRMID0gaXNSVEw7XG4gIGV4cG9ydHMuaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xuICBleHBvcnRzLm5vb3AgPSBub29wO1xuICBleHBvcnRzLm9uRE9NQ29udGVudExvYWRlZCA9IG9uRE9NQ29udGVudExvYWRlZDtcbiAgZXhwb3J0cy5wYXJzZVNlbGVjdG9yID0gcGFyc2VTZWxlY3RvcjtcbiAgZXhwb3J0cy5yZWZsb3cgPSByZWZsb3c7XG4gIGV4cG9ydHMudG9UeXBlID0gdG9UeXBlO1xuICBleHBvcnRzLnRyaWdnZXJUcmFuc2l0aW9uRW5kID0gdHJpZ2dlclRyYW5zaXRpb25FbmQ7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGV2ZW50LWhhbmRsZXIuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vdXRpbC9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5FdmVudEhhbmRsZXIgPSBmYWN0b3J5KGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IG5hbWVzcGFjZVJlZ2V4ID0gL1teLl0qKD89XFwuLiopXFwufC4qLztcbiAgY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovO1xuICBjb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvO1xuICBjb25zdCBldmVudFJlZ2lzdHJ5ID0ge307IC8vIEV2ZW50cyBzdG9yYWdlXG4gIGxldCB1aWRFdmVudCA9IDE7XG4gIGNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG4gIH07XG4gIGNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoWydjbGljaycsICdkYmxjbGljaycsICdtb3VzZXVwJywgJ21vdXNlZG93bicsICdjb250ZXh0bWVudScsICdtb3VzZXdoZWVsJywgJ0RPTU1vdXNlU2Nyb2xsJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnLCAnc2VsZWN0c3RhcnQnLCAnc2VsZWN0ZW5kJywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnb3JpZW50YXRpb25jaGFuZ2UnLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnLCAndG91Y2hjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJywgJ3BvaW50ZXJsZWF2ZScsICdwb2ludGVyY2FuY2VsJywgJ2dlc3R1cmVzdGFydCcsICdnZXN0dXJlY2hhbmdlJywgJ2dlc3R1cmVlbmQnLCAnZm9jdXMnLCAnYmx1cicsICdjaGFuZ2UnLCAncmVzZXQnLCAnc2VsZWN0JywgJ3N1Ym1pdCcsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2xvYWQnLCAndW5sb2FkJywgJ2JlZm9yZXVubG9hZCcsICdyZXNpemUnLCAnbW92ZScsICdET01Db250ZW50TG9hZGVkJywgJ3JlYWR5c3RhdGVjaGFuZ2UnLCAnZXJyb3InLCAnYWJvcnQnLCAnc2Nyb2xsJ10pO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZHNcbiAgICovXG5cbiAgZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICAgIHJldHVybiB1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWAgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrO1xuICB9XG4gIGZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KTtcbiAgICBlbGVtZW50LnVpZEV2ZW50ID0gdWlkO1xuICAgIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fTtcbiAgICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdO1xuICB9XG4gIGZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgaHlkcmF0ZU9iaihldmVudCwge1xuICAgICAgICBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgW2V2ZW50XSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBzZWxlY3RvciwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgZm9yIChsZXQge1xuICAgICAgICB0YXJnZXRcbiAgICAgIH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgICAgICAgIGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgY2FsbGFibGUsIGRlbGVnYXRpb25TZWxlY3RvciA9IG51bGwpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJztcbiAgICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgICBjb25zdCBjYWxsYWJsZSA9IGlzRGVsZWdhdGVkID8gZGVsZWdhdGlvbkZ1bmN0aW9uIDogaGFuZGxlciB8fCBkZWxlZ2F0aW9uRnVuY3Rpb247XG4gICAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudCk7XG4gICAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICAgIHR5cGVFdmVudCA9IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgIH1cbiAgICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcblxuICAgIC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cbiAgICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgICBjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKTtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KTtcbiAgICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKTtcbiAgICBpZiAocHJldmlvdXNGdW5jdGlvbikge1xuICAgICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKTtcbiAgICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID8gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDogYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSk7XG4gICAgZm4uZGVsZWdhdGlvblNlbGVjdG9yID0gaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbDtcbiAgICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlO1xuICAgIGZuLm9uZU9mZiA9IG9uZU9mZjtcbiAgICBmbi51aWRFdmVudCA9IHVpZDtcbiAgICBoYW5kbGVyc1t1aWRdID0gZm47XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIEJvb2xlYW4oZGVsZWdhdGlvblNlbGVjdG9yKSk7XG4gICAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgaWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gICAgLy8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxuICAgIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpO1xuICAgIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50O1xuICB9XG4gIGNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKTtcbiAgICB9LFxuICAgIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpO1xuICAgIH0sXG4gICAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKTtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFNpbXBsZXN0IGNhc2U6IGhhbmRsZXIgaXMgcGFzc2VkLCByZW1vdmUgdGhhdCBsaXN0ZW5lciBPTkxZLlxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICAgIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJyk7XG4gICAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCAkID0gaW5kZXhfanMuZ2V0alF1ZXJ5KCk7XG4gICAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50O1xuICAgICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbDtcbiAgICAgIGxldCBidWJibGVzID0gdHJ1ZTtcbiAgICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWU7XG4gICAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGluTmFtZXNwYWNlICYmICQpIHtcbiAgICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKTtcbiAgICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KTtcbiAgICAgICAgYnViYmxlcyA9ICFqUXVlcnlFdmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwge1xuICAgICAgICBidWJibGVzLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KSwgYXJncyk7XG4gICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gY2F0Y2ggKF91bnVzZWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnQtaGFuZGxlci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBtYW5pcHVsYXRvci5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTWFuaXB1bGF0b3IgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL21hbmlwdWxhdG9yLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICAgIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgY2hyID0+IGAtJHtjaHIudG9Mb3dlckNhc2UoKX1gKTtcbiAgfVxuICBjb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKTtcbiAgICB9LFxuICAgIHJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKTtcbiAgICB9LFxuICAgIGdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJzS2V5cykge1xuICAgICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJyk7XG4gICAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxLCBwdXJlS2V5Lmxlbmd0aCk7XG4gICAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH0sXG4gICAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVEYXRhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIE1hbmlwdWxhdG9yO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYW5pcHVsYXRvci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBjb25maWcuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi9kb20vbWFuaXB1bGF0b3IuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9tYW5pcHVsYXRvcicsICcuL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkNvbmZpZyA9IGZhY3RvcnkoZ2xvYmFsLk1hbmlwdWxhdG9yLCBnbG9iYWwuSW5kZXgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoTWFuaXB1bGF0b3IsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvY29uZmlnLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIENvbmZpZyB7XG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKTtcbiAgICB9XG4gICAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZyk7XG4gICAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgZWxlbWVudCkge1xuICAgICAgY29uc3QganNvbkNvbmZpZyA9IGluZGV4X2pzLmlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge307IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsXG4gICAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgICAuLi4oaW5kZXhfanMuaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgICAgfTtcbiAgICB9XG4gICAgX3R5cGVDaGVja0NvbmZpZyhjb25maWcsIGNvbmZpZ1R5cGVzID0gdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSkge1xuICAgICAgZm9yIChjb25zdCBbcHJvcGVydHksIGV4cGVjdGVkVHlwZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ1R5cGVzKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGluZGV4X2pzLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiBpbmRleF9qcy50b1R5cGUodmFsdWUpO1xuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIENvbmZpZztcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZmlnLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi9kb20vZGF0YS5qcycpLCByZXF1aXJlKCcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9jb25maWcuanMnKSwgcmVxdWlyZSgnLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi9kb20vZGF0YScsICcuL2RvbS9ldmVudC1oYW5kbGVyJywgJy4vdXRpbC9jb25maWcnLCAnLi91dGlsL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkJhc2VDb21wb25lbnQgPSBmYWN0b3J5KGdsb2JhbC5EYXRhLCBnbG9iYWwuRXZlbnRIYW5kbGVyLCBnbG9iYWwuQ29uZmlnLCBnbG9iYWwuSW5kZXgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoRGF0YSwgRXZlbnRIYW5kbGVyLCBDb25maWcsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgVkVSU0lPTiA9ICc1LjMuMyc7XG5cbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgY2xhc3MgQmFzZUNvbXBvbmVudCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgZWxlbWVudCA9IGluZGV4X2pzLmdldEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIERhdGEuc2V0KHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFB1YmxpY1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcbiAgICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgX3F1ZXVlQ2FsbGJhY2soY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgICBpbmRleF9qcy5leGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgICB9XG4gICAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudCk7XG4gICAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgLy8gU3RhdGljXG4gICAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBEYXRhLmdldChpbmRleF9qcy5nZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbCk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gO1xuICAgIH1cbiAgICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSR7dGhpcy5FVkVOVF9LRVl9YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQmFzZUNvbXBvbmVudDtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS1jb21wb25lbnQuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgc2VsZWN0b3ItZW5naW5lLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vdXRpbC9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL3V0aWwvaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuU2VsZWN0b3JFbmdpbmUgPSBmYWN0b3J5KGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBkb20vc2VsZWN0b3ItZW5naW5lLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBjb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICAgIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpO1xuICAgIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgICAgLy8gc28gZXZlcnl0aGluZyBzdGFydGluZyB3aXRoIGAjYCBvciBgLmAuIElmIGEgXCJyZWFsXCIgVVJMIGlzIHVzZWQgYXMgdGhlIHNlbGVjdG9yLFxuICAgICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICAgIGlmICghaHJlZkF0dHJpYnV0ZSB8fCAhaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gSnVzdCBpbiBjYXNlIHNvbWUgQ01TIHB1dHMgb3V0IGEgZnVsbCBVUkwgd2l0aCB0aGUgYW5jaG9yIGFwcGVuZGVkXG4gICAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gO1xuICAgICAgfVxuICAgICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yID8gc2VsZWN0b3Iuc3BsaXQoJywnKS5tYXAoc2VsID0+IGluZGV4X2pzLnBhcnNlU2VsZWN0b3Ioc2VsKSkuam9pbignLCcpIDogbnVsbDtcbiAgfTtcbiAgY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gICAgZmluZChzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTtcbiAgICB9LFxuICAgIGZpbmRPbmUoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIH0sXG4gICAgY2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKTtcbiAgICB9LFxuICAgIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpO1xuICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9LFxuICAgIHByZXYoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgICBpZiAocHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gW3ByZXZpb3VzXTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91cyA9IHByZXZpb3VzLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICAgIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGxldCBuZXh0ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICBpZiAobmV4dC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBbbmV4dF07XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgZm9jdXNhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgICAgY29uc3QgZm9jdXNhYmxlcyA9IFsnYScsICdidXR0b24nLCAnaW5wdXQnLCAndGV4dGFyZWEnLCAnc2VsZWN0JywgJ2RldGFpbHMnLCAnW3RhYmluZGV4XScsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSddLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpbmRleF9qcy5pc0Rpc2FibGVkKGVsKSAmJiBpbmRleF9qcy5pc1Zpc2libGUoZWwpKTtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbDtcbiAgICB9LFxuICAgIGdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW107XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTZWxlY3RvckVuZ2luZTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0b3ItZW5naW5lLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGJhY2tkcm9wLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnKSwgcmVxdWlyZSgnLi9jb25maWcuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9ldmVudC1oYW5kbGVyJywgJy4vY29uZmlnJywgJy4vaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuQmFja2Ryb3AgPSBmYWN0b3J5KGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5Db25maWcsIGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChFdmVudEhhbmRsZXIsIENvbmZpZywgaW5kZXhfanMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IE5BTUUgPSAnYmFja2Ryb3AnO1xuICBjb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG4gIGNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93JztcbiAgY29uc3QgRVZFTlRfTU9VU0VET1dOID0gYG1vdXNlZG93bi5icy4ke05BTUV9YDtcbiAgY29uc3QgRGVmYXVsdCA9IHtcbiAgICBjbGFzc05hbWU6ICdtb2RhbC1iYWNrZHJvcCcsXG4gICAgY2xpY2tDYWxsYmFjazogbnVsbCxcbiAgICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gICAgaXNWaXNpYmxlOiAnYm9vbGVhbicsXG4gICAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEJhY2tkcm9wIGV4dGVuZHMgQ29uZmlnIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEdldHRlcnNcbiAgICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgICAgcmV0dXJuIE5BTUU7XG4gICAgfVxuXG4gICAgLy8gUHVibGljXG4gICAgc2hvdyhjYWxsYmFjaykge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBlbmQoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KCk7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgaW5kZXhfanMucmVmbG93KGVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyk7XG4gICAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgICAgaW5kZXhfanMuZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaGlkZShjYWxsYmFjaykge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9nZXRFbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICBpbmRleF9qcy5leGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9nZXRFbGVtZW50KCkge1xuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJhY2tkcm9wLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWU7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gYmFja2Ryb3A7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgICB9XG4gICAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICAgIGNvbmZpZy5yb290RWxlbWVudCA9IGluZGV4X2pzLmdldEVsZW1lbnQoY29uZmlnLnJvb3RFbGVtZW50KTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIF9hcHBlbmQoKSB7XG4gICAgICBpZiAodGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCBFVkVOVF9NT1VTRURPV04sICgpID0+IHtcbiAgICAgICAgaW5kZXhfanMuZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2lzQXBwZW5kZWQgPSB0cnVlO1xuICAgIH1cbiAgICBfZW11bGF0ZUFuaW1hdGlvbihjYWxsYmFjaykge1xuICAgICAgaW5kZXhfanMuZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgdGhpcy5fZ2V0RWxlbWVudCgpLCB0aGlzLl9jb25maWcuaXNBbmltYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEJhY2tkcm9wO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZHJvcC5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBjb21wb25lbnQtZnVuY3Rpb25zLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJy4uL2RvbS9ldmVudC1oYW5kbGVyLmpzJyksIHJlcXVpcmUoJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnLi4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuQ29tcG9uZW50RnVuY3Rpb25zID0ge30sIGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsIEV2ZW50SGFuZGxlciwgU2VsZWN0b3JFbmdpbmUsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YDtcbiAgICBjb25zdCBuYW1lID0gY29tcG9uZW50Lk5BTUU7XG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleF9qcy5pc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcykgfHwgdGhpcy5jbG9zZXN0KGAuJHtuYW1lfWApO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuXG4gICAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgICAgaW5zdGFuY2VbbWV0aG9kXSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4cG9ydHMuZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSBlbmFibGVEaXNtaXNzVHJpZ2dlcjtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcG9uZW50LWZ1bmN0aW9ucy5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBmb2N1c3RyYXAuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJyksIHJlcXVpcmUoJy4vY29uZmlnLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL2NvbmZpZyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Gb2N1c3RyYXAgPSBmYWN0b3J5KGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkNvbmZpZykpO1xufSkodGhpcywgKGZ1bmN0aW9uIChFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBDb25maWcpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9mb2N1c3RyYXAuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ2ZvY3VzdHJhcCc7XG4gIGNvbnN0IERBVEFfS0VZID0gJ2JzLmZvY3VzdHJhcCc7XG4gIGNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gO1xuICBjb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9LRVlET1dOX1RBQiA9IGBrZXlkb3duLnRhYiR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IFRBQl9LRVkgPSAnVGFiJztcbiAgY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnO1xuICBjb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJztcbiAgY29uc3QgRGVmYXVsdCA9IHtcbiAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2ZcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgYXV0b2ZvY3VzOiAnYm9vbGVhbicsXG4gICAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEZvY3VzVHJhcCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgICByZXR1cm4gTkFNRTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBhY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSk7IC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpO1xuICAgIH1cblxuICAgIC8vIFByaXZhdGVcbiAgICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB0cmFwRWxlbWVudFxuICAgICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZvY3VzYWJsZUNoaWxkcmVuKHRyYXBFbGVtZW50KTtcbiAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9PT0gVEFCX05BVl9CQUNLV0FSRCkge1xuICAgICAgICBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IFRBQl9LRVkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRm9jdXNUcmFwO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1c3RyYXAuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgc2Nyb2xsYmFyLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL21hbmlwdWxhdG9yLmpzJyksIHJlcXVpcmUoJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9tYW5pcHVsYXRvcicsICcuLi9kb20vc2VsZWN0b3ItZW5naW5lJywgJy4vaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuU2Nyb2xsYmFyID0gZmFjdG9yeShnbG9iYWwuTWFuaXB1bGF0b3IsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKE1hbmlwdWxhdG9yLCBTZWxlY3RvckVuZ2luZSwgaW5kZXhfanMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuICBjb25zdCBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCc7XG4gIGNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCc7XG4gIGNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIFNjcm9sbEJhckhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBnZXRXaWR0aCgpIHtcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvaW5uZXJXaWR0aCN1c2FnZV9ub3Rlc1xuICAgICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpO1xuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICB0aGlzLl9kaXNhYmxlT3ZlckZsb3coKTtcbiAgICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgICAvLyB0cmljazogV2UgYWRqdXN0IHBvc2l0aXZlIHBhZGRpbmdSaWdodCBhbmQgbmVnYXRpdmUgbWFyZ2luUmlnaHQgdG8gc3RpY2t5LXRvcCBlbGVtZW50cyB0byBrZWVwIHNob3dpbmcgZnVsbHdpZHRoXG4gICAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HKTtcbiAgICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pO1xuICAgIH1cbiAgICBpc092ZXJmbG93aW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDA7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG4gICAgX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKTtcbiAgICB9XG4gICAgX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpIHtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSwgYWN0dWFsVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSkge1xuICAgICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgYG51bGxgOyB0aGUgdmFsdWUgY2FuIGFsc28gYmUgemVyb1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjayk7XG4gICAgfVxuICAgIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgICAgaWYgKGluZGV4X2pzLmlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgICAgY2FsbEJhY2soc2VsZWN0b3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNlbCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgICBjYWxsQmFjayhzZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTY3JvbGxCYXJIZWxwZXI7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjcm9sbGJhci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBtb2RhbC5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJy4vYmFzZS1jb21wb25lbnQuanMnKSwgcmVxdWlyZSgnLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi91dGlsL2JhY2tkcm9wLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9mb2N1c3RyYXAuanMnKSwgcmVxdWlyZSgnLi91dGlsL2luZGV4LmpzJyksIHJlcXVpcmUoJy4vdXRpbC9zY3JvbGxiYXIuanMnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuL2Jhc2UtY29tcG9uZW50JywgJy4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi9kb20vc2VsZWN0b3ItZW5naW5lJywgJy4vdXRpbC9iYWNrZHJvcCcsICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucycsICcuL3V0aWwvZm9jdXN0cmFwJywgJy4vdXRpbC9pbmRleCcsICcuL3V0aWwvc2Nyb2xsYmFyJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLk1vZGFsID0gZmFjdG9yeShnbG9iYWwuQmFzZUNvbXBvbmVudCwgZ2xvYmFsLkV2ZW50SGFuZGxlciwgZ2xvYmFsLlNlbGVjdG9yRW5naW5lLCBnbG9iYWwuQmFja2Ryb3AsIGdsb2JhbC5Db21wb25lbnRGdW5jdGlvbnMsIGdsb2JhbC5Gb2N1c3RyYXAsIGdsb2JhbC5JbmRleCwgZ2xvYmFsLlNjcm9sbGJhcikpO1xufSkodGhpcywgKGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50LCBFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBCYWNrZHJvcCwgY29tcG9uZW50RnVuY3Rpb25zX2pzLCBGb2N1c1RyYXAsIGluZGV4X2pzLCBTY3JvbGxCYXJIZWxwZXIpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgbW9kYWwuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ21vZGFsJztcbiAgY29uc3QgREFUQV9LRVkgPSAnYnMubW9kYWwnO1xuICBjb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbiAgY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSc7XG4gIGNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJztcbiAgY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfSElERV9QUkVWRU5URUQgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX1JFU0laRSA9IGByZXNpemUke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9DTElDS19ESVNNSVNTID0gYGNsaWNrLmRpc21pc3Mke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9NT1VTRURPV05fRElTTUlTUyA9IGBtb3VzZWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWA7XG4gIGNvbnN0IENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJztcbiAgY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnO1xuICBjb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG4gIGNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYyc7XG4gIGNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm1vZGFsLnNob3cnO1xuICBjb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZyc7XG4gIGNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknO1xuICBjb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSc7XG4gIGNvbnN0IERlZmF1bHQgPSB7XG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAgZm9jdXM6IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWVcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgICBmb2N1czogJ2Jvb2xlYW4nLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbidcbiAgfTtcblxuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICBjbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICAgIHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRElBTE9HLCB0aGlzLl9lbGVtZW50KTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKCk7XG4gICAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKCk7XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3Njcm9sbEJhciA9IG5ldyBTY3JvbGxCYXJIZWxwZXIoKTtcbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgICByZXR1cm4gTkFNRTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICB9XG4gICAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9zY3JvbGxCYXIuaGlkZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKCkgPT4gdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkpO1xuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9oaWRlTW9kYWwoKSwgdGhpcy5fZWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSk7XG4gICAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICB9XG5cbiAgICAvLyBQcml2YXRlXG4gICAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSxcbiAgICAgICAgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlLFxuICAgICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZyk7XG4gICAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICAgIG1vZGFsQm9keS5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgICAgaW5kZXhfanMucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gICAgfVxuICAgIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgIH0pO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmICF0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgICAgLy8gYSBiYWQgdHJpY2sgdG8gc2VncmVnYXRlIGNsaWNrcyB0aGF0IG1heSBzdGFydCBpbnNpZGUgZGlhbG9nIGJ1dCBlbmQgb3V0c2lkZSwgYW5kIGF2b2lkIGxpc3RlbiB0byBzY3JvbGxiYXIgY2xpY2tzXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfaGlkZU1vZGFsKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fYmFja2Ryb3AuaGlkZSgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pO1xuICAgICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKCk7XG4gICAgICAgIHRoaXMuX3Njcm9sbEJhci5yZXNldCgpO1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIF9pc0FuaW1hdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSk7XG4gICAgfVxuICAgIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpO1xuICAgICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IGluaXRpYWxPdmVyZmxvd1kgPSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WTtcbiAgICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgICAgaWYgKGluaXRpYWxPdmVyZmxvd1kgPT09ICdoaWRkZW4nIHx8IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU1RBVElDKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU1RBVElDKTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgICAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1k7XG4gICAgICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgICB9LCB0aGlzLl9kaWFsb2cpO1xuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAgICovXG5cbiAgICBfYWRqdXN0RGlhbG9nKCkge1xuICAgICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKTtcbiAgICAgIGNvbnN0IGlzQm9keU92ZXJmbG93aW5nID0gc2Nyb2xsYmFyV2lkdGggPiAwO1xuICAgICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBpbmRleF9qcy5pc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YDtcbiAgICAgIH1cbiAgICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gaW5kZXhfanMuaXNSVEwoKSA/ICdwYWRkaW5nUmlnaHQnIDogJ3BhZGRpbmdMZWZ0JztcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBTdGF0aWNcbiAgICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICAgKi9cblxuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKTtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVywgc2hvd0V2ZW50ID0+IHtcbiAgICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4sICgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4X2pzLmlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICAgIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SKTtcbiAgICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICAgIE1vZGFsLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gICAgZGF0YS50b2dnbGUodGhpcyk7XG4gIH0pO1xuICBjb21wb25lbnRGdW5jdGlvbnNfanMuZW5hYmxlRGlzbWlzc1RyaWdnZXIoTW9kYWwpO1xuXG4gIC8qKlxuICAgKiBqUXVlcnlcbiAgICovXG5cbiAgaW5kZXhfanMuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKTtcblxuICByZXR1cm4gTW9kYWw7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGFsLmpzLm1hcFxuIiwiZXhwb3J0IHZhciB0b3AgPSAndG9wJztcbmV4cG9ydCB2YXIgYm90dG9tID0gJ2JvdHRvbSc7XG5leHBvcnQgdmFyIHJpZ2h0ID0gJ3JpZ2h0JztcbmV4cG9ydCB2YXIgbGVmdCA9ICdsZWZ0JztcbmV4cG9ydCB2YXIgYXV0byA9ICdhdXRvJztcbmV4cG9ydCB2YXIgYmFzZVBsYWNlbWVudHMgPSBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbmV4cG9ydCB2YXIgc3RhcnQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBlbmQgPSAnZW5kJztcbmV4cG9ydCB2YXIgY2xpcHBpbmdQYXJlbnRzID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgdmFyIHZpZXdwb3J0ID0gJ3ZpZXdwb3J0JztcbmV4cG9ydCB2YXIgcG9wcGVyID0gJ3BvcHBlcic7XG5leHBvcnQgdmFyIHJlZmVyZW5jZSA9ICdyZWZlcmVuY2UnO1xuZXhwb3J0IHZhciB2YXJpYXRpb25QbGFjZW1lbnRzID0gLyojX19QVVJFX18qL2Jhc2VQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7XG5leHBvcnQgdmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxuZXhwb3J0IHZhciBiZWZvcmVSZWFkID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IHZhciByZWFkID0gJ3JlYWQnO1xuZXhwb3J0IHZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxuZXhwb3J0IHZhciBiZWZvcmVNYWluID0gJ2JlZm9yZU1haW4nO1xuZXhwb3J0IHZhciBtYWluID0gJ21haW4nO1xuZXhwb3J0IHZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG5leHBvcnQgdmFyIGJlZm9yZVdyaXRlID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCB2YXIgd3JpdGUgPSAnd3JpdGUnO1xuZXhwb3J0IHZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IHZhciBtb2RpZmllclBoYXNlcyA9IFtiZWZvcmVSZWFkLCByZWFkLCBhZnRlclJlYWQsIGJlZm9yZU1haW4sIG1haW4sIGFmdGVyTWFpbiwgYmVmb3JlV3JpdGUsIHdyaXRlLCBhZnRlcldyaXRlXTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIElFIDExIGhhcyBubyBTaGFkb3dSb290XG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5TaGFkb3dSb290O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q7XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH07IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsImltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn0iLCJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCJpbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgcmV0dXJuICEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xufSIsImltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlLCBpc0ZpeGVkU3RyYXRlZ3kpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNGaXhlZFN0cmF0ZWd5ID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkU3RyYXRlZ3kgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgdmFyIF9yZWYgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBnZXRXaW5kb3coZWxlbWVudCkgOiB3aW5kb3csXG4gICAgICB2aXN1YWxWaWV3cG9ydCA9IF9yZWYudmlzdWFsVmlld3BvcnQ7XG5cbiAgdmFyIGFkZFZpc3VhbE9mZnNldHMgPSAhaXNMYXlvdXRWaWV3cG9ydCgpICYmIGlzRml4ZWRTdHJhdGVneTtcbiAgdmFyIHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0IDogMCkpIC8gc2NhbGVYO1xuICB2YXIgeSA9IChjbGllbnRSZWN0LnRvcCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wIDogMCkpIC8gc2NhbGVZO1xuICB2YXIgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoIC8gc2NhbGVYO1xuICB2YXIgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZVk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICBsZWZ0OiB4LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwiaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXRGcmVzaFNpZGVPYmplY3QoKSwgcGFkZGluZ09iamVjdCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdW5zZXRTaWRlcyA9IHtcbiAgdG9wOiAnYXV0bycsXG4gIHJpZ2h0OiAnYXV0bycsXG4gIGJvdHRvbTogJ2F1dG8nLFxuICBsZWZ0OiAnYXV0bydcbn07IC8vIFJvdW5kIHRoZSBvZmZzZXRzIHRvIHRoZSBuZWFyZXN0IHN1aXRhYmxlIHN1YnBpeGVsIGJhc2VkIG9uIHRoZSBEUFIuXG4vLyBab29taW5nIGNhbiBjaGFuZ2UgdGhlIERQUiwgYnV0IGl0IHNlZW1zIHRvIHJlcG9ydCBhIHZhbHVlIHRoYXQgd2lsbFxuLy8gY2xlYW5seSBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWJwaXhlbHMuXG5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKF9yZWYsIHdpbikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKHggKiBkcHIpIC8gZHByIHx8IDAsXG4gICAgeTogcm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICB2YXJpYXRpb24gPSBfcmVmMi52YXJpYXRpb24sXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzID0gX3JlZjIucm91bmRPZmZzZXRzLFxuICAgICAgaXNGaXhlZCA9IF9yZWYyLmlzRml4ZWQ7XG4gIHZhciBfb2Zmc2V0cyR4ID0gb2Zmc2V0cy54LFxuICAgICAgeCA9IF9vZmZzZXRzJHggPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR4LFxuICAgICAgX29mZnNldHMkeSA9IG9mZnNldHMueSxcbiAgICAgIHkgPSBfb2Zmc2V0cyR5ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeTtcblxuICB2YXIgX3JlZjMgPSB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nID8gcm91bmRPZmZzZXRzKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWYzLng7XG4gIHkgPSBfcmVmMy55O1xuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgdmFyIGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICB2YXIgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgJiYgcG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FzdF06IGZvcmNlIHR5cGUgcmVmaW5lbWVudCwgd2UgY29tcGFyZSBvZmZzZXRQYXJlbnQgd2l0aCB3aW5kb3cgYWJvdmUsIGJ1dCBGbG93IGRvZXNuJ3QgZGV0ZWN0IGl0XG5cblxuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCB8fCAocGxhY2VtZW50ID09PSBsZWZ0IHx8IHBsYWNlbWVudCA9PT0gcmlnaHQpICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWSA9IGJvdHRvbTtcbiAgICAgIHZhciBvZmZzZXRZID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbaGVpZ2h0UHJvcF07XG4gICAgICB5IC09IG9mZnNldFkgLSBwb3BwZXJSZWN0LmhlaWdodDtcbiAgICAgIHkgKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IGxlZnQgfHwgKHBsYWNlbWVudCA9PT0gdG9wIHx8IHBsYWNlbWVudCA9PT0gYm90dG9tKSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIHZhciBvZmZzZXRYID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQud2lkdGggOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFt3aWR0aFByb3BdO1xuICAgICAgeCAtPSBvZmZzZXRYIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfSwgYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyk7XG5cbiAgdmFyIF9yZWY0ID0gcm91bmRPZmZzZXRzID09PSB0cnVlID8gcm91bmRPZmZzZXRzQnlEUFIoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9LCBnZXRXaW5kb3cocG9wcGVyKSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWY0Lng7XG4gIHkgPSBfcmVmNC55O1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY1KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY1LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY1Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uLFxuICAgIGlzRml4ZWQ6IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCdcbiAgfTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciwgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3csIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCJ2YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJ2YXIgaGFzaCA9IHtcbiAgc3RhcnQ6ICdlbmQnLFxuICBlbmQ6ICdzdGFydCdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDtcblxuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDtcbiAgICB2YXIgbGF5b3V0Vmlld3BvcnQgPSBpc0xheW91dFZpZXdwb3J0KCk7XG5cbiAgICBpZiAobGF5b3V0Vmlld3BvcnQgfHwgIWxheW91dFZpZXdwb3J0ICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsImltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KG5vZGUpIHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59IiwiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufSIsImltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0Vmlld3BvcnRSZWN0IGZyb20gXCIuL2dldFZpZXdwb3J0UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50UmVjdCBmcm9tIFwiLi9nZXREb2N1bWVudFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuLi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGZhbHNlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpKSA6IGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIDogcmVjdFRvQ2xpZW50UmVjdChnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKSk7XG59IC8vIEEgXCJjbGlwcGluZyBwYXJlbnRcIiBpcyBhbiBvdmVyZmxvd2FibGUgY29udGFpbmVyIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aXRoIGEgcG9zaXRpb24gZGlmZmVyZW50IGZyb21cbi8vIGBpbml0aWFsYFxuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSB7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgdmFyIGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbikgPj0gMDtcbiAgdmFyIGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG5cblxuICByZXR1cm4gY2xpcHBpbmdQYXJlbnRzLmZpbHRlcihmdW5jdGlvbiAoY2xpcHBpbmdQYXJlbnQpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSAmJiBjb250YWlucyhjbGlwcGluZ1BhcmVudCwgY2xpcHBlckVsZW1lbnQpICYmIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknO1xuICB9KTtcbn0gLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgcGFyZW50c1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChlbGVtZW50LCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSk7XG4gIGNsaXBwaW5nUmVjdC53aWR0aCA9IGNsaXBwaW5nUmVjdC5yaWdodCAtIGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QuaGVpZ2h0ID0gY2xpcHBpbmdSZWN0LmJvdHRvbSAtIGNsaXBwaW5nUmVjdC50b3A7XG4gIGNsaXBwaW5nUmVjdC54ID0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC55ID0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgcmV0dXJuIGNsaXBwaW5nUmVjdDtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRzdHJhdGVneSA9IF9vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgc3RyYXRlZ3kgPSBfb3B0aW9ucyRzdHJhdGVneSA9PT0gdm9pZCAwID8gc3RhdGUuc3RyYXRlZ3kgOiBfb3B0aW9ucyRzdHJhdGVneSxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwiaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHZhcmlhdGlvblBsYWNlbWVudHMsIGJhc2VQbGFjZW1lbnRzLCBwbGFjZW1lbnRzIGFzIGFsbFBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgX29wdGlvbnMkYWxsb3dlZEF1dG9QID0gX29wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gX29wdGlvbnMkYWxsb3dlZEF1dG9QID09PSB2b2lkIDAgPyBhbGxQbGFjZW1lbnRzIDogX29wdGlvbnMkYWxsb3dlZEF1dG9QO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCk7XG4gIHZhciBwbGFjZW1lbnRzID0gdmFyaWF0aW9uID8gZmxpcFZhcmlhdGlvbnMgPyB2YXJpYXRpb25QbGFjZW1lbnRzIDogdmFyaWF0aW9uUGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uO1xuICB9KSA6IGJhc2VQbGFjZW1lbnRzO1xuICB2YXIgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGFsbG93ZWRQbGFjZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cztcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXTogRmxvdyBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGggdHdvIGFycmF5IHVuaW9ucy4uLlxuXG5cbiAgdmFyIG92ZXJmbG93cyA9IGFsbG93ZWRQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pW2dldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3ZlcmZsb3dzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIOKAkyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIHBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCByZWN0cywgb2Zmc2V0KSB7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgaW52ZXJ0RGlzdGFuY2UgPSBbbGVmdCwgdG9wXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyAtMSA6IDE7XG5cbiAgdmFyIF9yZWYgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gb2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSkpIDogb2Zmc2V0LFxuICAgICAgc2tpZGRpbmcgPSBfcmVmWzBdLFxuICAgICAgZGlzdGFuY2UgPSBfcmVmWzFdO1xuXG4gIHNraWRkaW5nID0gc2tpZGRpbmcgfHwgMDtcbiAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgfHwgMCkgKiBpbnZlcnREaXN0YW5jZTtcbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8ge1xuICAgIHg6IGRpc3RhbmNlLFxuICAgIHk6IHNraWRkaW5nXG4gIH0gOiB7XG4gICAgeDogc2tpZGRpbmcsXG4gICAgeTogZGlzdGFuY2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZjIubmFtZTtcbiAgdmFyIF9vcHRpb25zJG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX29wdGlvbnMkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfb3B0aW9ucyRvZmZzZXQ7XG4gIHZhciBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgdmFyIF9kYXRhJHN0YXRlJHBsYWNlbWVudCA9IGRhdGFbc3RhdGUucGxhY2VtZW50XSxcbiAgICAgIHggPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueCxcbiAgICAgIHkgPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ29mZnNldCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgZm46IG9mZnNldFxufTsiLCJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHN0YXJ0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tIFwiLi4vdXRpbHMvZ2V0QWx0QXhpcy5qc1wiO1xuaW1wb3J0IHsgd2l0aGluLCB3aXRoaW5NYXhDbGFtcCB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuLi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmltcG9ydCB7IG1pbiBhcyBtYXRoTWluLCBtYXggYXMgbWF0aE1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIF9vcHRpb25zJHRldGhlciA9IG9wdGlvbnMudGV0aGVyLFxuICAgICAgdGV0aGVyID0gX29wdGlvbnMkdGV0aGVyID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkdGV0aGVyLFxuICAgICAgX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID0gb3B0aW9ucy50ZXRoZXJPZmZzZXQsXG4gICAgICB0ZXRoZXJPZmZzZXQgPSBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQ7XG4gIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5XG4gIH0pO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgdmFyIG1haW5BeGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgYWx0QXhpcyA9IGdldEFsdEF4aXMobWFpbkF4aXMpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgdGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gdGV0aGVyT2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogdGV0aGVyT2Zmc2V0O1xuICB2YXIgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldFZhbHVlID09PSAnbnVtYmVyJyA/IHtcbiAgICBtYWluQXhpczogdGV0aGVyT2Zmc2V0VmFsdWUsXG4gICAgYWx0QXhpczogdGV0aGVyT2Zmc2V0VmFsdWVcbiAgfSA6IE9iamVjdC5hc3NpZ24oe1xuICAgIG1haW5BeGlzOiAwLFxuICAgIGFsdEF4aXM6IDBcbiAgfSwgdGV0aGVyT2Zmc2V0VmFsdWUpO1xuICB2YXIgb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0ID8gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXRbc3RhdGUucGxhY2VtZW50XSA6IG51bGw7XG4gIHZhciBkYXRhID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmICghcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDtcblxuICAgIHZhciBtYWluU2lkZSA9IG1haW5BeGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICAgIHZhciBhbHRTaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIHZhciBvZmZzZXQgPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXTtcbiAgICB2YXIgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIHZhciBtYXggPSBvZmZzZXQgLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1pbkxlbiAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBtYXhPZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArIGFkZGl0aXZlICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdyAmJiBnZXRPZmZzZXRQYXJlbnQoc3RhdGUuZWxlbWVudHMuYXJyb3cpO1xuICAgIHZhciBjbGllbnRPZmZzZXQgPSBhcnJvd09mZnNldFBhcmVudCA/IG1haW5BeGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRUb3AgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudExlZnQgfHwgMCA6IDA7XG4gICAgdmFyIG9mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVttYWluQXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBvZmZzZXQgKyBtaW5PZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlIC0gY2xpZW50T2Zmc2V0O1xuICAgIHZhciB0ZXRoZXJNYXggPSBvZmZzZXQgKyBtYXhPZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlO1xuICAgIHZhciBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4odGV0aGVyID8gbWF0aE1pbihtaW4sIHRldGhlck1pbikgOiBtaW4sIG9mZnNldCwgdGV0aGVyID8gbWF0aE1heChtYXgsIHRldGhlck1heCkgOiBtYXgpO1xuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyO1xuXG4gICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgdmFyIF9hbHRTaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IGJvdHRvbSA6IHJpZ2h0O1xuXG4gICAgdmFyIF9vZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgdmFyIF9sZW4gPSBhbHRBeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICB2YXIgX21pbiA9IF9vZmZzZXQgKyBvdmVyZmxvd1tfbWFpblNpZGVdO1xuXG4gICAgdmFyIF9tYXggPSBfb2Zmc2V0IC0gb3ZlcmZsb3dbX2FsdFNpZGVdO1xuXG4gICAgdmFyIGlzT3JpZ2luU2lkZSA9IFt0b3AsIGxlZnRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJDIgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW2FsdEF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkMiA6IDA7XG5cbiAgICB2YXIgX3RldGhlck1pbiA9IGlzT3JpZ2luU2lkZSA/IF9taW4gOiBfb2Zmc2V0IC0gcmVmZXJlbmNlUmVjdFtfbGVuXSAtIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzO1xuXG4gICAgdmFyIF90ZXRoZXJNYXggPSBpc09yaWdpblNpZGUgPyBfb2Zmc2V0ICsgcmVmZXJlbmNlUmVjdFtfbGVuXSArIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzIDogX21heDtcblxuICAgIHZhciBfcHJldmVudGVkT2Zmc2V0ID0gdGV0aGVyICYmIGlzT3JpZ2luU2lkZSA/IHdpdGhpbk1heENsYW1wKF90ZXRoZXJNaW4sIF9vZmZzZXQsIF90ZXRoZXJNYXgpIDogd2l0aGluKHRldGhlciA/IF90ZXRoZXJNaW4gOiBfbWluLCBfb2Zmc2V0LCB0ZXRoZXIgPyBfdGV0aGVyTWF4IDogX21heCk7XG5cbiAgICBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldCAtIF9vZmZzZXQ7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J11cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59IiwiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkLCBpc0ZpeGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwiaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShtb2RpZmllcnMpIHtcbiAgdmFyIG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgY3VycmVudCkge1xuICAgIHZhciBleGlzdGluZyA9IG1lcmdlZFtjdXJyZW50Lm5hbWVdO1xuICAgIG1lcmdlZFtjdXJyZW50Lm5hbWVdID0gZXhpc3RpbmcgPyBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZywgY3VycmVudCwge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3Rpbmcub3B0aW9ucywgY3VycmVudC5vcHRpb25zKSxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLmRhdGEsIGN1cnJlbnQuZGF0YSlcbiAgICB9KSA6IGN1cnJlbnQ7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pOyAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LnZhbHVlc1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFtrZXldO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIOKAkyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZi5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlc107XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwiLyohXG4gICogQm9vdHN0cmFwIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKCk7XG5jb25zdCBEYXRhID0ge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7XG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgfSxcbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMDtcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xuXG4vKipcbiAqIFByb3Blcmx5IGVzY2FwZSBJRHMgc2VsZWN0b3JzIHRvIGhhbmRsZSB3ZWlyZCBJRHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5lZWRzIGVzY2FwaW5nIHRvIGhhbmRsZSBJRHMgKGh0bWw1KykgY29udGFpbmluZyBmb3IgaW5zdGFuY2UgL1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApO1xuICB9XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpO1xuICByZXR1cm4gcHJlZml4O1xufTtcbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHtcbiAgICB0cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgdHJhbnNpdGlvbkRlbGF5XG4gIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVI7XG59O1xuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpO1xufTtcbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF07XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnO1xufTtcbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgfVxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnO1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJyk7XG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICB9XG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbn07XG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSc7XG59O1xuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG59O1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuY2hhcmlzdGhlby5pby9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59O1xuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW107XG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn07XG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnO1xuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRTtcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW47XG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWU7XG59O1xuY29uc3QgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiA9IChjYWxsYmFjaywgdHJhbnNpdGlvbkVsZW1lbnQsIHdhaXRGb3JUcmFuc2l0aW9uID0gdHJ1ZSkgPT4ge1xuICBpZiAoIXdhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDU7XG4gIGNvbnN0IGVtdWxhdGVkRHVyYXRpb24gPSBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0cmFuc2l0aW9uRWxlbWVudCkgKyBkdXJhdGlvblBhZGRpbmc7XG4gIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgdGFyZ2V0XG4gIH0pID0+IHtcbiAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHRyYW5zaXRpb25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICB9O1xuICB0cmFuc2l0aW9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgIHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25FbGVtZW50KTtcbiAgICB9XG4gIH0sIGVtdWxhdGVkRHVyYXRpb24pO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHthcnJheX0gbGlzdCAgICBUaGUgbGlzdCBvZiBlbGVtZW50c1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAqIEBwYXJhbSBzaG91bGRHZXROZXh0ICAgQ2hvb3NlIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIGVsZW1lbnRcbiAqIEBwYXJhbSBpc0N5Y2xlQWxsb3dlZFxuICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAqL1xuY29uc3QgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSAobGlzdCwgYWN0aXZlRWxlbWVudCwgc2hvdWxkR2V0TmV4dCwgaXNDeWNsZUFsbG93ZWQpID0+IHtcbiAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBsZXQgaW5kZXggPSBsaXN0LmluZGV4T2YoYWN0aXZlRWxlbWVudCk7XG5cbiAgLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpc3QgcmV0dXJuIGFuIGVsZW1lbnRcbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAhc2hvdWxkR2V0TmV4dCAmJiBpc0N5Y2xlQWxsb3dlZCA/IGxpc3RbbGlzdExlbmd0aCAtIDFdIDogbGlzdFswXTtcbiAgfVxuICBpbmRleCArPSBzaG91bGRHZXROZXh0ID8gMSA6IC0xO1xuICBpZiAoaXNDeWNsZUFsbG93ZWQpIHtcbiAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aDtcbiAgfVxuICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV07XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2V2ZW50LWhhbmRsZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgbmFtZXNwYWNlUmVnZXggPSAvW14uXSooPz1cXC4uKilcXC58LiovO1xuY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovO1xuY29uc3Qgc3RyaXBVaWRSZWdleCA9IC86OlxcZCskLztcbmNvbnN0IGV2ZW50UmVnaXN0cnkgPSB7fTsgLy8gRXZlbnRzIHN0b3JhZ2VcbmxldCB1aWRFdmVudCA9IDE7XG5jb25zdCBjdXN0b21FdmVudHMgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59O1xuY29uc3QgbmF0aXZlRXZlbnRzID0gbmV3IFNldChbJ2NsaWNrJywgJ2RibGNsaWNrJywgJ21vdXNldXAnLCAnbW91c2Vkb3duJywgJ2NvbnRleHRtZW51JywgJ21vdXNld2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnLCAnbW91c2VvdmVyJywgJ21vdXNlb3V0JywgJ21vdXNlbW92ZScsICdzZWxlY3RzdGFydCcsICdzZWxlY3RlbmQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdvcmllbnRhdGlvbmNoYW5nZScsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVybW92ZScsICdwb2ludGVydXAnLCAncG9pbnRlcmxlYXZlJywgJ3BvaW50ZXJjYW5jZWwnLCAnZ2VzdHVyZXN0YXJ0JywgJ2dlc3R1cmVjaGFuZ2UnLCAnZ2VzdHVyZWVuZCcsICdmb2N1cycsICdibHVyJywgJ2NoYW5nZScsICdyZXNldCcsICdzZWxlY3QnLCAnc3VibWl0JywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnbG9hZCcsICd1bmxvYWQnLCAnYmVmb3JldW5sb2FkJywgJ3Jlc2l6ZScsICdtb3ZlJywgJ0RPTUNvbnRlbnRMb2FkZWQnLCAncmVhZHlzdGF0ZWNoYW5nZScsICdlcnJvcicsICdhYm9ydCcsICdzY3JvbGwnXSk7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RzXG4gKi9cblxuZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICByZXR1cm4gdWlkICYmIGAke3VpZH06OiR7dWlkRXZlbnQrK31gIHx8IGVsZW1lbnQudWlkRXZlbnQgfHwgdWlkRXZlbnQrKztcbn1cbmZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoZWxlbWVudCk7XG4gIGVsZW1lbnQudWlkRXZlbnQgPSB1aWQ7XG4gIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fTtcbiAgcmV0dXJuIGV2ZW50UmVnaXN0cnlbdWlkXTtcbn1cbmZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBoeWRyYXRlT2JqKGV2ZW50LCB7XG4gICAgICBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudFxuICAgIH0pO1xuICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseShlbGVtZW50LCBbZXZlbnRdKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIHNlbGVjdG9yLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBmb3IgKGxldCB7XG4gICAgICB0YXJnZXRcbiAgICB9ID0gZXZlbnQ7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IGRvbUVsZW1lbnQgb2YgZG9tRWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgICAgICBkZWxlZ2F0ZVRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIHNlbGVjdG9yLCBmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZmluZEhhbmRsZXIoZXZlbnRzLCBjYWxsYWJsZSwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJztcbiAgLy8gVE9ETzogdG9vbHRpcCBwYXNzZXMgYGZhbHNlYCBpbnN0ZWFkIG9mIHNlbGVjdG9yLCBzbyB3ZSBuZWVkIHRvIGNoZWNrXG4gIGNvbnN0IGNhbGxhYmxlID0gaXNEZWxlZ2F0ZWQgPyBkZWxlZ2F0aW9uRnVuY3Rpb24gOiBoYW5kbGVyIHx8IGRlbGVnYXRpb25GdW5jdGlvbjtcbiAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudCk7XG4gIGlmICghbmF0aXZlRXZlbnRzLmhhcyh0eXBlRXZlbnQpKSB7XG4gICAgdHlwZUV2ZW50ID0gb3JpZ2luYWxUeXBlRXZlbnQ7XG4gIH1cbiAgcmV0dXJuIFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF07XG59XG5mdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbik7XG5cbiAgLy8gaW4gY2FzZSBvZiBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgd3JhcCB0aGUgaGFuZGxlciB3aXRoaW4gYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgaXRzIERPTSBwb3NpdGlvblxuICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgaWYgKG9yaWdpbmFsVHlwZUV2ZW50IGluIGN1c3RvbUV2ZW50cykge1xuICAgIGNvbnN0IHdyYXBGdW5jdGlvbiA9IGZuID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0IHx8IGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmICFldmVudC5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKTtcbiAgfVxuICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpO1xuICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KTtcbiAgY29uc3QgcHJldmlvdXNGdW5jdGlvbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbCk7XG4gIGlmIChwcmV2aW91c0Z1bmN0aW9uKSB7XG4gICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmY7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKTtcbiAgY29uc3QgZm4gPSBpc0RlbGVnYXRlZCA/IGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGNhbGxhYmxlKSA6IGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgY2FsbGFibGUpO1xuICBmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsO1xuICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlO1xuICBmbi5vbmVPZmYgPSBvbmVPZmY7XG4gIGZuLnVpZEV2ZW50ID0gdWlkO1xuICBoYW5kbGVyc1t1aWRdID0gZm47XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBpc0RlbGVnYXRlZCk7XG59XG5mdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgY29uc3QgZm4gPSBmaW5kSGFuZGxlcihldmVudHNbdHlwZUV2ZW50XSwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgaWYgKCFmbikge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgQm9vbGVhbihkZWxlZ2F0aW9uU2VsZWN0b3IpKTtcbiAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgbmFtZXNwYWNlKSB7XG4gIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gIGZvciAoY29uc3QgW2hhbmRsZXJLZXksIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICBpZiAoaGFuZGxlcktleS5pbmNsdWRlcyhuYW1lc3BhY2UpKSB7XG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFR5cGVFdmVudChldmVudCkge1xuICAvLyBhbGxvdyB0byBnZXQgdGhlIG5hdGl2ZSBldmVudHMgZnJvbSBuYW1lc3BhY2VkIGV2ZW50cyAoJ2NsaWNrLmJzLmJ1dHRvbicgLS0+ICdjbGljaycpXG4gIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpO1xuICByZXR1cm4gY3VzdG9tRXZlbnRzW2V2ZW50XSB8fCBldmVudDtcbn1cbmNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgb24oZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgZmFsc2UpO1xuICB9LFxuICBvbmUoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgdHJ1ZSk7XG4gIH0sXG4gIG9mZihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbik7XG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCk7XG4gICAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fTtcbiAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKTtcbiAgICBpZiAodHlwZW9mIGNhbGxhYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2ltcGxlc3QgY2FzZTogaGFuZGxlciBpcyBwYXNzZWQsIHJlbW92ZSB0aGF0IGxpc3RlbmVyIE9OTFkuXG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEV2ZW50IG9mIE9iamVjdC5rZXlzKGV2ZW50cykpIHtcbiAgICAgICAgcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgZWxlbWVudEV2ZW50LCBvcmlnaW5hbFR5cGVFdmVudC5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleUhhbmRsZXJzLCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJyk7XG4gICAgICBpZiAoIWluTmFtZXNwYWNlIHx8IG9yaWdpbmFsVHlwZUV2ZW50LmluY2x1ZGVzKGhhbmRsZXJLZXkpKSB7XG4gICAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpO1xuICAgIGNvbnN0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChldmVudCk7XG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50O1xuICAgIGxldCBqUXVlcnlFdmVudCA9IG51bGw7XG4gICAgbGV0IGJ1YmJsZXMgPSB0cnVlO1xuICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWU7XG4gICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICBpZiAoaW5OYW1lc3BhY2UgJiYgJCkge1xuICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKTtcbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihqUXVlcnlFdmVudCk7XG4gICAgICBidWJibGVzID0gIWpRdWVyeUV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgZGVmYXVsdFByZXZlbnRlZCA9IGpRdWVyeUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpO1xuICAgIH1cbiAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwge1xuICAgICAgYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KSwgYXJncyk7XG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAobmF0aXZlRGlzcGF0Y2gpIHtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgIH1cbiAgICBpZiAoZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgJiYgalF1ZXJ5RXZlbnQpIHtcbiAgICAgIGpRdWVyeUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHJldHVybiBldnQ7XG4gIH1cbn07XG5mdW5jdGlvbiBoeWRyYXRlT2JqKG9iaiwgbWV0YSA9IHt9KSB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEpKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vbWFuaXB1bGF0b3IuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcbiAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YUtleShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC9bQS1aXS9nLCBjaHIgPT4gYC0ke2Noci50b0xvd2VyQ2FzZSgpfWApO1xufVxuY29uc3QgTWFuaXB1bGF0b3IgPSB7XG4gIHNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKTtcbiAgfSxcbiAgcmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKTtcbiAgfSxcbiAgZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgY29uc3QgYnNLZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5kYXRhc2V0KS5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCdicycpICYmICFrZXkuc3RhcnRzV2l0aCgnYnNDb25maWcnKSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYnNLZXlzKSB7XG4gICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJyk7XG4gICAgICBwdXJlS2V5ID0gcHVyZUtleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHB1cmVLZXkuc2xpY2UoMSwgcHVyZUtleS5sZW5ndGgpO1xuICAgICAgYXR0cmlidXRlc1twdXJlS2V5XSA9IG5vcm1hbGl6ZURhdGEoZWxlbWVudC5kYXRhc2V0W2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfSxcbiAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShlbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKSk7XG4gIH1cbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbmZpZy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29uZmlnIHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RhdGljIG1ldGhvZCBcIk5BTUVcIiwgZm9yIGVhY2ggY29tcG9uZW50IScpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKTtcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9tZXJnZUNvbmZpZ09iaihjb25maWcsIGVsZW1lbnQpIHtcbiAgICBjb25zdCBqc29uQ29uZmlnID0gaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCAnY29uZmlnJykgOiB7fTsgLy8gdHJ5IHRvIHBhcnNlXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LFxuICAgICAgLi4uKHR5cGVvZiBqc29uQ29uZmlnID09PSAnb2JqZWN0JyA/IGpzb25Db25maWcgOiB7fSksXG4gICAgICAuLi4oaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiB7fSlcbiAgICB9O1xuICB9XG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnLCBjb25maWdUeXBlcyA9IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZXhwZWN0ZWRUeXBlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnVHlwZXMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogdG9UeXBlKHZhbHVlKTtcbiAgICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYmFzZS1jb21wb25lbnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgVkVSU0lPTiA9ICc1LjMuMyc7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIGVsZW1lbnQgPSBnZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICBEYXRhLnNldCh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIERhdGEucmVtb3ZlKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG4gICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBudWxsO1xuICAgIH1cbiAgfVxuICBfcXVldWVDYWxsYmFjayhjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCA9IHRydWUpIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgfVxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudCk7XG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpO1xuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gRGF0YS5nZXQoZ2V0RWxlbWVudChlbGVtZW50KSwgdGhpcy5EQVRBX0tFWSk7XG4gIH1cbiAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpO1xuICB9XG4gIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICByZXR1cm4gVkVSU0lPTjtcbiAgfVxuICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgIHJldHVybiBgYnMuJHt0aGlzLk5BTUV9YDtcbiAgfVxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YDtcbiAgfVxuICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke3RoaXMuRVZFTlRfS0VZfWA7XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy10YXJnZXQnKTtcbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgLy8gVGhlIG9ubHkgdmFsaWQgY29udGVudCB0aGF0IGNvdWxkIGRvdWJsZSBhcyBhIHNlbGVjdG9yIGFyZSBJRHMgb3IgY2xhc3NlcyxcbiAgICAvLyBzbyBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggYCNgIG9yIGAuYC4gSWYgYSBcInJlYWxcIiBVUkwgaXMgdXNlZCBhcyB0aGUgc2VsZWN0b3IsXG4gICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzMyMjczXG4gICAgaWYgKCFocmVmQXR0cmlidXRlIHx8ICFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YDtcbiAgICB9XG4gICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbDtcbiAgfVxuICByZXR1cm4gc2VsZWN0b3IgPyBzZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChzZWwgPT4gcGFyc2VTZWxlY3RvcihzZWwpKS5qb2luKCcsJykgOiBudWxsO1xufTtcbmNvbnN0IFNlbGVjdG9yRW5naW5lID0ge1xuICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTtcbiAgfSxcbiAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICB9LFxuICBjaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKTtcbiAgfSxcbiAgcGFyZW50cyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICBsZXQgYW5jZXN0b3IgPSBlbGVtZW50LnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbiAgfSxcbiAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAocHJldmlvdXMpIHtcbiAgICAgIGlmIChwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW3ByZXZpb3VzXTtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKG5leHQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtuZXh0XTtcbiAgICAgIH1cbiAgICAgIG5leHQgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgZm9jdXNhYmxlcyA9IFsnYScsICdidXR0b24nLCAnaW5wdXQnLCAndGV4dGFyZWEnLCAnc2VsZWN0JywgJ2RldGFpbHMnLCAnW3RhYmluZGV4XScsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSddLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKTtcbiAgICByZXR1cm4gdGhpcy5maW5kKGZvY3VzYWJsZXMsIGVsZW1lbnQpLmZpbHRlcihlbCA9PiAhaXNEaXNhYmxlZChlbCkgJiYgaXNWaXNpYmxlKGVsKSk7XG4gIH0sXG4gIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbDtcbiAgfSxcbiAgZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICByZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKSA6IFtdO1xuICB9XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgY29uc3QgY2xpY2tFdmVudCA9IGBjbGljay5kaXNtaXNzJHtjb21wb25lbnQuRVZFTlRfS0VZfWA7XG4gIGNvbnN0IG5hbWUgPSBjb21wb25lbnQuTkFNRTtcbiAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpIHx8IHRoaXMuY2xvc2VzdChgLiR7bmFtZX1gKTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG5cbiAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgIGluc3RhbmNlW21ldGhvZF0oKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSRmID0gJ2FsZXJ0JztcbmNvbnN0IERBVEFfS0VZJGEgPSAnYnMuYWxlcnQnO1xuY29uc3QgRVZFTlRfS0VZJGIgPSBgLiR7REFUQV9LRVkkYX1gO1xuY29uc3QgRVZFTlRfQ0xPU0UgPSBgY2xvc2Uke0VWRU5UX0tFWSRifWA7XG5jb25zdCBFVkVOVF9DTE9TRUQgPSBgY2xvc2VkJHtFVkVOVF9LRVkkYn1gO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckOCA9ICdzaG93JztcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQWxlcnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkZjtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBjbG9zZSgpIHtcbiAgICBjb25zdCBjbG9zZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xPU0UpO1xuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ4KTtcbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDUpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kZXN0cm95RWxlbWVudCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMT1NFRCk7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBBbGVydC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJyk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEFsZXJ0KTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJ1dHRvbi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGUgPSAnYnV0dG9uJztcbmNvbnN0IERBVEFfS0VZJDkgPSAnYnMuYnV0dG9uJztcbmNvbnN0IEVWRU5UX0tFWSRhID0gYC4ke0RBVEFfS0VZJDl9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQ2ID0gJy5kYXRhLWFwaSc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSQzID0gJ2FjdGl2ZSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ1ID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImJ1dHRvblwiXSc7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ2ID0gYGNsaWNrJHtFVkVOVF9LRVkkYX0ke0RBVEFfQVBJX0tFWSQ2fWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRlO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUkMykpO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyk7XG4gICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQ2LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ1LCBldmVudCA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IGJ1dHRvbiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RBVEFfVE9HR0xFJDUpO1xuICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UoYnV0dG9uKTtcbiAgZGF0YS50b2dnbGUoKTtcbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihCdXR0b24pO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zd2lwZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGQgPSAnc3dpcGUnO1xuY29uc3QgRVZFTlRfS0VZJDkgPSAnLmJzLnN3aXBlJztcbmNvbnN0IEVWRU5UX1RPVUNIU1RBUlQgPSBgdG91Y2hzdGFydCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1RPVUNITU9WRSA9IGB0b3VjaG1vdmUke0VWRU5UX0tFWSQ5fWA7XG5jb25zdCBFVkVOVF9UT1VDSEVORCA9IGB0b3VjaGVuZCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1BPSU5URVJET1dOID0gYHBvaW50ZXJkb3duJHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgRVZFTlRfUE9JTlRFUlVQID0gYHBvaW50ZXJ1cCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IFBPSU5URVJfVFlQRV9UT1VDSCA9ICd0b3VjaCc7XG5jb25zdCBQT0lOVEVSX1RZUEVfUEVOID0gJ3Blbic7XG5jb25zdCBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCc7XG5jb25zdCBTV0lQRV9USFJFU0hPTEQgPSA0MDtcbmNvbnN0IERlZmF1bHQkYyA9IHtcbiAgZW5kQ2FsbGJhY2s6IG51bGwsXG4gIGxlZnRDYWxsYmFjazogbnVsbCxcbiAgcmlnaHRDYWxsYmFjazogbnVsbFxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGMgPSB7XG4gIGVuZENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgbGVmdENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgcmlnaHRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFN3aXBlIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIVN3aXBlLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fZGVsdGFYID0gMDtcbiAgICB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyA9IEJvb2xlYW4od2luZG93LlBvaW50ZXJFdmVudCk7XG4gICAgdGhpcy5faW5pdEV2ZW50cygpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkYztcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSRjO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRkO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVkkOSk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9zdGFydChldmVudCkge1xuICAgIGlmICghdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYO1xuICAgIH1cbiAgfVxuICBfZW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZGVsdGFYO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVTd2lwZSgpO1xuICAgIGV4ZWN1dGUodGhpcy5fY29uZmlnLmVuZENhbGxiYWNrKTtcbiAgfVxuICBfbW92ZShldmVudCkge1xuICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxID8gMCA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX2RlbHRhWDtcbiAgfVxuICBfaGFuZGxlU3dpcGUoKSB7XG4gICAgY29uc3QgYWJzRGVsdGFYID0gTWF0aC5hYnModGhpcy5fZGVsdGFYKTtcbiAgICBpZiAoYWJzRGVsdGFYIDw9IFNXSVBFX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBhYnNEZWx0YVggLyB0aGlzLl9kZWx0YVg7XG4gICAgdGhpcy5fZGVsdGFYID0gMDtcbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleGVjdXRlKGRpcmVjdGlvbiA+IDAgPyB0aGlzLl9jb25maWcucmlnaHRDYWxsYmFjayA6IHRoaXMuX2NvbmZpZy5sZWZ0Q2FsbGJhY2spO1xuICB9XG4gIF9pbml0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJET1dOLCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJVUCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIU1RBUlQsIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hNT1ZFLCBldmVudCA9PiB0aGlzLl9tb3ZlKGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hFTkQsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpO1xuICAgIH1cbiAgfVxuICBfZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkge1xuICAgIHJldHVybiB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyAmJiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9QRU4gfHwgZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9UT1VDSCk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMDtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgY2Fyb3VzZWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSRjID0gJ2Nhcm91c2VsJztcbmNvbnN0IERBVEFfS0VZJDggPSAnYnMuY2Fyb3VzZWwnO1xuY29uc3QgRVZFTlRfS0VZJDggPSBgLiR7REFUQV9LRVkkOH1gO1xuY29uc3QgREFUQV9BUElfS0VZJDUgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEFSUk9XX0xFRlRfS0VZJDEgPSAnQXJyb3dMZWZ0JztcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSQxID0gJ0Fycm93UmlnaHQnO1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMDsgLy8gVGltZSBmb3IgbW91c2UgY29tcGF0IGV2ZW50cyB0byBmaXJlIGFmdGVyIHRvdWNoXG5cbmNvbnN0IE9SREVSX05FWFQgPSAnbmV4dCc7XG5jb25zdCBPUkRFUl9QUkVWID0gJ3ByZXYnO1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCc7XG5jb25zdCBESVJFQ1RJT05fUklHSFQgPSAncmlnaHQnO1xuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9LRVlET1dOJDEgPSBga2V5ZG93biR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX01PVVNFRU5URVIkMSA9IGBtb3VzZWVudGVyJHtFVkVOVF9LRVkkOH1gO1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSQxID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkkMyA9IGBsb2FkJHtFVkVOVF9LRVkkOH0ke0RBVEFfQVBJX0tFWSQ1fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ1ID0gYGNsaWNrJHtFVkVOVF9LRVkkOH0ke0RBVEFfQVBJX0tFWSQ1fWA7XG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDIgPSAnYWN0aXZlJztcbmNvbnN0IENMQVNTX05BTUVfU0xJREUgPSAnc2xpZGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9FTkQgPSAnY2Fyb3VzZWwtaXRlbS1lbmQnO1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0JztcbmNvbnN0IENMQVNTX05BTUVfTkVYVCA9ICdjYXJvdXNlbC1pdGVtLW5leHQnO1xuY29uc3QgQ0xBU1NfTkFNRV9QUkVWID0gJ2Nhcm91c2VsLWl0ZW0tcHJldic7XG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkUgPSAnLmFjdGl2ZSc7XG5jb25zdCBTRUxFQ1RPUl9JVEVNID0gJy5jYXJvdXNlbC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTTtcbmNvbnN0IFNFTEVDVE9SX0lURU1fSU1HID0gJy5jYXJvdXNlbC1pdGVtIGltZyc7XG5jb25zdCBTRUxFQ1RPUl9JTkRJQ0FUT1JTID0gJy5jYXJvdXNlbC1pbmRpY2F0b3JzJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nO1xuY29uc3QgU0VMRUNUT1JfREFUQV9SSURFID0gJ1tkYXRhLWJzLXJpZGU9XCJjYXJvdXNlbFwiXSc7XG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVkkMV06IERJUkVDVElPTl9SSUdIVCxcbiAgW0FSUk9XX1JJR0hUX0tFWSQxXTogRElSRUNUSU9OX0xFRlRcbn07XG5jb25zdCBEZWZhdWx0JGIgPSB7XG4gIGludGVydmFsOiA1MDAwLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgcGF1c2U6ICdob3ZlcicsXG4gIHJpZGU6IGZhbHNlLFxuICB0b3VjaDogdHJ1ZSxcbiAgd3JhcDogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGIgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsXG4gIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ2Fyb3VzZWwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbnVsbDtcbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCRiO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJGI7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGM7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKTtcbiAgfVxuICBuZXh0V2hlblZpc2libGUoKSB7XG4gICAgLy8gRklYTUUgVE9ETyB1c2UgYGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZWBcbiAgICAvLyBEb24ndCBjYWxsIG5leHQgd2hlbiB0aGUgcGFnZSBpc24ndCB2aXNpYmxlXG4gICAgLy8gb3IgdGhlIGNhcm91c2VsIG9yIGl0cyBwYXJlbnQgaXNuJ3QgdmlzaWJsZVxuICAgIGlmICghZG9jdW1lbnQuaGlkZGVuICYmIGlzVmlzaWJsZSh0aGlzLl9lbGVtZW50KSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICB9XG4gIHByZXYoKSB7XG4gICAgdGhpcy5fc2xpZGUoT1JERVJfUFJFVik7XG4gIH1cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKTtcbiAgfVxuICBjeWNsZSgpIHtcbiAgICB0aGlzLl9jbGVhckludGVydmFsKCk7XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwoKTtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMubmV4dFdoZW5WaXNpYmxlKCksIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gIH1cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMuY3ljbGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3ljbGUoKTtcbiAgfVxuICB0byhpbmRleCkge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXMoKTtcbiAgICBpZiAoaW5kZXggPiBpdGVtcy5sZW5ndGggLSAxIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMudG8oaW5kZXgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fZ2V0QWN0aXZlKCkpO1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JkZXIgPSBpbmRleCA+IGFjdGl2ZUluZGV4ID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVY7XG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fc3dpcGVIZWxwZXIpIHtcbiAgICAgIHRoaXMuX3N3aXBlSGVscGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcuZGVmYXVsdEludGVydmFsID0gY29uZmlnLmludGVydmFsO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOJDEsIGV2ZW50ID0+IHRoaXMuX2tleWRvd24oZXZlbnQpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIkMSwgKCkgPT4gdGhpcy5wYXVzZSgpKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFJDEsICgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcudG91Y2ggJiYgU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSk7XG4gICAgfVxuICAgIGNvbnN0IGVuZENhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSAhPT0gJ2hvdmVyJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b3VjaFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gICAgfTtcbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH07XG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBuZXcgU3dpcGUodGhpcy5fZWxlbWVudCwgc3dpcGVDb25maWcpO1xuICB9XG4gIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XTtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihkaXJlY3Rpb24pKTtcbiAgICB9XG4gIH1cbiAgX2dldEl0ZW1JbmRleChlbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1zKCkuaW5kZXhPZihlbGVtZW50KTtcbiAgfVxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkUsIHRoaXMuX2luZGljYXRvcnNFbGVtZW50KTtcbiAgICBhY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICBhY3RpdmVJbmRpY2F0b3IucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTtcbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpO1xuICAgIGlmIChuZXdBY3RpdmVJbmRpY2F0b3IpIHtcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgbmV3QWN0aXZlSW5kaWNhdG9yLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3RydWUnKTtcbiAgICB9XG4gIH1cbiAgX3VwZGF0ZUludGVydmFsKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9hY3RpdmVFbGVtZW50IHx8IHRoaXMuX2dldEFjdGl2ZSgpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50SW50ZXJ2YWwgPSBOdW1iZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaW50ZXJ2YWwnKSwgMTApO1xuICAgIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCA9IGVsZW1lbnRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsO1xuICB9XG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9nZXRBY3RpdmUoKTtcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVDtcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGVsZW1lbnQgfHwgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQodGhpcy5fZ2V0SXRlbXMoKSwgYWN0aXZlRWxlbWVudCwgaXNOZXh0LCB0aGlzLl9jb25maWcud3JhcCk7XG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgobmV4dEVsZW1lbnQpO1xuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IGV2ZW50TmFtZSA9PiB7XG4gICAgICByZXR1cm4gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgZXZlbnROYW1lLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG5leHRFbGVtZW50LFxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpLFxuICAgICAgICBmcm9tOiB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCksXG4gICAgICAgIHRvOiBuZXh0RWxlbWVudEluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHNsaWRlRXZlbnQgPSB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJREUpO1xuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8ICFuZXh0RWxlbWVudCkge1xuICAgICAgLy8gU29tZSB3ZWlyZG5lc3MgaXMgaGFwcGVuaW5nLCBzbyB3ZSBiYWlsXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGVzdHMgdGhhdCB1c2UgZW1wdHkgZGl2cyB0byBhdm9pZCB0aGlzIGNoZWNrXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzQ3ljbGluZyA9IEJvb2xlYW4odGhpcy5faW50ZXJ2YWwpO1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleCk7XG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EO1xuICAgIGNvbnN0IG9yZGVyQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9ORVhUIDogQ0xBU1NfTkFNRV9QUkVWO1xuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpO1xuICAgIHJlZmxvdyhuZXh0RWxlbWVudCk7XG4gICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkaXJlY3Rpb25hbENsYXNzTmFtZSwgb3JkZXJDbGFzc05hbWUpO1xuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQyLCBvcmRlckNsYXNzTmFtZSwgZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRCk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gICAgaWYgKGlzQ3ljbGluZykge1xuICAgICAgdGhpcy5jeWNsZSgpO1xuICAgIH1cbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TTElERSk7XG4gIH1cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudCk7XG4gIH1cbiAgX2dldEl0ZW1zKCkge1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU0sIHRoaXMuX2VsZW1lbnQpO1xuICB9XG4gIF9jbGVhckludGVydmFsKCkge1xuICAgIGlmICh0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG4gIF9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX1BSRVYgOiBPUkRFUl9ORVhUO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWO1xuICB9XG4gIF9vcmRlclRvRGlyZWN0aW9uKG9yZGVyKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fUklHSFQgOiBESVJFQ1RJT05fTEVGVDtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnbnVtYmVyJykge1xuICAgICAgICBkYXRhLnRvKGNvbmZpZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDUsIFNFTEVDVE9SX0RBVEFfU0xJREUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBjb25zdCBjYXJvdXNlbCA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KTtcbiAgY29uc3Qgc2xpZGVJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXNsaWRlLXRvJyk7XG4gIGlmIChzbGlkZUluZGV4KSB7XG4gICAgY2Fyb3VzZWwudG8oc2xpZGVJbmRleCk7XG4gICAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUodGhpcywgJ3NsaWRlJykgPT09ICduZXh0Jykge1xuICAgIGNhcm91c2VsLm5leHQoKTtcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjYXJvdXNlbC5wcmV2KCk7XG4gIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKCk7XG59KTtcbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMywgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSk7XG4gIGZvciAoY29uc3QgY2Fyb3VzZWwgb2YgY2Fyb3VzZWxzKSB7XG4gICAgQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZShjYXJvdXNlbCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDYXJvdXNlbCk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGIgPSAnY29sbGFwc2UnO1xuY29uc3QgREFUQV9LRVkkNyA9ICdicy5jb2xsYXBzZSc7XG5jb25zdCBFVkVOVF9LRVkkNyA9IGAuJHtEQVRBX0tFWSQ3fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkNCA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVZFTlRfU0hPVyQ2ID0gYHNob3cke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9TSE9XTiQ2ID0gYHNob3duJHtFVkVOVF9LRVkkN31gO1xuY29uc3QgRVZFTlRfSElERSQ2ID0gYGhpZGUke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNiA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ0ID0gYGNsaWNrJHtFVkVOVF9LRVkkN30ke0RBVEFfQVBJX0tFWSQ0fWA7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNyA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0UgPSAnY29sbGFwc2UnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJztcbmNvbnN0IENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOID0gYDpzY29wZSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfWA7XG5jb25zdCBDTEFTU19OQU1FX0hPUklaT05UQUwgPSAnY29sbGFwc2UtaG9yaXpvbnRhbCc7XG5jb25zdCBXSURUSCA9ICd3aWR0aCc7XG5jb25zdCBIRUlHSFQgPSAnaGVpZ2h0JztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRVMgPSAnLmNvbGxhcHNlLnNob3csIC5jb2xsYXBzZS5jb2xsYXBzaW5nJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIl0nO1xuY29uc3QgRGVmYXVsdCRhID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIHRvZ2dsZTogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGEgPSB7XG4gIHBhcmVudDogJyhudWxsfGVsZW1lbnQpJyxcbiAgdG9nZ2xlOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbGxhcHNlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gW107XG4gICAgY29uc3QgdG9nZ2xlTGlzdCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEUkNCk7XG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHRvZ2dsZUxpc3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JFbmdpbmUuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKTtcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKS5maWx0ZXIoZm91bmRFbGVtZW50ID0+IGZvdW5kRWxlbWVudCA9PT0gdGhpcy5fZWxlbWVudCk7XG4gICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgZmlsdGVyRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpO1xuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdGhpcy5faXNTaG93bigpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b2dnbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkYTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSRhO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRiO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGFjdGl2ZUNoaWxkcmVuID0gW107XG5cbiAgICAvLyBmaW5kIGFjdGl2ZSBjaGlsZHJlblxuICAgIGlmICh0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICBhY3RpdmVDaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkVTKS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KS5tYXAoZWxlbWVudCA9PiBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHtcbiAgICAgICAgdG9nZ2xlOiBmYWxzZVxuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoYWN0aXZlQ2hpbGRyZW4ubGVuZ3RoICYmIGFjdGl2ZUNoaWxkcmVuWzBdLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNik7XG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZS5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwO1xuICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRydWUpO1xuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVyQ3KTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNik7XG4gICAgfTtcbiAgICBjb25zdCBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpO1xuICAgIGNvbnN0IHNjcm9sbFNpemUgPSBgc2Nyb2xsJHtjYXBpdGFsaXplZERpbWVuc2lvbn1gO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV19cHhgO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDYpO1xuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dfXB4YDtcbiAgICByZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVyQ3KTtcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdGhpcy5fdHJpZ2dlckFycmF5KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0cmlnZ2VyKTtcbiAgICAgIGlmIChlbGVtZW50ICYmICF0aGlzLl9pc1Nob3duKGVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbdHJpZ2dlcl0sIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kNik7XG4gICAgfTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKTtcbiAgfVxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuICAgIGNvbmZpZy5wYXJlbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5wYXJlbnQpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2dldERpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9IT1JJWk9OVEFMKSA/IFdJRFRIIDogSEVJR0hUO1xuICB9XG4gIF9pbml0aWFsaXplQ2hpbGRyZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQpO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbZWxlbWVudF0sIHRoaXMuX2lzU2hvd24oc2VsZWN0ZWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihzZWxlY3Rvcikge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gU2VsZWN0b3JFbmdpbmUuZmluZChDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiwgdGhpcy5fY29uZmlnLnBhcmVudCk7XG4gICAgLy8gcmVtb3ZlIGNoaWxkcmVuIGlmIGdyZWF0ZXIgZGVwdGhcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKGVsZW1lbnQgPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW1lbnQpKTtcbiAgfVxuICBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRyaWdnZXJBcnJheSwgaXNPcGVuKSB7XG4gICAgaWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0NPTExBUFNFRCwgIWlzT3Blbik7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3Blbik7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHt9O1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgIF9jb25maWcudG9nZ2xlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgX2NvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQ0LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0LCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgLy8gcHJldmVudERlZmF1bHQgb25seSBmb3IgPGE+IGVsZW1lbnRzICh3aGljaCBjaGFuZ2UgdGhlIFVSTCkgbm90IGluc2lkZSB0aGUgY29sbGFwc2libGUgZWxlbWVudFxuICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdBJyB8fCBldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiBldmVudC5kZWxlZ2F0ZVRhcmdldC50YWdOYW1lID09PSAnQScpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5nZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKHRoaXMpKSB7XG4gICAgQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7XG4gICAgICB0b2dnbGU6IGZhbHNlXG4gICAgfSkudG9nZ2xlKCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDb2xsYXBzZSk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkcm9wZG93bi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGEgPSAnZHJvcGRvd24nO1xuY29uc3QgREFUQV9LRVkkNiA9ICdicy5kcm9wZG93bic7XG5jb25zdCBFVkVOVF9LRVkkNiA9IGAuJHtEQVRBX0tFWSQ2fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMyA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVNDQVBFX0tFWSQyID0gJ0VzY2FwZSc7XG5jb25zdCBUQUJfS0VZJDEgPSAnVGFiJztcbmNvbnN0IEFSUk9XX1VQX0tFWSQxID0gJ0Fycm93VXAnO1xuY29uc3QgQVJST1dfRE9XTl9LRVkkMSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMjsgLy8gTW91c2VFdmVudC5idXR0b24gdmFsdWUgZm9yIHRoZSBzZWNvbmRhcnkgYnV0dG9uLCB1c3VhbGx5IHRoZSByaWdodCBidXR0b25cblxuY29uc3QgRVZFTlRfSElERSQ1ID0gYGhpZGUke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9TSE9XJDUgPSBgc2hvdyR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDUgPSBgc2hvd24ke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQzID0gYGNsaWNrJHtFVkVOVF9LRVkkNn0ke0RBVEFfQVBJX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJID0gYGtleWRvd24ke0VWRU5UX0tFWSQ2fSR7REFUQV9BUElfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gYGtleXVwJHtFVkVOVF9LRVkkNn0ke0RBVEFfQVBJX0tFWSQzfWA7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNiA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BFTkQgPSAnZHJvcGVuZCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BTVEFSVCA9ICdkcm9wc3RhcnQnO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSID0gJ2Ryb3B1cC1jZW50ZXInO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIgPSAnZHJvcGRvd24tY2VudGVyJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIl06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04gPSBgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzfS4ke0NMQVNTX05BTUVfU0hPVyQ2fWA7XG5jb25zdCBTRUxFQ1RPUl9NRU5VID0gJy5kcm9wZG93bi1tZW51JztcbmNvbnN0IFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJztcbmNvbnN0IFNFTEVDVE9SX05BVkJBUl9OQVYgPSAnLm5hdmJhci1uYXYnO1xuY29uc3QgU0VMRUNUT1JfVklTSUJMRV9JVEVNUyA9ICcuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSc7XG5jb25zdCBQTEFDRU1FTlRfVE9QID0gaXNSVEwoKSA/ICd0b3AtZW5kJyA6ICd0b3Atc3RhcnQnO1xuY29uc3QgUExBQ0VNRU5UX1RPUEVORCA9IGlzUlRMKCkgPyAndG9wLXN0YXJ0JyA6ICd0b3AtZW5kJztcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NRU5EID0gaXNSVEwoKSA/ICdib3R0b20tc3RhcnQnIDogJ2JvdHRvbS1lbmQnO1xuY29uc3QgUExBQ0VNRU5UX1JJR0hUID0gaXNSVEwoKSA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnO1xuY29uc3QgUExBQ0VNRU5UX1RPUENFTlRFUiA9ICd0b3AnO1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTUNFTlRFUiA9ICdib3R0b20nO1xuY29uc3QgRGVmYXVsdCQ5ID0ge1xuICBhdXRvQ2xvc2U6IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICBvZmZzZXQ6IFswLCAyXSxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICByZWZlcmVuY2U6ICd0b2dnbGUnXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkOSA9IHtcbiAgYXV0b0Nsb3NlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGRpc3BsYXk6ICdzdHJpbmcnLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnR8b2JqZWN0KSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIERyb3Bkb3duIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGU7IC8vIGRyb3Bkb3duIHdyYXBwZXJcbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHwgU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fCBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01FTlUsIHRoaXMuX3BhcmVudCk7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDk7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkOTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkYTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24oKSA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KCk7XG4gIH1cbiAgc2hvdygpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9O1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNSwgcmVsYXRlZFRhcmdldCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NyZWF0ZVBvcHBlcigpO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNSwgcmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgfTtcbiAgICB0aGlzLl9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKCk7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSQ1LCByZWxhdGVkVGFyZ2V0KTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJyk7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOJDUsIHJlbGF0ZWRUYXJnZXQpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gc3VwZXIuX2dldENvbmZpZyhjb25maWcpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudChjb25maWcucmVmZXJlbmNlKSAmJiB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUkYS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwicmVmZXJlbmNlXCIgcHJvdmlkZWQgdHlwZSBcIm9iamVjdFwiIHdpdGhvdXQgYSByZXF1aXJlZCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiIG1ldGhvZC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKTtcbiAgICB9XG4gICAgbGV0IHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIGlmICh0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAncGFyZW50Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX3BhcmVudDtcbiAgICB9IGVsc2UgaWYgKGlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSkge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IGdldEVsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlO1xuICAgIH1cbiAgICBjb25zdCBwb3BwZXJDb25maWcgPSB0aGlzLl9nZXRQb3BwZXJDb25maWcoKTtcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZyk7XG4gIH1cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgfVxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50O1xuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRU5EKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9SSUdIVDtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BTVEFSVCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfTEVGVDtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUjtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJztcbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQKSkge1xuICAgICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX1RPUEVORCA6IFBMQUNFTUVOVF9UT1A7XG4gICAgfVxuICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9CT1RUT01FTkQgOiBQTEFDRU1FTlRfQk9UVE9NO1xuICB9XG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsO1xuICB9XG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb2Zmc2V0XG4gICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvZmZzZXQuc3BsaXQoJywnKS5tYXAodmFsdWUgPT4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgY29uc3QgZGVmYXVsdEJzUG9wcGVyQ29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50OiB0aGlzLl9nZXRQbGFjZW1lbnQoKSxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcblxuICAgIC8vIERpc2FibGUgUG9wcGVyIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheSBvciBEcm9wZG93biBpcyBpbiBOYXZiYXJcbiAgICBpZiAodGhpcy5faW5OYXZiYXIgfHwgdGhpcy5fY29uZmlnLmRpc3BsYXkgPT09ICdzdGF0aWMnKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInLCAnc3RhdGljJyk7IC8vIFRPRE86IHY2IHJlbW92ZVxuICAgICAgZGVmYXVsdEJzUG9wcGVyQ29uZmlnLm1vZGlmaWVycyA9IFt7XG4gICAgICAgIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRCc1BvcHBlckNvbmZpZyxcbiAgICAgIC4uLmV4ZWN1dGUodGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZywgW2RlZmF1bHRCc1BvcHBlckNvbmZpZ10pXG4gICAgfTtcbiAgfVxuICBfc2VsZWN0TWVudUl0ZW0oe1xuICAgIGtleSxcbiAgICB0YXJnZXRcbiAgfSkge1xuICAgIGNvbnN0IGl0ZW1zID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9WSVNJQkxFX0lURU1TLCB0aGlzLl9tZW51KS5maWx0ZXIoZWxlbWVudCA9PiBpc1Zpc2libGUoZWxlbWVudCkpO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGFyZ2V0IGlzbid0IGluY2x1ZGVkIGluIGl0ZW1zIChlLmcuIHdoZW4gZXhwYW5kaW5nIHRoZSBkcm9wZG93bilcbiAgICAvLyBhbGxvdyBjeWNsaW5nIHRvIGdldCB0aGUgbGFzdCBpdGVtIGluIGNhc2Uga2V5IGVxdWFscyBBUlJPV19VUF9LRVlcbiAgICBnZXROZXh0QWN0aXZlRWxlbWVudChpdGVtcywgdGFyZ2V0LCBrZXkgPT09IEFSUk9XX0RPV05fS0VZJDEsICFpdGVtcy5pbmNsdWRlcyh0YXJnZXQpKS5mb2N1cygpO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGNsZWFyTWVudXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSBSSUdIVF9NT1VTRV9CVVRUT04gfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgIT09IFRBQl9LRVkkMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcGVuVG9nZ2xlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04pO1xuICAgIGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKTtcbiAgICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpO1xuICAgICAgY29uc3QgaXNNZW51VGFyZ2V0ID0gY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX21lbnUpO1xuICAgICAgaWYgKGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9lbGVtZW50KSB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0IHx8IGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09ICdvdXRzaWRlJyAmJiBpc01lbnVUYXJnZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhYiBuYXZpZ2F0aW9uIHRocm91Z2ggdGhlIGRyb3Bkb3duIG1lbnUgb3IgZXZlbnRzIGZyb20gY29udGFpbmVkIGlucHV0cyBzaG91bGRuJ3QgY2xvc2UgdGhlIG1lbnVcbiAgICAgIGlmIChjb250ZXh0Ll9tZW51LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ID09PSBUQUJfS0VZJDEgfHwgL2lucHV0fHNlbGVjdHxvcHRpb258dGV4dGFyZWF8Zm9ybS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IGNvbnRleHQuX2VsZW1lbnRcbiAgICAgIH07XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGRhdGFBcGlLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgIC8vIElmIG5vdCBhbiBVUCB8IERPV04gfCBFU0NBUEUga2V5ID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAvLyBJZiBpbnB1dC90ZXh0YXJlYSAmJiBpZiBrZXkgaXMgb3RoZXIgdGhhbiBFU0NBUEUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuXG4gICAgY29uc3QgaXNJbnB1dCA9IC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpO1xuICAgIGNvbnN0IGlzRXNjYXBlRXZlbnQgPSBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkkMjtcbiAgICBjb25zdCBpc1VwT3JEb3duRXZlbnQgPSBbQVJST1dfVVBfS0VZJDEsIEFSUk9XX0RPV05fS0VZJDFdLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgaWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzSW5wdXQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICBjb25zdCBnZXRUb2dnbGVCdXR0b24gPSB0aGlzLm1hdGNoZXMoU0VMRUNUT1JfREFUQV9UT0dHTEUkMykgPyB0aGlzIDogU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzKVswXSB8fCBTZWxlY3RvckVuZ2luZS5uZXh0KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMpWzBdIHx8IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgZXZlbnQuZGVsZWdhdGVUYXJnZXQucGFyZW50Tm9kZSk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKGdldFRvZ2dsZUJ1dHRvbik7XG4gICAgaWYgKGlzVXBPckRvd25FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UuX2lzU2hvd24oKSkge1xuICAgICAgLy8gZWxzZSBpcyBlc2NhcGUgYW5kIHdlIGNoZWNrIGlmIGl0IGlzIHNob3duXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICAgIGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9NRU5VLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBEcm9wZG93bi5jbGVhck1lbnVzKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS50b2dnbGUoKTtcbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihEcm9wZG93bik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2JhY2tkcm9wLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkOSA9ICdiYWNrZHJvcCc7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUkNCA9ICdmYWRlJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ1ID0gJ3Nob3cnO1xuY29uc3QgRVZFTlRfTU9VU0VET1dOID0gYG1vdXNlZG93bi5icy4ke05BTUUkOX1gO1xuY29uc3QgRGVmYXVsdCQ4ID0ge1xuICBjbGFzc05hbWU6ICdtb2RhbC1iYWNrZHJvcCcsXG4gIGNsaWNrQ2FsbGJhY2s6IG51bGwsXG4gIGlzQW5pbWF0ZWQ6IGZhbHNlLFxuICBpc1Zpc2libGU6IHRydWUsXG4gIC8vIGlmIGZhbHNlLCB3ZSB1c2UgdGhlIGJhY2tkcm9wIGhlbHBlciB3aXRob3V0IGFkZGluZyBhbnkgZWxlbWVudCB0byB0aGUgZG9tXG4gIHJvb3RFbGVtZW50OiAnYm9keScgLy8gZ2l2ZSB0aGUgY2hvaWNlIHRvIHBsYWNlIGJhY2tkcm9wIHVuZGVyIGRpZmZlcmVudCBlbGVtZW50c1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDggPSB7XG4gIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gIGNsaWNrQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gIGlzVmlzaWJsZTogJ2Jvb2xlYW4nLFxuICByb290RWxlbWVudDogJyhlbGVtZW50fHN0cmluZyknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkODtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ4O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ5O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hcHBlbmQoKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgcmVmbG93KGVsZW1lbnQpO1xuICAgIH1cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDUpO1xuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgaGlkZShjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2dldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV04pO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0RWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lO1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFJDQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudCA9IGJhY2tkcm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICBjb25maWcucm9vdEVsZW1lbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfYXBwZW5kKCkge1xuICAgIGlmICh0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KCk7XG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KTtcbiAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOLCAoKSA9PiB7XG4gICAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5jbGlja0NhbGxiYWNrKTtcbiAgICB9KTtcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gdHJ1ZTtcbiAgfVxuICBfZW11bGF0ZUFuaW1hdGlvbihjYWxsYmFjaykge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIHRoaXMuX2dldEVsZW1lbnQoKSwgdGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2ZvY3VzdHJhcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDggPSAnZm9jdXN0cmFwJztcbmNvbnN0IERBVEFfS0VZJDUgPSAnYnMuZm9jdXN0cmFwJztcbmNvbnN0IEVWRU5UX0tFWSQ1ID0gYC4ke0RBVEFfS0VZJDV9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4kMiA9IGBmb2N1c2luJHtFVkVOVF9LRVkkNX1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWSQ1fWA7XG5jb25zdCBUQUJfS0VZID0gJ1RhYic7XG5jb25zdCBUQUJfTkFWX0ZPUldBUkQgPSAnZm9yd2FyZCc7XG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJztcbmNvbnN0IERlZmF1bHQkNyA9IHtcbiAgYXV0b2ZvY3VzOiB0cnVlLFxuICB0cmFwRWxlbWVudDogbnVsbCAvLyBUaGUgZWxlbWVudCB0byB0cmFwIGZvY3VzIGluc2lkZSBvZlxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDcgPSB7XG4gIGF1dG9mb2N1czogJ2Jvb2xlYW4nLFxuICB0cmFwRWxlbWVudDogJ2VsZW1lbnQnXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGw7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ3O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDc7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDg7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZJDUpOyAvLyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGZvY3VzIGxvb3BcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0ZPQ1VTSU4kMiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlRm9jdXNpbihldmVudCkpO1xuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9UQUIsIGV2ZW50ID0+IHRoaXMuX2hhbmRsZUtleWRvd24oZXZlbnQpKTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gIH1cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZJDUpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyYXBFbGVtZW50XG4gICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBkb2N1bWVudCB8fCBldmVudC50YXJnZXQgPT09IHRyYXBFbGVtZW50IHx8IHRyYXBFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5mb2N1c2FibGVDaGlsZHJlbih0cmFwRWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPT09IFRBQl9OQVZfQkFDS1dBUkQpIHtcbiAgICAgIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRzWzBdLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gVEFCX0tFWSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXkgPyBUQUJfTkFWX0JBQ0tXQVJEIDogVEFCX05BVl9GT1JXQVJEO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Njcm9sbEJhci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuY29uc3QgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnO1xuY29uc3QgUFJPUEVSVFlfUEFERElORyA9ICdwYWRkaW5nLXJpZ2h0JztcbmNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnO1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxCYXJIZWxwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBnZXRXaWR0aCgpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2lubmVyV2lkdGgjdXNhZ2Vfbm90ZXNcbiAgICBjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgdGhpcy5fZGlzYWJsZU92ZXJGbG93KCk7XG4gICAgLy8gZ2l2ZSBwYWRkaW5nIHRvIGVsZW1lbnQgdG8gYmFsYW5jZSB0aGUgaGlkZGVuIHNjcm9sbGJhciB3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgLy8gdHJpY2s6IFdlIGFkanVzdCBwb3NpdGl2ZSBwYWRkaW5nUmlnaHQgYW5kIG5lZ2F0aXZlIG1hcmdpblJpZ2h0IHRvIHN0aWNreS10b3AgZWxlbWVudHMgdG8ga2VlcCBzaG93aW5nIGZ1bGx3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKTtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HKTtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pO1xuICB9XG4gIGlzT3ZlcmZsb3dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDA7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUodGhpcy5fZWxlbWVudCwgJ292ZXJmbG93Jyk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB9XG4gIF9zZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuZ2V0V2lkdGgoKTtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQgJiYgd2luZG93LmlubmVyV2lkdGggPiBlbGVtZW50LmNsaWVudFdpZHRoICsgc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSk7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkVmFsdWUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApO1xuICAgIH07XG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spO1xuICB9XG4gIF9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSk7XG4gICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHksIGFjdHVhbFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHkpIHtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvcGVydHkgaWYgdGhlIHZhbHVlIGlzIGBudWxsYDsgdGhlIHZhbHVlIGNhbiBhbHNvIGJlIHplcm9cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjayk7XG4gIH1cbiAgX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxCYWNrKSB7XG4gICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxCYWNrKHNlbGVjdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWwgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGNhbGxCYWNrKHNlbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBtb2RhbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDcgPSAnbW9kYWwnO1xuY29uc3QgREFUQV9LRVkkNCA9ICdicy5tb2RhbCc7XG5jb25zdCBFVkVOVF9LRVkkNCA9IGAuJHtEQVRBX0tFWSQ0fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMiA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVNDQVBFX0tFWSQxID0gJ0VzY2FwZSc7XG5jb25zdCBFVkVOVF9ISURFJDQgPSBgaGlkZSR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEJDEgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0hJRERFTiQ0ID0gYGhpZGRlbiR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1NIT1ckNCA9IGBzaG93JHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfU0hPV04kNCA9IGBzaG93biR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1JFU0laRSQxID0gYHJlc2l6ZSR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RJU01JU1MgPSBgY2xpY2suZGlzbWlzcyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gYG1vdXNlZG93bi5kaXNtaXNzJHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTJDEgPSBga2V5ZG93bi5kaXNtaXNzJHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiA9IGBjbGljayR7RVZFTlRfS0VZJDR9JHtEQVRBX0FQSV9LRVkkMn1gO1xuY29uc3QgQ0xBU1NfTkFNRV9PUEVOID0gJ21vZGFsLW9wZW4nO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDMgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNCA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYyc7XG5jb25zdCBPUEVOX1NFTEVDVE9SJDEgPSAnLm1vZGFsLnNob3cnO1xuY29uc3QgU0VMRUNUT1JfRElBTE9HID0gJy5tb2RhbC1kaWFsb2cnO1xuY29uc3QgU0VMRUNUT1JfTU9EQUxfQk9EWSA9ICcubW9kYWwtYm9keSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCJdJztcbmNvbnN0IERlZmF1bHQkNiA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGZvY3VzOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDYgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGZvY3VzOiAnYm9vbGVhbicsXG4gIGtleWJvYXJkOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5fZGlhbG9nID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9ESUFMT0csIHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDY7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkNjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkNztcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNCwge1xuICAgICAgcmVsYXRlZFRhcmdldFxuICAgIH0pO1xuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKCk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygoKSA9PiB0aGlzLl9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUkNCk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ0KTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2hpZGVNb2RhbCgpLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih3aW5kb3csIEVWRU5UX0tFWSQ0KTtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2RpYWxvZywgRVZFTlRfS0VZJDQpO1xuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSxcbiAgICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRoaXMuX2lzQW5pbWF0ZWQoKVxuICAgIH0pO1xuICB9XG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAvLyB0cnkgdG8gYXBwZW5kIGR5bmFtaWMgbW9kYWxcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIGNvbnN0IG1vZGFsQm9keSA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTU9EQUxfQk9EWSwgdGhpcy5fZGlhbG9nKTtcbiAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNCk7XG4gICAgY29uc3QgdHJhbnNpdGlvbkNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNCwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gIH1cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MkMSwgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSQxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICB9KTtcbiAgICBFdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUkMSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgIXRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIC8vIGEgYmFkIHRyaWNrIHRvIHNlZ3JlZ2F0ZSBjbGlja3MgdGhhdCBtYXkgc3RhcnQgaW5zaWRlIGRpYWxvZyBidXQgZW5kIG91dHNpZGUsIGFuZCBhdm9pZCBsaXN0ZW4gdG8gc2Nyb2xsYmFyIGNsaWNrc1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9DTElDS19ESVNNSVNTLCBldmVudDIgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgX2hpZGVNb2RhbCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKTtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfT1BFTik7XG4gICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKCk7XG4gICAgICB0aGlzLl9zY3JvbGxCYXIucmVzZXQoKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQ0KTtcbiAgICB9KTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDMpO1xuICB9XG4gIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEJDEpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgaW5pdGlhbE92ZXJmbG93WSA9IHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZO1xuICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgIGlmIChpbml0aWFsT3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NUQVRJQykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaW5pdGlhbE92ZXJmbG93WTtcbiAgICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgfSwgdGhpcy5fZGlhbG9nKTtcbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICovXG5cbiAgX2FkanVzdERpYWxvZygpIHtcbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKTtcbiAgICBjb25zdCBpc0JvZHlPdmVyZmxvd2luZyA9IHNjcm9sbGJhcldpZHRoID4gMDtcbiAgICBpZiAoaXNCb2R5T3ZlcmZsb3dpbmcgJiYgIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgfVxuICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IGlzUlRMKCkgPyAncGFkZGluZ1JpZ2h0JyA6ICdwYWRkaW5nTGVmdCc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YDtcbiAgICB9XG4gIH1cbiAgX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJyc7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10ocmVsYXRlZFRhcmdldCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9TSE9XJDQsIHNob3dFdmVudCA9PiB7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4kNCwgKCkgPT4ge1xuICAgICAgaWYgKGlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGF2b2lkIGNvbmZsaWN0IHdoZW4gY2xpY2tpbmcgbW9kYWwgdG9nZ2xlciB3aGlsZSBhbm90aGVyIG9uZSBpcyBvcGVuXG4gIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SJDEpO1xuICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICBNb2RhbC5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gIGRhdGEudG9nZ2xlKHRoaXMpO1xufSk7XG5lbmFibGVEaXNtaXNzVHJpZ2dlcihNb2RhbCk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG9mZmNhbnZhcy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDYgPSAnb2ZmY2FudmFzJztcbmNvbnN0IERBVEFfS0VZJDMgPSAnYnMub2ZmY2FudmFzJztcbmNvbnN0IEVWRU5UX0tFWSQzID0gYC4ke0RBVEFfS0VZJDN9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQxID0gJy5kYXRhLWFwaSc7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDIgPSBgbG9hZCR7RVZFTlRfS0VZJDN9JHtEQVRBX0FQSV9LRVkkMX1gO1xuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XJDMgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkckMSA9ICdzaG93aW5nJztcbmNvbnN0IENMQVNTX05BTUVfSElESU5HID0gJ2hpZGluZyc7XG5jb25zdCBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ29mZmNhbnZhcy1iYWNrZHJvcCc7XG5jb25zdCBPUEVOX1NFTEVDVE9SID0gJy5vZmZjYW52YXMuc2hvdyc7XG5jb25zdCBFVkVOVF9TSE9XJDMgPSBgc2hvdyR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDMgPSBgc2hvd24ke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURFJDMgPSBgaGlkZSR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMyA9IGBoaWRkZW4ke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9SRVNJWkUgPSBgcmVzaXplJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSA9IGBjbGljayR7RVZFTlRfS0VZJDN9JHtEQVRBX0FQSV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJztcbmNvbnN0IERlZmF1bHQkNSA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkNSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgc2Nyb2xsOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE9mZmNhbnZhcyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpO1xuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKTtcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkNTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ1O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ2O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgfVxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XJDMsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNTaG93biA9IHRydWU7XG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygpO1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKTtcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HJDEpO1xuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwgfHwgdGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQzKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkckMSk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiQzLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCB0aGlzLl9lbGVtZW50LCB0cnVlKTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDMpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURJTkcpO1xuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQzLCBDTEFTU19OQU1FX0hJRElORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgICBuZXcgU2Nyb2xsQmFySGVscGVyKCkucmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQzKTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgY29uc3QgY2xpY2tDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZVxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKTtcbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGNsYXNzTmFtZTogQ0xBU1NfTkFNRV9CQUNLRFJPUCxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRydWUsXG4gICAgICByb290RWxlbWVudDogdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgY2xpY2tDYWxsYmFjazogaXNWaXNpYmxlID8gY2xpY2tDYWxsYmFjayA6IG51bGxcbiAgICB9KTtcbiAgfVxuICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICB0cmFwRWxlbWVudDogdGhpcy5fZWxlbWVudFxuICAgIH0pO1xuICB9XG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10odGhpcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4kMywgKCkgPT4ge1xuICAgIC8vIGZvY3VzIG9uIHRyaWdnZXIgd2hlbiBpdCBpcyBjbG9zZWRcbiAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUik7XG4gIGlmIChhbHJlYWR5T3BlbiAmJiBhbHJlYWR5T3BlbiAhPT0gdGFyZ2V0KSB7XG4gICAgT2ZmY2FudmFzLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKCk7XG4gIH1cbiAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gIGRhdGEudG9nZ2xlKHRoaXMpO1xufSk7XG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJJDIsICgpID0+IHtcbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpKSB7XG4gICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2Uoc2VsZWN0b3IpLnNob3coKTtcbiAgfVxufSk7XG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoJ1thcmlhLW1vZGFsXVtjbGFzcyo9c2hvd11bY2xhc3MqPW9mZmNhbnZhcy1dJykpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCkuaGlkZSgpO1xuICAgIH1cbiAgfVxufSk7XG5lbmFibGVEaXNtaXNzVHJpZ2dlcihPZmZjYW52YXMpO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihPZmZjYW52YXMpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zYW5pdGl6ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vLyBqcy1kb2NzLXN0YXJ0IGFsbG93LWxpc3RcbmNvbnN0IEFSSUFfQVRUUklCVVRFX1BBVFRFUk4gPSAvXmFyaWEtW1xcdy1dKiQvaTtcbmNvbnN0IERlZmF1bHRBbGxvd2xpc3QgPSB7XG4gIC8vIEdsb2JhbCBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gYW55IHN1cHBsaWVkIGVsZW1lbnQgYmVsb3cuXG4gICcqJzogWydjbGFzcycsICdkaXInLCAnaWQnLCAnbGFuZycsICdyb2xlJywgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTl0sXG4gIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gIGFyZWE6IFtdLFxuICBiOiBbXSxcbiAgYnI6IFtdLFxuICBjb2w6IFtdLFxuICBjb2RlOiBbXSxcbiAgZGQ6IFtdLFxuICBkaXY6IFtdLFxuICBkbDogW10sXG4gIGR0OiBbXSxcbiAgZW06IFtdLFxuICBocjogW10sXG4gIGgxOiBbXSxcbiAgaDI6IFtdLFxuICBoMzogW10sXG4gIGg0OiBbXSxcbiAgaDU6IFtdLFxuICBoNjogW10sXG4gIGk6IFtdLFxuICBpbWc6IFsnc3JjJywgJ3NyY3NldCcsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIGxpOiBbXSxcbiAgb2w6IFtdLFxuICBwOiBbXSxcbiAgcHJlOiBbXSxcbiAgczogW10sXG4gIHNtYWxsOiBbXSxcbiAgc3BhbjogW10sXG4gIHN1YjogW10sXG4gIHN1cDogW10sXG4gIHN0cm9uZzogW10sXG4gIHU6IFtdLFxuICB1bDogW11cbn07XG4vLyBqcy1kb2NzLWVuZCBhbGxvdy1saXN0XG5cbmNvbnN0IHVyaUF0dHJpYnV0ZXMgPSBuZXcgU2V0KFsnYmFja2dyb3VuZCcsICdjaXRlJywgJ2hyZWYnLCAnaXRlbXR5cGUnLCAnbG9uZ2Rlc2MnLCAncG9zdGVyJywgJ3NyYycsICd4bGluazpocmVmJ10pO1xuXG4vKipcbiAqIEEgcGF0dGVybiB0aGF0IHJlY29nbml6ZXMgVVJMcyB0aGF0IGFyZSBzYWZlIHdydC4gWFNTIGluIFVSTCBuYXZpZ2F0aW9uXG4gKiBjb250ZXh0cy5cbiAqXG4gKiBTaG91dC1vdXQgdG8gQW5ndWxhciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvMTUuMi44L3BhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi91cmxfc2FuaXRpemVyLnRzI0wzOFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItcmVnZXhcbmNvbnN0IFNBRkVfVVJMX1BBVFRFUk4gPSAvXig/IWphdmFzY3JpcHQ6KSg/OlthLXowLTkrLi1dKzp8W14mOi8/I10qKD86Wy8/I118JCkpL2k7XG5jb25zdCBhbGxvd2VkQXR0cmlidXRlID0gKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZUxpc3QpID0+IHtcbiAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoYWxsb3dlZEF0dHJpYnV0ZUxpc3QuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICBpZiAodXJpQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKFNBRkVfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGVzIHRoZSBhdHRyaWJ1dGUuXG4gIHJldHVybiBhbGxvd2VkQXR0cmlidXRlTGlzdC5maWx0ZXIoYXR0cmlidXRlUmVnZXggPT4gYXR0cmlidXRlUmVnZXggaW5zdGFuY2VvZiBSZWdFeHApLnNvbWUocmVnZXggPT4gcmVnZXgudGVzdChhdHRyaWJ1dGVOYW1lKSk7XG59O1xuZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWwsIGFsbG93TGlzdCwgc2FuaXRpemVGdW5jdGlvbikge1xuICBpZiAoIXVuc2FmZUh0bWwubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc2FmZUh0bWw7XG4gIH1cbiAgaWYgKHNhbml0aXplRnVuY3Rpb24gJiYgdHlwZW9mIHNhbml0aXplRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FuaXRpemVGdW5jdGlvbih1bnNhZmVIdG1sKTtcbiAgfVxuICBjb25zdCBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuICBjb25zdCBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4uY3JlYXRlZERvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpKTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbGxvd0xpc3QpLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVMaXN0ID0gW10uY29uY2F0KC4uLmVsZW1lbnQuYXR0cmlidXRlcyk7XG4gICAgY29uc3QgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQoYWxsb3dMaXN0WycqJ10gfHwgW10sIGFsbG93TGlzdFtlbGVtZW50TmFtZV0gfHwgW10pO1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUxpc3QpIHtcbiAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubm9kZU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY3JlYXRlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MO1xufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkNSA9ICdUZW1wbGF0ZUZhY3RvcnknO1xuY29uc3QgRGVmYXVsdCQ0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGNvbnRlbnQ6IHt9LFxuICAvLyB7IHNlbGVjdG9yIDogdGV4dCAsICBzZWxlY3RvcjIgOiB0ZXh0MiAsIH1cbiAgZXh0cmFDbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2Pidcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ0ID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBjb250ZW50OiAnb2JqZWN0JyxcbiAgZXh0cmFDbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgaHRtbDogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnXG59O1xuY29uc3QgRGVmYXVsdENvbnRlbnRUeXBlID0ge1xuICBlbnRyeTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xlbGVtZW50KSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRlbXBsYXRlRmFjdG9yeSBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ0O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDQ7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9jb25maWcuY29udGVudCkubWFwKGNvbmZpZyA9PiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb25maWcpKS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cbiAgaGFzQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoID4gMDtcbiAgfVxuICBjaGFuZ2VDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgdGhpcy5fY29uZmlnLmNvbnRlbnQgPSB7XG4gICAgICAuLi50aGlzLl9jb25maWcuY29udGVudCxcbiAgICAgIC4uLmNvbnRlbnRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRvSHRtbCgpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0ZW1wbGF0ZVdyYXBwZXIuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZSh0aGlzLl9jb25maWcudGVtcGxhdGUpO1xuICAgIGZvciAoY29uc3QgW3NlbGVjdG9yLCB0ZXh0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcuY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3NldENvbnRlbnQodGVtcGxhdGVXcmFwcGVyLCB0ZXh0LCBzZWxlY3Rvcik7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVXcmFwcGVyLmNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IGV4dHJhQ2xhc3MgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuZXh0cmFDbGFzcyk7XG4gICAgaWYgKGV4dHJhQ2xhc3MpIHtcbiAgICAgIHRlbXBsYXRlLmNsYXNzTGlzdC5hZGQoLi4uZXh0cmFDbGFzcy5zcGxpdCgnICcpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZykge1xuICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29uZmlnLmNvbnRlbnQpO1xuICB9XG4gIF9jaGVja0NvbnRlbnQoYXJnKSB7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGFyZykpIHtcbiAgICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoe1xuICAgICAgICBzZWxlY3RvcixcbiAgICAgICAgZW50cnk6IGNvbnRlbnRcbiAgICAgIH0sIERlZmF1bHRDb250ZW50VHlwZSk7XG4gICAgfVxuICB9XG4gIF9zZXRDb250ZW50KHRlbXBsYXRlLCBjb250ZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIHRlbXBsYXRlKTtcbiAgICBpZiAoIXRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZW50ID0gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oY29udGVudCk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQoY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3B1dEVsZW1lbnRJblRlbXBsYXRlKGdldEVsZW1lbnQoY29udGVudCksIHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUoY29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gIH1cbiAgX21heWJlU2FuaXRpemUoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSA/IHNhbml0aXplSHRtbChhcmcsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKSA6IGFyZztcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpc10pO1xuICB9XG4gIF9wdXRFbGVtZW50SW5UZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmh0bWwpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ0ID0gJ3Rvb2x0aXAnO1xuY29uc3QgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gbmV3IFNldChbJ3Nhbml0aXplJywgJ2FsbG93TGlzdCcsICdzYW5pdGl6ZUZuJ10pO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDIgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX01PREFMID0gJ21vZGFsJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQyID0gJ3Nob3cnO1xuY29uc3QgU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiA9ICcudG9vbHRpcC1pbm5lcic7XG5jb25zdCBTRUxFQ1RPUl9NT0RBTCA9IGAuJHtDTEFTU19OQU1FX01PREFMfWA7XG5jb25zdCBFVkVOVF9NT0RBTF9ISURFID0gJ2hpZGUuYnMubW9kYWwnO1xuY29uc3QgVFJJR0dFUl9IT1ZFUiA9ICdob3Zlcic7XG5jb25zdCBUUklHR0VSX0ZPQ1VTID0gJ2ZvY3VzJztcbmNvbnN0IFRSSUdHRVJfQ0xJQ0sgPSAnY2xpY2snO1xuY29uc3QgVFJJR0dFUl9NQU5VQUwgPSAnbWFudWFsJztcbmNvbnN0IEVWRU5UX0hJREUkMiA9ICdoaWRlJztcbmNvbnN0IEVWRU5UX0hJRERFTiQyID0gJ2hpZGRlbic7XG5jb25zdCBFVkVOVF9TSE9XJDIgPSAnc2hvdyc7XG5jb25zdCBFVkVOVF9TSE9XTiQyID0gJ3Nob3duJztcbmNvbnN0IEVWRU5UX0lOU0VSVEVEID0gJ2luc2VydGVkJztcbmNvbnN0IEVWRU5UX0NMSUNLJDEgPSAnY2xpY2snO1xuY29uc3QgRVZFTlRfRk9DVVNJTiQxID0gJ2ZvY3VzaW4nO1xuY29uc3QgRVZFTlRfRk9DVVNPVVQkMSA9ICdmb2N1c291dCc7XG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gJ21vdXNlZW50ZXInO1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSA9ICdtb3VzZWxlYXZlJztcbmNvbnN0IEF0dGFjaG1lbnRNYXAgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgVE9QOiAndG9wJyxcbiAgUklHSFQ6IGlzUlRMKCkgPyAnbGVmdCcgOiAncmlnaHQnLFxuICBCT1RUT006ICdib3R0b20nLFxuICBMRUZUOiBpc1JUTCgpID8gJ3JpZ2h0JyA6ICdsZWZ0J1xufTtcbmNvbnN0IERlZmF1bHQkMyA9IHtcbiAgYWxsb3dMaXN0OiBEZWZhdWx0QWxsb3dsaXN0LFxuICBhbmltYXRpb246IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgY29udGFpbmVyOiBmYWxzZSxcbiAgY3VzdG9tQ2xhc3M6ICcnLFxuICBkZWxheTogMCxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLFxuICBodG1sOiBmYWxzZSxcbiAgb2Zmc2V0OiBbMCwgNl0sXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgc2FuaXRpemU6IHRydWUsXG4gIHNhbml0aXplRm46IG51bGwsXG4gIHNlbGVjdG9yOiBmYWxzZSxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj4nICsgJzwvZGl2PicsXG4gIHRpdGxlOiAnJyxcbiAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDMgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICBjb250YWluZXI6ICcoc3RyaW5nfGVsZW1lbnR8Ym9vbGVhbiknLFxuICBjdXN0b21DbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgZGVsYXk6ICcobnVtYmVyfG9iamVjdCknLFxuICBmYWxsYmFja1BsYWNlbWVudHM6ICdhcnJheScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgb2Zmc2V0OiAnKGFycmF5fHN0cmluZ3xmdW5jdGlvbiknLFxuICBwbGFjZW1lbnQ6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnLFxuICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICB0cmlnZ2VyOiAnc3RyaW5nJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgdG9vbHRpcHMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKTtcbiAgICB9XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX3RpbWVvdXQgPSAwO1xuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGw7XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IHt9O1xuICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbnVsbDtcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gbnVsbDtcblxuICAgIC8vIFByb3RlY3RlZFxuICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKTtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQzO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDM7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDQ7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gIH1cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWQ7XG4gIH1cbiAgdG9nZ2xlKCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljaztcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9sZWF2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbnRlcigpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgfVxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1ckMikpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdCh0aGlzLl9lbGVtZW50KTtcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKTtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXJcbiAgICB9ID0gdGhpcy5fY29uZmlnO1xuICAgIGlmICghdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmQodGlwKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSk7XG4gICAgfVxuICAgIHRoaXMuX3BvcHBlciA9IHRoaXMuX2NyZWF0ZVBvcHBlcih0aXApO1xuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQyKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOJDIpKTtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSQyKSk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKTtcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbDsgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTiQyKSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb3RlY3RlZFxuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKTtcbiAgfVxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRpcDtcbiAgfVxuICBfY3JlYXRlVGlwRWxlbWVudChjb250ZW50KSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpLnRvSHRtbCgpO1xuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSQyLCBDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgLy8gVE9ETzogdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApO1xuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKTtcbiAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUkMik7XG4gICAgfVxuICAgIHJldHVybiB0aXA7XG4gIH1cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeS5jaGFuZ2VDb250ZW50KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVGYWN0b3J5O1xuICB9XG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH07XG4gIH1cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDIpO1xuICB9XG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICB9XG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSk7XG4gICAgY29uc3QgYXR0YWNobWVudCA9IEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIHJldHVybiBQb3BwZXIuY3JlYXRlUG9wcGVyKHRoaXMuX2VsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKTtcbiAgfVxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFxuICAgIH0gPSB0aGlzLl9jb25maWc7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudF0pO1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogYXR0YWNobWVudCxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgLy8gUHJlLXNldCBQb3BwZXIncyBwbGFjZW1lbnQgYXR0cmlidXRlIGluIG9yZGVyIHRvIHJlYWQgdGhlIGFycm93IHNpemVzIHByb3Blcmx5LlxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9O1xuICB9XG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLl9jb25maWcudHJpZ2dlci5zcGxpdCgnICcpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2Vycykge1xuICAgICAgaWYgKHRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0NMSUNLJDEpLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0LnRvZ2dsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgPyB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9NT1VTRUVOVEVSKSA6IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4kMSk7XG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDogdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfRk9DVVNPVVQkMSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWU7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCk7XG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNvdXQnID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpO1xuICB9XG4gIF9maXhUaXRsZSgpIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJywgdGl0bGUpOyAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICB9XG4gIF9lbnRlcigpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpIHx8IHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LnNob3cpO1xuICB9XG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpO1xuICB9XG4gIF9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCk7XG4gIH1cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uZGF0YUF0dHJpYnV0ZXMsXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pXG4gICAgfTtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpO1xuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKTtcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKSkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25maWcuc2VsZWN0b3IgPSBmYWxzZTtcbiAgICBjb25maWcudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZGlzcG9zZVBvcHBlcigpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcC5yZW1vdmUoKTtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgIH1cbiAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDMgPSAncG9wb3Zlcic7XG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuY29uc3QgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcbmNvbnN0IERlZmF1bHQkMiA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgKyAnPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPicgKyAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgKyAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDIgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdFR5cGUsXG4gIGNvbnRlbnQ6ICcobnVsbHxzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDI7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkMjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMztcbiAgfVxuXG4gIC8vIE92ZXJyaWRlc1xuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VGl0bGUoKSB8fCB0aGlzLl9nZXRDb250ZW50KCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH07XG4gIH1cbiAgX2dldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jb250ZW50KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oUG9wb3Zlcik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBzY3JvbGxzcHkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQyID0gJ3Njcm9sbHNweSc7XG5jb25zdCBEQVRBX0tFWSQyID0gJ2JzLnNjcm9sbHNweSc7XG5jb25zdCBFVkVOVF9LRVkkMiA9IGAuJHtEQVRBX0tFWSQyfWA7XG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVkkMn1gO1xuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWSQyfWA7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDEgPSBgbG9hZCR7RVZFTlRfS0VZJDJ9JHtEQVRBX0FQSV9LRVl9YDtcbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDEgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSc7XG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnO1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSc7XG5jb25zdCBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nO1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWA7XG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nO1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFJDEgPSAnLmRyb3Bkb3duLXRvZ2dsZSc7XG5jb25zdCBEZWZhdWx0JDEgPSB7XG4gIG9mZnNldDogbnVsbCxcbiAgLy8gVE9ETzogdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJzBweCAwcHggLTI1JScsXG4gIHNtb290aFNjcm9sbDogZmFsc2UsXG4gIHRhcmdldDogbnVsbCxcbiAgdGhyZXNob2xkOiBbMC4xLCAwLjUsIDFdXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkMSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsXG4gIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIHRoaXMuX2VsZW1lbnQgaXMgdGhlIG9ic2VydmFibGVzQ29udGFpbmVyIGFuZCBjb25maWcudGFyZ2V0IHRoZSBtZW51IGxpbmtzIHdyYXBwZXJcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnQ7XG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7XG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfTtcbiAgICB0aGlzLnJlZnJlc2goKTsgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkMTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQxO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQyO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpO1xuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCk7XG4gICAgaWYgKHRoaXMuX29ic2VydmVyKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZShzZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVucmVnaXN0ZXIgYW55IHByZXZpb3VzIGxpc3RlbmVyc1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fY29uZmlnLnRhcmdldCwgRVZFTlRfQ0xJQ0spO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpO1xuICAgICAgaWYgKG9ic2VydmFibGVTZWN0aW9uKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3c7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICBpZiAocm9vdC5zY3JvbGxUbykge1xuICAgICAgICAgIHJvb3Quc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wOiBoZWlnaHQsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaHJvbWUgNjAgZG9lc24ndCBzdXBwb3J0IGBzY3JvbGxUb2BcbiAgICAgICAgcm9vdC5zY3JvbGxUb3AgPSBoZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgX2dldE5ld09ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLl9yb290RWxlbWVudCxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fY29uZmlnLnRocmVzaG9sZCxcbiAgICAgIHJvb3RNYXJnaW46IHRoaXMuX2NvbmZpZy5yb290TWFyZ2luXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBUaGUgbG9naWMgb2Ygc2VsZWN0aW9uXG4gIF9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZW50cnkgPT4gdGhpcy5fdGFyZ2V0TGlua3MuZ2V0KGAjJHtlbnRyeS50YXJnZXQuaWR9YCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcDtcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgIH07XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHVzZXJTY3JvbGxzRG93biA9IHBhcmVudFNjcm9sbFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wO1xuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3A7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcDtcbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgZG93biwgcGljayB0aGUgYmlnZ2VyIG9mZnNldFRvcFxuICAgICAgaWYgKHVzZXJTY3JvbGxzRG93biAmJiBlbnRyeUlzTG93ZXJUaGFuUHJldmlvdXMpIHtcbiAgICAgICAgYWN0aXZhdGUoZW50cnkpO1xuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKSB7XG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHRhcmdldExpbmtzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KTtcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpO1xuICAgICAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMuc2V0KGFuY2hvci5oYXNoLCBvYnNlcnZhYmxlU2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcbiAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB0aGlzLl9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG4gIH1cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSwgdGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04pKS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICBjb25zdCBhY3RpdmVOb2RlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoYCR7U0VMRUNUT1JfVEFSR0VUX0xJTktTfS4ke0NMQVNTX05BTUVfQUNUSVZFJDF9YCwgcGFyZW50KTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYWN0aXZlTm9kZXMpIHtcbiAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihTY3JvbGxTcHkpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkMSA9ICd0YWInO1xuY29uc3QgREFUQV9LRVkkMSA9ICdicy50YWInO1xuY29uc3QgRVZFTlRfS0VZJDEgPSBgLiR7REFUQV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfSElERSQxID0gYGhpZGUke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9TSE9XJDEgPSBgc2hvdyR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDEgPSBgc2hvd24ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0tFWURPV04gPSBga2V5ZG93biR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCc7XG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCc7XG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSc7XG5jb25zdCBFTkRfS0VZID0gJ0VuZCc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDEgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckMSA9ICdzaG93JztcbmNvbnN0IENMQVNTX0RST1BET1dOID0gJ2Ryb3Bkb3duJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgO1xuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nO1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJzsgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTCk7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKTtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgPyBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUkMSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtXG4gICAgfSkgOiBudWxsO1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVyQxLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiBhY3RpdmVcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pO1xuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSk7IC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04kMSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkMSkpO1xuICB9XG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgZWxlbWVudC5ibHVyKCk7XG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKTsgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiQxLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQxKSk7XG4gIH1cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIVtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maWx0ZXIoZWxlbWVudCA9PiAhaXNEaXNhYmxlZChlbGVtZW50KSk7XG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50O1xuICAgIGlmIChbSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gY2hpbGRyZW5bZXZlbnQua2V5ID09PSBIT01FX0tFWSA/IDAgOiBjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKG5leHRBY3RpdmVFbGVtZW50KS5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRDaGlsZHJlbigpIHtcbiAgICAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KTtcbiAgfVxuICBfZ2V0QWN0aXZlRWxlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maW5kKGNoaWxkID0+IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZCkpIHx8IG51bGw7XG4gIH1cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfVxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKSB7XG4gICAgY2hpbGQgPSB0aGlzLl9nZXRJbm5lckVsZW1lbnQoY2hpbGQpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKTtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpO1xuICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGlzQWN0aXZlKTtcbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhjaGlsZCwgJ3JvbGUnLCAndGFiJyk7XG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpO1xuICB9XG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGNoaWxkKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJyk7XG4gICAgaWYgKGNoaWxkLmlkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdhcmlhLWxhYmVsbGVkYnknLCBgJHtjaGlsZC5pZH1gKTtcbiAgICB9XG4gIH1cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKTtcbiAgfVxuICBfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSk7XG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBpbm5lciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWxpbmspXG4gIF9nZXRJbm5lckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLm1hdGNoZXMoU0VMRUNUT1JfSU5ORVJfRUxFTSkgPyBlbGVtIDogU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTk5FUl9FTEVNLCBlbGVtKTtcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpO1xufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KTtcbiAgfVxufSk7XG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b2FzdCc7XG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCc7XG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZSc7IC8vIEBkZXByZWNhdGVkIC0ga2VwdCBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZyc7XG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGF1dG9oaWRlOiAnYm9vbGVhbicsXG4gIGRlbGF5OiAnbnVtYmVyJ1xufTtcbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb2FzdCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdDtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHtcbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pO1xuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKTtcbiAgICB9O1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpOyAvLyBAZGVwcmVjYXRlZFxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcsIENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgIH07XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbik7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfbWF5YmVTY2hlZHVsZUhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gfHwgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkpO1xuICB9XG4gIF9vbkludGVyYWN0aW9uKGV2ZW50LCBpc0ludGVyYWN0aW5nKSB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3Rpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3Rpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW50ZXJhY3RpbmcpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgPT09IG5leHRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnQuY29udGFpbnMobmV4dEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKCk7XG4gIH1cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VPVkVSLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0ZPQ1VTT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpO1xuICB9XG4gIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9hc3QuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihUb2FzdCk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvYXN0KTtcblxuZXhwb3J0IHsgQWxlcnQsIEJ1dHRvbiwgQ2Fyb3VzZWwsIENvbGxhcHNlLCBEcm9wZG93biwgTW9kYWwsIE9mZmNhbnZhcywgUG9wb3ZlciwgU2Nyb2xsU3B5LCBUYWIsIFRvYXN0LCBUb29sdGlwIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAuZXNtLmpzLm1hcFxuIiwiaW1wb3J0IHtcbiAgSUFjdGlvbixcbiAgSUFjdGlvblJlc3VsdCxcbiAgSUFjdGlvbk5vZGUsXG4gIElBY3Rpb25Qcm9wZXJ0eSxcbiAgSUNvbnRleHQsXG4gIElGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5cbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgdHlwZSB7IFJlY29yZH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC90eXBlc1wiO1xuaW1wb3J0IHsgS2ludG9uZUFsbFJlY29yZHNFcnJvciwgS2ludG9uZVJlc3RBUElDbGllbnR9IGZyb20gXCJAa2ludG9uZS9yZXN0LWFwaS1jbGllbnRcIjtcbmltcG9ydCBcIi4vYXV0by1sb29rdXAuc2Nzc1wiO1xuaW1wb3J0IFwiYm9vdHN0cmFwL2pzL2Rpc3QvbW9kYWxcIjtcbi8vIGltcG9ydCBcImJvb3RzdHJhcC9qcy9kaXN0L3NwaW5uZXJcIjtcbmltcG9ydCB7TW9kYWx9IGZyb20gXCJib290c3RyYXBcIlxuaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xuXG5pbnRlcmZhY2UgSUF1dG9Mb29rVXBQcm9wcyB7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGxvb2t1cEZpZWxkOiBMb29rdXBGaWVsZDtcbiAgY29uZGl0aW9uOiBDb25kaXRpb247XG59XG5cbmludGVyZmFjZSBDb25kaXRpb24ge1xuICBxdWVyeVN0cmluZzogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBDaGlsZFtdO1xuICBwYXJlbnQ6IG51bGw7XG4gIGxvZ2ljYWxPcGVyYXRvcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hpbGQge1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBzdHJpbmc7XG4gIHBhcmVudDogc3RyaW5nO1xuICBvYmplY3Q6IGFueTtcbiAgb3BlcmF0b3I6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvb2t1cEZpZWxkIHtcbiAgYXBwOiBBcHA7XG4gIGZpZWxkczogRmllbGRbXTtcbn1cblxuaW50ZXJmYWNlIEZpZWxkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGNvZGU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgbm9MYWJlbDogYm9vbGVhbjtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGxvb2t1cDogTG9va3VwO1xufSBcblxuaW50ZXJmYWNlIExvb2t1cCB7XG4gIHJlbGF0ZWRBcHA6IFJlbGF0ZWRBcHA7XG4gIHJlbGF0ZWRLZXlGaWVsZDogc3RyaW5nO1xuICBmaWVsZE1hcHBpbmdzOiBGaWVsZE1hcHBpbmdbXTtcbiAgbG9va3VwUGlja2VyRmllbGRzOiBhbnlbXTtcbiAgZmlsdGVyQ29uZDogc3RyaW5nO1xuICBzb3J0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGaWVsZE1hcHBpbmcge1xuICBmaWVsZDogc3RyaW5nO1xuICByZWxhdGVkRmllbGQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbGF0ZWRBcHAge1xuICBhcHA6IHN0cmluZztcbiAgY29kZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkYXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRvTG9va1VwQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBwcm9wczogSUF1dG9Mb29rVXBQcm9wcztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLjg6vjg4Pjgq/jgqLjg4Pjg5fmm7TmlrBcIjtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XG4gICAgdGhpcy5wcm9wcyA9IHt9IGFzIElBdXRvTG9va1VwUHJvcHM7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICB9XG5cbiAgLyoqKlxuICAgKiDjgqLjgq/jgrvjgrnjga7jg6HjgqTjg7Pjga7lh6bnkIbplqLmlbBcbiAgICovXG4gIGFzeW5jIHByb2Nlc3MoXG4gICAgYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsXG4gICAgZXZlbnQ6IGFueSxcbiAgICBjb250ZXh0OiBJQ29udGV4dFxuICApOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gYWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICB0aGlzLnByb3BzID0ge1xuICAgICAgLi4uYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSxcbiAgICAgIGNvbmRpdGlvbjogSlNPTi5wYXJzZSgoYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBhbnkpLmNvbmRpdGlvbiksXG4gICAgfSBhcyBJQXV0b0xvb2tVcFByb3BzO1xuICAgIC8vIGNvbnNvbGUubG9nKGNvbnRleHQpO1xuXG4gICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgIGNhbk5leHQ6IHRydWUsXG4gICAgICByZXN1bHQ6IFwiXCIsXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb29rVXBGaWVsZHMgPSB0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmZpZWxkcy5maWx0ZXIoXG4gICAgICAgIChmKSA9PiBmLmxvb2t1cCAmJiBmLmxvb2t1cC5yZWxhdGVkQXBwLmFwcCA9PT0gU3RyaW5nKGtpbnRvbmUuYXBwLmdldElkKCkpXG4gICAgICApO1xuICAgICAgaWYgKCFsb29rVXBGaWVsZHMgfHwgbG9va1VwRmllbGRzLmxlbmd0aD09PTApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGDjg6vjg4Pjgq/jgqLjg4Pjg5fjga7oqK3lrprjga/kuI3mraPjgafjgZnjgIIke3RoaXMucHJvcHMubG9va3VwRmllbGQuZmllbGRzWzBdLmxhYmVsfSBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBsb29rVXBGaWVsZCA9IHRoaXMucHJvcHMubG9va3VwRmllbGQuZmllbGRzWzBdOyBcbiAgICAgIGNvbnN0IGtleSA9IGV2ZW50LnJlY29yZFtsb29rVXBGaWVsZC5sb29rdXAucmVsYXRlZEtleUZpZWxkXS52YWx1ZTtcbiAgICAgIGNvbnN0IHRhcmdldFJlY29yZHMgPSBhd2FpdCB0aGlzLmdldFVwZGF0ZVJlY29yZHMobG9va1VwRmllbGQsIGtleSk7XG4gICAgICAvL+abtOaWsOWvvuixoeOBjOOBquOBhOaZguOBq+OCueOCreODg+ODl1xuICAgICAgaWYodGFyZ2V0UmVjb3Jkcy5sZW5ndGg9PT0wKXtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZVJlY29yZHMgPSB0aGlzLmNvbnZlcnRGb3JMb29rdXAodGFyZ2V0UmVjb3Jkcyxsb29rVXBGaWVsZCxrZXkpO1xuICAgICAgY29uc29sZS5sb2coXCJ1cGRhdGVSZWNvcmRzXCIsIHVwZGF0ZVJlY29yZHMpO1xuICAgICAgdGhpcy5zaG93U3Bpbm5lck1vZGVsKHRoaXMucHJvcHMubG9va3VwRmllbGQuYXBwLGxvb2tVcEZpZWxkKTtcbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3VsdCA9IGF3YWl0IHRoaXMudXBkYXRlTG9va3VwVGFyZ2V0KHVwZGF0ZVJlY29yZHMpO1xuICAgICAgaWYodXBkYXRlUmVzdWx0KXtcbiAgICAgICAgdGhpcy5zaG93UmVzdWx0KHRoaXMucHJvcHMubG9va3VwRmllbGQuYXBwLGxvb2tVcEZpZWxkLHVwZGF0ZVJlY29yZHMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUsXCLjg6vjg4Pjgq/jgqLjg4Pjg5fmm7TmlrDkuK3kvovlpJbjgYznmbrnlJ/jgZfjgb7jgZfjgZ9cIik7XG4gICAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUkVTVCBBUEnnlKjjgq/jgqjjg6rkvZzmiJBcbiAgICogVE9ETzrlhbHpgJrplqLmlbDjgajjgZfjgabkvZzmiJBcbiAgICogQHBhcmFtIGxvb2tVcEZpZWxkIFxuICAgKiBAcGFyYW0ga2V5IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIG1ha2VRdWVyeT0obG9va1VwRmllbGQ6RmllbGQsa2V5OmFueSk9PntcbiAgICBsZXQgcXVlcnkgPVwiXCI7XG4gICAgaWYodHlwZW9mIGtleT09PSdudW1iZXInKXtcbiAgICAgIHF1ZXJ5ID0gYCR7bG9va1VwRmllbGQuY29kZX0gPSAke2tleX1gXG4gICAgfVxuICAgIGlmKHR5cGVvZiBrZXk9PT0nc3RyaW5nJyl7XG4gICAgICBxdWVyeSA9IGAke2xvb2tVcEZpZWxkLmNvZGV9ID0gXCIke2tleX1cImBcbiAgICB9XG4gICAgaWYodGhpcy5wcm9wcy5jb25kaXRpb24ucXVlcnlTdHJpbmchPT0nJyl7XG4gICAgICBxdWVyeSA9IGAke3F1ZXJ5fSBhbmQgKCR7dGhpcy5wcm9wcy5jb25kaXRpb24ucXVlcnlTdHJpbmd9KWBcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOWvvuixoeOBruODrOOCs+ODvOODieOCkuWPluW+l+OBmeOCi1xuICAgKi9cbiAgZ2V0VXBkYXRlUmVjb3JkcyA9IGFzeW5jIChsb29rVXBGaWVsZDpGaWVsZCxrZXk6YW55KTpQcm9taXNlPCBSZWNvcmRbXT49PntcbiAgICBjb25zdCBjbGllbnQ9bmV3IEtpbnRvbmVSZXN0QVBJQ2xpZW50KCk7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGNsaWVudC5yZWNvcmQuZ2V0QWxsUmVjb3Jkcyh7XG4gICAgICBhcHA6dGhpcy5wcm9wcy5sb29rdXBGaWVsZC5hcHAuaWQsXG4gICAgICBmaWVsZHM6W1wiJGlkXCJdLFxuICAgICAgY29uZGl0aW9uOnRoaXMubWFrZVF1ZXJ5KGxvb2tVcEZpZWxkLGtleSlcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcDtcbiAgfVxuXG4gLyoqXG4gICog44Or44OD44Kv44Ki44OD44OX5pu05paw55So44Os44Kz44O844OJ44Gr5aSJ5o+b44GZ44KLXG4gICogQHBhcmFtIHRhcmdldFJlY29yZHMg5pu05paw5a++6LGh44Os44Kz44O844OJXG4gICogQHBhcmFtIGxvb2tVcEZpZWxkIOODq+ODg+OCr+OCouODg+ODl+ODleOCo+ODvOODq+ODiVxuICAqIEBwYXJhbSBrZXkg44Or44OD44Kv44Ki44OD44OX44OV44Kj44O844Or44OJ44Gu5YCkXG4gICogQHJldHVybnMgXG4gICovXG4gIGNvbnZlcnRGb3JMb29rdXAgPSAodGFyZ2V0UmVjb3JkczpSZWNvcmRbXSxsb29rVXBGaWVsZDpGaWVsZCxrZXk6YW55KTpBcnJheTxhbnk+PT57XG4gICAgcmV0dXJuIHRhcmdldFJlY29yZHMubWFwKChyKSA9PiAoe1xuICAgICAgaWQ6IE51bWJlcihyW1wiJGlkXCJdLnZhbHVlKSxcbiAgICAgIHJlY29yZDogeyBbbG9va1VwRmllbGQuY29kZV06IHsgdmFsdWU6IGtleSB9IH0sXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODq+ODg+OCr+OCouODg+ODl+WFiOOCkuabtOaWsOOBmeOCi1xuICAgKiBAcGFyYW0gdXBkYXRlUmVjb3JkcyBcbiAgICovXG4gIHVwZGF0ZUxvb2t1cFRhcmdldCA9IGFzeW5jICh1cGRhdGVSZWNvcmRzOkFycmF5PGFueT4pOlByb21pc2U8Ym9vbGVhbj49PntcbiAgICBpZiAodXBkYXRlUmVjb3JkcyAmJiB1cGRhdGVSZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeXtcbiAgICAgICAgY29uc3QgY2xpZW50PW5ldyBLaW50b25lUmVzdEFQSUNsaWVudCgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucmVjb3JkLnVwZGF0ZUFsbFJlY29yZHMoe1xuICAgICAgICAgIGFwcDp0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmFwcC5pZCxcbiAgICAgICAgICByZWNvcmRzOnVwZGF0ZVJlY29yZHNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfWNhdGNoKGVycm9yICl7XG4gICAgICAgIGlmKGVycm9yIGluc3RhbmNlb2YgS2ludG9uZUFsbFJlY29yZHNFcnJvcil7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IodGhpcy5wcm9wcy5sb29rdXBGaWVsZC5hcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5sb29rdXBGaWVsZC5maWVsZHNbMF0sICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciBhcyBLaW50b25lQWxsUmVjb3Jkc0Vycm9yLHVwZGF0ZVJlY29yZHMubGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9IFxuICAgICAgfVxuICAgICAgLy8gYXdhaXQga2ludG9uZS5hcGkoa2ludG9uZS5hcGkudXJsKFwiL2svdjEvcmVjb3Jkcy5qc29uXCIsIHRydWUpLCBcIlBVVFwiLCB7XG4gICAgICAvLyAgIGFwcDogdGhpcy5wcm9wcy5sb29rdXBGaWVsZC5hcHAuaWQsXG4gICAgICAvLyAgIHJlY29yZHM6IHVwZGF0ZVJlY29yZHNcbiAgICAgIC8vIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5Lit44Gu44OA44Kk44Ki44Ot44Kw6KGo56S6XG4gICAqIEBwYXJhbSBhcHAgXG4gICAqL1xuICBzaG93U3Bpbm5lck1vZGVsID0gKGFwcDpBcHAsbG9va3VwOkZpZWxkKSA9PiB7XG4gICAgbGV0IGRpYWxvZyA9ICQoXCIjYWxjTG9va3VwTW9kYWxcIik7XG4gICAgaWYoZGlhbG9nLmxlbmd0aD09PTApe1xuICAgICAgY29uc3QgbW9kYWxIVE1MID0gYDxkaXYgY2xhc3M9XCJicy1zY29wZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJhbGNMb29rdXBNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJzdGF0aWNCYWNrZHJvcExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGgxIGNsYXNzPVwibW9kYWwtdGl0bGUgZnMtNVwiIGlkPVwiYWxjTG9va3VwTW9kYWxMYWJlbFwiPuODq+ODg+OCr+OCouODg+ODl+WQjOacn+WHpueQhjwvaDE+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIGlkPVwiYXBwJHthcHAuaWR9XyR7bG9va3VwLmNvZGV9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC1zZWNvbmRhcnkgY29sLTEgXCIgcm9sZT1cImFsZXJ0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+JHthcHAubmFtZX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPk9LPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj5gO1xuICAgICAgJChtb2RhbEhUTUwpLmFwcGVuZFRvKFwiYm9keVwiKTtcbiAgICAgIGRpYWxvZyA9ICQoXCIjYWxjTG9va3VwTW9kYWxcIik7XG4gICAgICBkaWFsb2cuZ2V0KClbMF0uYWRkRXZlbnRMaXN0ZW5lcignaGlkZGVuLmJzLm1vZGFsJywoZXYpPT57XG4gICAgICAgIE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoZGlhbG9nLmdldCgpWzBdKS5kaXNwb3NlKCk7XG4gICAgICAgICQoXCIjYWxjTG9va3VwTW9kYWxcIikucGFyZW50KCkucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICB9ZWxzZXtcbiAgICAgIGNvbnN0IGRpYWxvZ0JvZHk9JChcIiNhbGNMb29rdXBNb2RhbCAubW9kYWwtYm9keVwiKTtcbiAgICAgIGNvbnN0IGh0bWxyb3c9YCBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgaWQ9XCJhcHAke2FwcC5pZH1fJHtsb29rdXAuY29kZX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXNlY29uZGFyeSBjb2wtMSBcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPiR7YXBwLm5hbWV9PC9kaXY+XG4gICAgICAgICAgPGRpdj5gO1xuICAgICAgZGlhbG9nQm9keS5hcHBlbmQoaHRtbHJvdyk7XG4gICAgfVxuICAgIE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoZGlhbG9nLmdldCgpWzBdKS5zaG93KCk7IFxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOe1kOaenOOCkuihqOekuuOBmeOCi1xuICAgKiBAcGFyYW0gYXBwIOOAgOabtOaWsOWFiOOCouODl+ODquaDheWgsVxuICAgKiBAcGFyYW0gY291bnQg5pu05paw5Lu25pWwXG4gICAqL1xuICBzaG93UmVzdWx0PShhcHA6QXBwLGxvb2t1cDpGaWVsZCxjb3VudDpudW1iZXIpPT57XG4gICAgY29uc3QgZGlhbG9nQm9keT0kKGAjYWxjTG9va3VwTW9kYWwgLm1vZGFsLWJvZHkgI2FwcCR7YXBwLmlkfV8ke2xvb2t1cC5jb2RlfWApO1xuICAgIGNvbnN0IGh0bWw9YCAgICA8ZGl2IGNsYXNzPVwiY29sLTEgdGV4dC1zdWNjZXNzXCI+4pyUPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj4ke2FwcC5uYW1lfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+5pu05paw5Lu25pWwOiR7Y291bnR95Lu2PC9kaXY+YDtcbiAgICBkaWFsb2dCb2R5Lmh0bWwoaHRtbCk7XG4gIH1cblxuICAgIC8qKlxuICAgKiDmm7TmlrDntZDmnpzjgpLooajnpLrjgZnjgotcbiAgICogQHBhcmFtIGFwcCDjgIDmm7TmlrDlhYjjgqLjg5fjg6rmg4XloLFcbiAgICogQHBhcmFtIGNvdW50IOabtOaWsOS7tuaVsFxuICAgKi9cbiAgICBzaG93RXJyb3I9KGFwcDpBcHAsbG9va3VwOkZpZWxkLGVycm9yOktpbnRvbmVBbGxSZWNvcmRzRXJyb3IsYWxsQ291bnQ6TnVtYmVyKT0+e1xuICAgICAgY29uc3QgbWVzc2FnZT1lcnJvci5lcnJvci5tZXNzYWdlO1xuICAgICAgY29uc3QgcHJvUmVjb3JkcyA9IGVycm9yLm51bU9mUHJvY2Vzc2VkUmVjb3JkcztcbiAgICAgIGNvbnN0IGFsbFJlY29yZHM9ZXJyb3IubnVtT2ZBbGxSZWNvcmRzO1xuICAgICAgY29uc3QgZGlhbG9nQm9keT0kKGAjYWxjTG9va3VwTW9kYWwgLm1vZGFsLWJvZHkgI2FwcCR7YXBwLmlkfV8ke2xvb2t1cC5jb2RlfWApO1xuICAgICAgY29uc3QgaHRtbD1gPGRpdiBjbGFzcz1cImNvbC0xIHRleHQtZGFuZ2VyXCI+4pyWPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+JHthcHAubmFtZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj7mm7TmlrDku7bmlbA6JHtwcm9SZWNvcmRzfS8ke2FsbFJlY29yZHN9PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHRleHQtZGFuZ2VyXCI+JHttZXNzYWdlfTxkaXY+YDtcbiAgICAgIGRpYWxvZ0JvZHkuaHRtbChodG1sKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44OA44Kk44Ki44Ot44Kw55S76Z2i44KS6ZaJ44GY44KLXG4gICAgICovXG4gICAgY2xvc2VEaWFsb2c9KCk9PntcbiAgICAgIGNvbnN0IGRpYWxvZyA9ICQoXCIjYWxjTG9va3VwTW9kYWxcIik7XG4gICAgICBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKGRpYWxvZy5nZXQoKVswXSkuZGlzcG9zZSgpO1xuICAgICAgJChcIiNhbGNMb29rdXBNb2RhbFwiKS5wYXJlbnQoKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xuICB9XG59XG5cbm5ldyBBdXRvTG9va1VwQWN0aW9uKCk7IiwiXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uVHJlZSB9IGZyb20gJy4uL3R5cGVzL0NvbmRpdGlvbnMnO1xuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElEaXNhYmxlUHJvcHN7XG4gICAgLy/lr77osaHjg5XjgqPjg7zjg6vjg4lcbiAgICBmaWVsZDpJRmllbGQ7XG4gICAgLy/nt6jpm4blj68v5LiN5Y+v6Kit5a6aXG4gICAgZWRpdGFibGU6J+e3qOmbhuWPryd8J+e3qOmbhuS4jeWPryd8Jyc7IFxuICAgIGNvbmRpdGlvbjpzdHJpbmc7XG59XG4vKipcbiAqIOe3qOmbhuWPr++8j+S4jeWPr+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgRmllbGREaXNhYmxlQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklEaXNhYmxlUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi57eo6ZuG5Y+v77yP5LiN5Y+vXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBlZGl0YWJsZTonJyxcbiAgICAgICAgICAgIGNvbmRpdGlvbjonJ1xuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2VkaXRhYmxlJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElEaXNhYmxlUHJvcHM7XG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBruioiOeul+e1kOaenOOCkuWPluW+l1xuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0ID0gdGhpcy5nZXRDb25kaXRpb25SZXN1bHQoY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoY29uZGl0aW9uUmVzdWx0KXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnByb3BzLmVkaXRhYmxlPT09J+e3qOmbhuWPrycpe1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5kaXNhYmxlZD1mYWxzZTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZiAodGhpcy5wcm9wcy5lZGl0YWJsZT09PSfnt6jpm4bkuI3lj68nKXtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZGlzYWJsZWQ9dHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH1cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IOadoeS7tuW8j+OCkuWun+ihjOOBmeOCi1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQ6YW55KTpib29sZWFue1xuICAgICAgICBjb25zdCB0cmVlID10aGlzLmdldENvbmRpdGlvbih0aGlzLnByb3BzLmNvbmRpdGlvbik7XG4gICAgICAgIGlmKCF0cmVlKXtcbiAgICAgICAgICAgIC8v5p2h5Lu244KS6Kit5a6a44GV44KM44Gm44GE44G+44Gb44KTXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZSh0cmVlLnJvb3QsY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiDmnaHku7blvI/jg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldENvbmRpdGlvbihjb25kaXRpb246c3RyaW5nKTpDb25kaXRpb25UcmVlfG51bGx7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgQ29uZGl0aW9uVHJlZSgpO1xuICAgICAgICAgICAgdHJlZS5mcm9tSnNvbihjb25kaXRpb24pO1xuICAgICAgICAgICAgaWYodHJlZS5nZXRDb25kaXRpb25zKHRyZWUucm9vdCkubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbn1cbm5ldyBGaWVsZERpc2FibGVBY3Rpb24oKTsiLCJcbmltcG9ydCB7IFJlY29yZCB9IGZyb20gXCJAa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvdHlwZXNcIjtcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XG5cbnR5cGUgVGV4dFN0eWxlID0gXCLlpKrlrZdcIiB8IFwi5pac5L2TXCIgfCBcIuS4i+e3mlwiIHwgXCLmiZPjgaHmtojjgZfnt5pcIjtcbnR5cGUgU3R5bGVSaWdpb24gPSBcIuabuOW8j+WkieabtOODleOCo+ODvOODq+ODiVwiIHwgXCLooYzlhajkvZNcInxcIlwiO1xuXG5cbi8qKlxuICog44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXG4gKi9cbmludGVyZmFjZSBJU3R5bGVGaWVsZFByb3Bze1xuICAgIGZpZWxkOklGaWVsZDtcbiAgICBmb250Q29sb3I6c3RyaW5nOyBcbiAgICBiZ0NvbG9yOnN0cmluZztcbiAgICBmb250U3R5bGU6VGV4dFN0eWxlW107XG4gICAgYWxsUm93OlN0eWxlUmlnaW9uO1xuICAgIGNvbmRpdGlvbjpzdHJpbmc7XG59XG4vKipcbiAqIOadoeS7tuabuOW8j+ihqOekuuOCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgU3R5bGVGaWVsZEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb257XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcbiAgICBwcm9wczpJU3R5bGVGaWVsZFByb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuadoeS7tuabuOW8j+ihqOekulwiO1xuICAgICAgICB0aGlzLmFjdGlvblByb3BzPVtdO1xuICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxuICAgICAgICAgICAgZm9udENvbG9yOicnLFxuICAgICAgICAgICAgYmdDb2xvcjonJyxcbiAgICAgICAgICAgIGZvbnRTdHlsZTpbXSxcbiAgICAgICAgICAgIGFsbFJvdzonJyxcbiAgICAgICAgICAgIGNvbmRpdGlvbjonJ1xuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2FsbFJvdycgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJU3R5bGVGaWVsZFByb3BzO1xuICAgICAgICAgICAgLy/mm7jlvI/oqK3lrppcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LnR5cGUpXG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJhcHAucmVjb3JkLmluZGV4LnNob3dcIikge1xuICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlRm9yVmlldyhldmVudCwgdGhpcy5wcm9wcywgY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiYXBwLnJlY29yZC5kZXRhaWwuc2hvd1wiKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGVGb3JEZXRhaWwoZXZlbnQsIHRoaXMucHJvcHMsIGNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgZXZlbnQudHlwZS5pbmNsdWRlcyhcImFwcC5yZWNvcmQuY3JlYXRlLmNoYW5nZS5cIikgfHxcbiAgICAgICAgICAgICAgZXZlbnQudHlwZS5pbmNsdWRlcyhcImFwcC5yZWNvcmQuZWRpdC5jaGFuZ2UuXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdHlsZUZvckVkaXQoZXZlbnQsIHRoaXMucHJvcHMsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0PSB7XG4gICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHNldFN0eWxlRm9yRWRpdChldmVudDphbnkscHJvcHM6SVN0eWxlRmllbGRQcm9wcyxjb250ZXh0OklDb250ZXh0KXtcbiAgICAgICAgY29uc3QgcmVjb3JkVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjb3JkLWdhaWEnKTtcbiAgICAgICAgaWYgKHJlY29yZFRhYmxlKSB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICByZWNvcmRUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNwYW5cIilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmZpbHRlcigoc3BhbikgPT4gc3Bhbi5pbm5lclRleHQgPT09IHByb3BzLmZpZWxkLmNvZGUpXG4gICAgICAgICAgICAgIC5tYXAoKHNwYW4pID0+XG4gICAgICAgICAgICAgICAgc3Bhbi5wYXJlbnRFbGVtZW50Py5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICAgICAgICAgICAgID8ucXVlcnlTZWxlY3RvcihcIi5pbnB1dC10ZXh0LW91dGVyLWN5Ym96dVwiKVxuICAgICAgICAgICAgICAgICAgPy5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRWxlbWVudCB8IG51bGxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuZmlsdGVyKChpbnB1dEVsZW1lbnQpOiBpbnB1dEVsZW1lbnQgaXMgSFRNTEVsZW1lbnQgPT4gISFpbnB1dEVsZW1lbnQpXG4gICAgICAgICAgICAgIC5mb3JFYWNoKChpbnB1dEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLmdldENvbmRpdGlvblJlc3VsdChcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29uZGl0aW9uKHByb3BzLmNvbmRpdGlvbiksXG4gICAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNldEZpZWxkU3R5bGUocHJvcHMsIGlucHV0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlucHV0RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBcblxuICAgIC8qKlxuICAgICAqIOips+e0sOihqOekuuaZguOBruOCueOCv+OCpOODq+ioreWumlxuICAgICAqIEBwYXJhbSBldmVudCBcbiAgICAgKiBAcGFyYW0gcHJvcHMgXG4gICAgICogQHBhcmFtIGNvbnRleHQgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgc2V0U3R5bGVGb3JEZXRhaWwoZXZlbnQ6YW55LHByb3BzOklTdHlsZUZpZWxkUHJvcHMsY29udGV4dDpJQ29udGV4dCl7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBraW50b25lLmFwcC5yZWNvcmQuZ2V0RmllbGRFbGVtZW50KHByb3BzLmZpZWxkLmNvZGUpO1xuICAgICAgICBpZighZWxlbSl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLmdldENvbmRpdGlvbihwcm9wcy5jb25kaXRpb24pO1xuICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLmdldENvbmRpdGlvblJlc3VsdCh0cmVlLGNvbnRleHQpO1xuICAgICAgICBpZihjb25kaXRpb25SZXN1bHQpe1xuICAgICAgICAgICAgdGhpcy5zZXRGaWVsZFN0eWxlKHByb3BzLGVsZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5LiA6Kan6KGo56S65pmC44Gu5pu45byP6Kit5a6aXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEBwYXJhbSBwcm9wcyBcbiAgICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBzZXRTdHlsZUZvclZpZXcoZXZlbnQ6YW55LHByb3BzOklTdHlsZUZpZWxkUHJvcHMsY29udGV4dDpJQ29udGV4dCl7XG4gICAgICAgIGNvbnN0IHJlY29yZHM6UmVjb3JkW10gPSBldmVudC5yZWNvcmRzO1xuICAgICAgICBjb25zdCBjZWxscyA9IGtpbnRvbmUuYXBwLmdldEZpZWxkRWxlbWVudHMocHJvcHMuZmllbGQuY29kZSk7XG4gICAgICAgIGlmKCFjZWxscyl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVsZW0gOkhUTUxFbGVtZW50fG51bGw7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblRyZWUgPSB0aGlzLmdldENvbmRpdGlvbihwcm9wcy5jb25kaXRpb24pO1xuICAgICAgICByZWNvcmRzLmZvckVhY2goKHJlY29yZDpSZWNvcmQsaW5kZXg6bnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyQ29udGV4dDpJQ29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6Y29udGV4dC52YXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgcmVjb3JkOnJlY29yZCxcbiAgICAgICAgICAgICAgICBlcnJvcnM6Y29udGV4dC5lcnJvcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbmRpdGlvblRyZWUsY3VyckNvbnRleHQpO1xuICAgICAgICAgICAgaWYoY29uZGl0aW9uUmVzdWx0KXtcbiAgICAgICAgICAgICAgICBlbGVtID0gY2VsbHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmKHByb3BzLmFsbFJvdz09PVwi6KGM5YWo5L2TXCIpe1xuICAgICAgICAgICAgICAgICAgICBlbGVtID0gY2VsbHNbaW5kZXhdLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKGVsZW0pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZpZWxkU3R5bGUocHJvcHMsZWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcHJvcHMgSHRtbEVsZW1lbnTmm7jlvI/oqK3lrppcbiAgICAgKi9cbiAgICBzZXRGaWVsZFN0eWxlKHByb3BzOklTdHlsZUZpZWxkUHJvcHMsZWxlbTpIVE1MRWxlbWVudCl7XG4gICAgICAgXG4gICAgICAgICAgICBpZihwcm9wcy5mb250Q29sb3Ipe1xuICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUuY29sb3I9cHJvcHMuZm9udENvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYocHJvcHMuYmdDb2xvcil7XG4gICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9cHJvcHMuYmdDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHByb3BzLmZvbnRTdHlsZS5sZW5ndGg+MCl7XG4gICAgICAgICAgICAgICAgaWYocHJvcHMuZm9udFN0eWxlLmluY2x1ZGVzKFwi5pac5L2TXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5mb250U3R5bGU9XCJpdGFsaWNcIjtcbiAgICAgICAgICAgICAgICB9XG4gXG4gICAgICAgICAgICAgICAgaWYocHJvcHMuZm9udFN0eWxlLmluY2x1ZGVzKFwi5aSq5a2XXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB0ZXh0RGVjb3JhdGlvbj1cIlwiO1xuICAgICAgICAgICAgICAgIGlmKHByb3BzLmZvbnRTdHlsZS5pbmNsdWRlcyhcIuS4i+e3mlwiKSl7XG4gICAgICAgICAgICAgICAgICAgIHRleHREZWNvcmF0aW9uPVwidW5kZXJsaW5lXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHByb3BzLmZvbnRTdHlsZS5pbmNsdWRlcyhcIuaJk+OBoea2iOOBl+e3mlwiKSl7XG4gICAgICAgICAgICAgICAgICAgIHRleHREZWNvcmF0aW9uID0gdGV4dERlY29yYXRpb24/IHRleHREZWNvcmF0aW9uICsgXCIgbGluZS10aHJvdWdoXCI6XCJsaW5lLXRocm91Z2hcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYodGV4dERlY29yYXRpb24pe1xuICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLnRleHREZWNvcmF0aW9uPXRleHREZWNvcmF0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmnaHku7blvI/jgpLlrp/ooYzjgZnjgotcbiAgICAgKiBAcGFyYW0gdHJlZSDmnaHku7blvI/jgqrjg5bjgrjjgqfjgq/jg4hcbiAgICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQodHJlZTpDb25kaXRpb25UcmVlfG51bGwsIGNvbnRleHQ6YW55KTpib29sZWFue1xuICAgICAgICBpZighdHJlZSl7XG4gICAgICAgICAgICAvL+adoeS7tuOCkuioreWumuOBleOCjOOBpuOBhOOBvuOBm+OCk1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyZWUuZXZhbHVhdGUodHJlZS5yb290LGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25kaXRpb24g5p2h5Lu25byP44OE44Oq44O844KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb24oY29uZGl0aW9uOnN0cmluZyk6Q29uZGl0aW9uVHJlZXxudWxse1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25zdCB0cmVlID0gbmV3IENvbmRpdGlvblRyZWUoKTtcbiAgICAgICAgICAgIHRyZWUuZnJvbUpzb24oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIGlmKHRyZWUuZ2V0Q29uZGl0aW9ucyh0cmVlLnJvb3QpLmxlbmd0aD4wKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG59XG5uZXcgU3R5bGVGaWVsZEFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBJQWN0aW9uLCBJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQgLElDb250ZXh0LCBJVmFyTmFtZX0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5cbi8qKlxuICog44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXG4gKi9cbmludGVyZmFjZSBJRGF0ZVRpbWVDYWxjUHJvcHN7XG4gICAgdmVyTmFtZUdldDpzdHJpbmc7XG4gICAgY2FsY09wdGlvbjpzdHJpbmc7XG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcbiAgICB5ZWFyOnN0cmluZztcbiAgICBtb250aDpzdHJpbmc7XG4gICAgZGF0ZTpzdHJpbmc7XG4gICAgaG91cjpzdHJpbmc7XG4gICAgbWludXRlOnN0cmluZztcbiAgICBzZWNvbmQ6c3RyaW5nO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRlVGltZUNhbGNBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gICAgcHJvcHM6SURhdGVUaW1lQ2FsY1Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuaXpeaZguOCkuWKoOeul++8j+a4m+eul+OBmeOCi1wiOy8vIERC44Gr55m76Yyy44GX44Gf44Ki44Kv44K344On44Oz5ZCNXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIC8v44OX44Ot44OR44OG44Kj5bGe5oCn44Gu5Yid5pyf5YyWXG4gICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgdmVyTmFtZUdldDonJyxcbiAgICAgICAgICAgIGNhbGNPcHRpb246JycsXG4gICAgICAgICAgICB2ZXJOYW1lOntuYW1lOicnfSxcbiAgICAgICAgICAgIHllYXI6XCIwXCIsXG4gICAgICAgICAgICBtb250aDpcIjBcIixcbiAgICAgICAgICAgIGRhdGU6XCIwXCIsXG4gICAgICAgICAgICBob3VyOlwiMFwiLFxuICAgICAgICAgICAgbWludXRlOlwiMFwiLFxuICAgICAgICAgICAgc2Vjb25kOlwiMFwiXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWfuua6luaXpeOBqOOBquOCi+WkieaVsOOBruWApOOBjOOAgeaXpeS7mOODu+aXpeaZguOBruW9ouW8j+OBp+OBguOCi+OBi+OAgeWIpOaWreOBmeOCi1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlVmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0RhdGVWYWx1ZShkYXRlVmFsdWUgOnN0cmluZyl7XG4gICAgICAgIGxldCBkYXRlO1xuXG4gICAgICAgIC8v5q2j6KaP6KGo54++44OB44Kn44OD44KvXG4gICAgICAgIGxldCBzaW5nbGVEaWdpdE1vbnRoID0gZGF0ZVZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezF9KS0oXFxkezF9KSQvKTsvLzTmoYHjga7mlbDlrZctMeahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XXG4gICAgICAgIGxldCB0d29EaWdpdE1vbnRoID0gZGF0ZVZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvKTsvLzTmoYHjga7mlbDlrZctMuahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XXG4gICAgICAgIGxldCBzaW5nbGVEaWdpdERhdGUgPSBkYXRlVmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7MX0pJC8pOy8vNOahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XLTHmoYHjga7mlbDlrZdcbiAgICAgICAgbGV0IHR3b0RpZ2l0RGF0ZSA9IGRhdGVWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsxfSktKFxcZHsyfSkkLyk7Ly805qGB44Gu5pWw5a2XLTHmoYHjga7mlbDlrZctMuahgeOBruaVsOWtl1xuICAgICAgICBsZXQgZGF0ZVRpbWVNaWxsaVNlY29uZCA9IGRhdGVWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlUKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkuKFxcZHsyLDN9KVokLyk7Ly/mmYLliLvlhaXjgorjga5VVEPjga7ml6Xku5jlvaLlvI8o44Of44Oq56eSKVxuICAgICAgICBsZXQgZGF0ZVRpbWUgPSBkYXRlVmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pWiQvKTsvL+aZguWIu+WFpeOCiuOBrlVUQ+OBruaXpeS7mOW9ouW8j1xuXG4gICAgICAgIC8vZGF0ZeWei+OBq+WkieaPm1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0ZVZhbHVlKTtcblxuICAgICAgICAvL2RhdGXlnovlpInmj5vjgafjgY3jgZ/jgYvnorroqo1cbiAgICAgICAgaWYoZGF0ZSAhPT0gdW5kZWZpbmVkICYmICFpc05hTihkYXRlLmdldERhdGUoKSkpe1xuICAgICAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq/norroqo1cbiAgICAgICAgICAgIGlmKHR3b0RpZ2l0TW9udGggPT09IG51bGwgJiYgc2luZ2xlRGlnaXRNb250aCA9PT0gbnVsbCAmJiBzaW5nbGVEaWdpdERhdGUgPT09IG51bGwgJiYgdHdvRGlnaXREYXRlID09PSBudWxsICYmIGRhdGVUaW1lID09PSBudWxsICYmIGRhdGVUaW1lTWlsbGlTZWNvbmQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuioiOeul+OBruWfuua6luaXpeOBqOOBquOCi+WApOOBjOOAgemBqeWIh+OBquaXpeS7mOODu+aXpeaZguOBruW9ouW8j+OBp+OBr+OBguOCiuOBvuOBm+OCk+OAguOAjOaXpeaZguOCkuWKoOeuly/muJvnrpfjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YCk44KS5pWw5YCk44Gr5aSJ5o+b44GZ44KLXG4gICAgICogQHBhcmFtIHthbnl9IGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsY1ZhbHVlLGNhbGNPcHRpb25cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHZhbHVlVG9OdW1iZXIoY29udGV4dCA6YW55LGNhbGNWYWx1ZSA6c3RyaW5nLGNhbGNPcHRpb24gOnN0cmluZyk6IG51bWJlcntcblxuICAgICAgICBjb25zdCBnZXRDb250ZXh0VmFyQnlQYXRoID0gKG9iajogYW55LCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgb2JqKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvL+ioiOeul+WApOOBjOWkieaVsOOBruWgtOWQiOOBr+OAgeWkieaVsOOBruWApOOCkuWPluW+l1xuICAgICAgICBpZihjYWxjT3B0aW9uID09PSBcIuWkieaVsFwiICYmIGlzTmFOKE51bWJlcihjYWxjVmFsdWUpKSl7XG4gICAgICAgICAgICBjYWxjVmFsdWUgPSBnZXRDb250ZXh0VmFyQnlQYXRoIChjb250ZXh0LnZhcmlhYmxlcyxjYWxjVmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/mlbDlgKTlnovjgavlpInmj5tcbiAgICAgICAgbGV0IG51bWJlciA9IE51bWJlcihjYWxjVmFsdWUpO1xuXG4gICAgICAgIC8v5pyJ6ZmQ5pWw44GL44Gp44GG44GL5Yik5a6aXG4gICAgICAgIGlmKCFpc0Zpbml0ZShudW1iZXIpKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuioiOeul+WApOOBjOOAgeaVsOWApOOBp+OBr+OBguOCiuOBvuOBm+OCk+OAguOAjOaXpeaZguOCkuWKoOeuly/muJvnrpfjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDml6Xku5jjg7vml6XmmYLjgpLliqDnrpfjg7vmuJvnrpfjgZnjgotcbiAgICAgKiBAcGFyYW0ge2FueX0gZGF0ZVZhbHVlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgbW9udGggZGF5IGhvdXIgbWludXRlIHNlY29uZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgY2FsY0RhdGUoZGF0ZVZhbHVlOmFueSx5ZWFyOm51bWJlcixtb250aDpudW1iZXIsZGF0ZTpudW1iZXIsaG91cjpudW1iZXIsbWludXRlOm51bWJlcixzZWNvbmQ6bnVtYmVyKTpzdHJpbmd7XG5cbiAgICAgICAgbGV0IGNhbGNSZXN1bHQ7XG4gICAgICAgIC8v44OV44Kj44O844Or44OJ44Gu5YCk77yI5paH5a2X5YiX77yJ44KSZGF0ZeWei+OBq+WkieaPm+OBmeOCi1xuICAgICAgICBkYXRlVmFsdWUgPSBuZXcgRGF0ZShkYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vIOW5tOOCkuioiOeul1xuICAgICAgICBkYXRlVmFsdWUuc2V0RnVsbFllYXIoZGF0ZVZhbHVlLmdldEZ1bGxZZWFyKCkreWVhcik7XG4gICAgICAgIC8v5pyI44KS6KiI566XXG4gICAgICAgIGRhdGVWYWx1ZS5zZXRNb250aChkYXRlVmFsdWUuZ2V0TW9udGgoKSttb250aCk7XG4gICAgICAgIC8v5pel44KS6KiI566XXG4gICAgICAgIGRhdGVWYWx1ZS5zZXREYXRlKGRhdGVWYWx1ZS5nZXREYXRlKCkrZGF0ZSk7XG4gICAgICAgIC8v5pmC6ZaT44KS6KiI566XXG4gICAgICAgIGRhdGVWYWx1ZS5zZXRIb3VycyhkYXRlVmFsdWUuZ2V0SG91cnMoKStob3VyKTtcbiAgICAgICAgLy/liIbjgpLoqIjnrpdcbiAgICAgICAgZGF0ZVZhbHVlLnNldE1pbnV0ZXMoZGF0ZVZhbHVlLmdldE1pbnV0ZXMoKSttaW51dGUpO1xuICAgICAgICAvL+enkuOCkuioiOeul1xuICAgICAgICBkYXRlVmFsdWUuc2V0U2Vjb25kcyhkYXRlVmFsdWUuZ2V0U2Vjb25kcygpK3NlY29uZCk7XG5cbiAgICAgICAgLy9VVEPlvaLlvI/jgavlpInmj5tcbiAgICAgICAgY2FsY1Jlc3VsdCA9IGRhdGVWYWx1ZS50b0lTT1N0cmluZygpO1xuICAgICAgICByZXR1cm4gY2FsY1Jlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZVxuICAgICAqIEBwYXJhbSBldmVudFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSURhdGVUaW1lQ2FsY1Byb3BzO1xuXG4gICAgICAgICAgICBjb25zdCBnZXRDb250ZXh0VmFyQnlQYXRoID0gKG9iajogYW55LCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5zcGxpdChcIi5cIikucmVkdWNlKChvLCBrKSA9PiAobyB8fCB7fSlba10sIG9iaik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL+Wfuua6luaXpeOBqOOBquOCi+WkieaVsOOBruWApOWPluW+l1xuICAgICAgICAgICAgY29uc3QgZGF0ZVZhbHVlID0gZ2V0Q29udGV4dFZhckJ5UGF0aCAoY29udGV4dC52YXJpYWJsZXMsdGhpcy5wcm9wcy52ZXJOYW1lR2V0KTtcblxuICAgICAgICAgICAgLy/ln7rmupbml6XjgajjgarjgovlpInmlbDjga7lgKTjgYznqbrjga7loLTlkIjjgIHlh6bnkIbjgpLntYLkuobjgZnjgotcbiAgICAgICAgICAgIGlmKCFkYXRlVmFsdWUpe1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuWfuua6luWApOOBqOOBquOCi+WkieaVsOOBruWApOOBjOepuuOAgeOBvuOBn+OBr+WtmOWcqOOBl+OBvuOBm+OCk+OAguOAjOaXpeaZguOCkuWKoOeuly/muJvnrpfjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjaGVja0RhdGVWYWx1ZTtcbiAgICAgICAgICAgIC8v5Z+65rqW5YCk44Go44Gq44KL5aSJ5pWw44Gu5YCk44CB5pel5pmC44CB5pel5LuY5b2i5byP44GL56K66KqN44GZ44KLXG4gICAgICAgICAgICBjaGVja0RhdGVWYWx1ZSA9IHRoaXMuaXNEYXRlVmFsdWUoZGF0ZVZhbHVlKTtcblxuICAgICAgICAgICAgaWYoY2hlY2tEYXRlVmFsdWUpe1xuICAgICAgICAgICAgICAgIC8v6KiI566X5YCk44Gu5YWl5Yqb5pa55rOV44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICAgICAgbGV0IGNhbGNPcHRpb25zID0gdGhpcy5wcm9wcy5jYWxjT3B0aW9uO1xuXG4gICAgICAgICAgICAgICAgLy/oqIjnrpflgKTjgpLmlbDlgKTlnovjgavlpInmj5vjgZnjgotcbiAgICAgICAgICAgICAgICBsZXQgeWVhciA9IHRoaXMudmFsdWVUb051bWJlcihjb250ZXh0LHRoaXMucHJvcHMueWVhcixjYWxjT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoID0gdGhpcy52YWx1ZVRvTnVtYmVyKGNvbnRleHQsdGhpcy5wcm9wcy5tb250aCxjYWxjT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGUgPSB0aGlzLnZhbHVlVG9OdW1iZXIoY29udGV4dCx0aGlzLnByb3BzLmRhdGUsY2FsY09wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGxldCBob3VyID0gdGhpcy52YWx1ZVRvTnVtYmVyKGNvbnRleHQsdGhpcy5wcm9wcy5ob3VyLGNhbGNPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBsZXQgbWludXRlID0gdGhpcy52YWx1ZVRvTnVtYmVyKGNvbnRleHQsdGhpcy5wcm9wcy5taW51dGUsY2FsY09wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGxldCBzZWNvbmQgPSB0aGlzLnZhbHVlVG9OdW1iZXIoY29udGV4dCx0aGlzLnByb3BzLnNlY29uZCxjYWxjT3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAvL+ioiOeul+e1kOaenOOBruaXpeS7mOOCkuagvOe0jeOBmeOCi+WkieaVsFxuICAgICAgICAgICAgICAgIGxldCBjYWxjdWxhdGVkRGF0ZTtcblxuICAgICAgICAgICAgICAgIC8v5pel5LuY44KS5Yqg566X44CB5rib566X44GZ44KLXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlZERhdGUgPSB0aGlzLmNhbGNEYXRlKGRhdGVWYWx1ZSx5ZWFyLG1vbnRoLGRhdGUsaG91cixtaW51dGUsc2Vjb25kKTtcblxuICAgICAgICAgICAgICAgIC8v6KiI566X57WQ5p6c44KS5aSJ5pWw44Gr5Luj5YWl44GZ44KLXG4gICAgICAgICAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdID0gY2FsY3VsYXRlZERhdGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OnRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxufVxubmV3IERhdGVUaW1lQ2FsY0FjdGlvbigpO1xuIiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcclxuaW1wb3J0IHsgSUFjdGlvbiwgSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkICxJQ29udGV4dCwgSVZhck5hbWV9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXHJcbiAqL1xyXG5pbnRlcmZhY2UgSUVuZE9mTW9udGhQcm9wcyB7XHJcbiAgICB2ZXJOYW1lR2V0OnN0cmluZztcclxuICAgIHZlck5hbWU6SVZhck5hbWU7XHJcbn1cclxuLyoqXHJcbiAqIOaciOacq+eul+WHuuOCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEVuZE9mTW9udGhBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIHByb3BzOiBJRW5kT2ZNb250aFByb3BzO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCLmnIjmnKvnrpflh7pcIjtcclxuICAgICAgICB0aGlzLmFjdGlvblByb3BzID0gW107XHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHtcclxuICAgICAgICAgICAgdmVyTmFtZUdldDonJyxcclxuICAgICAgICAgICAgdmVyTmFtZTp7bmFtZTonJ31cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcclxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsIGV2ZW50OiBhbnksY29udGV4dDpJQ29udGV4dCk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIGNhbk5leHQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgndmVyTmFtZUdldCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUVuZE9mTW9udGhQcm9wcztcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8v5pys55Wq44Kz44O844OJ6ZaL5aeL77yaXHJcbiAgICAgICAgICAgIC8v5Y+W5b6X5aSJ5pWw44Gu5YCk44KS5ZG844Gz5Ye644GX44Gm5Luj5YWl44GZ44KL77yaXHJcbiAgICAgICAgICAgIGNvbnN0IGdldENvbnRleHRWYXJCeVBhdGggPSAob2JqOiBhbnksIHBhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoXCIuXCIpLnJlZHVjZSgobywgaykgPT4gKG8gfHwge30pW2tdLCBvYmopO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBsZXQgdmVyTmFtZUdldFZhbHVlID0gZ2V0Q29udGV4dFZhckJ5UGF0aChjb250ZXh0LnZhcmlhYmxlcyx0aGlzLnByb3BzLnZlck5hbWVHZXQpO1xyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgLy/lj5blvpflpInmlbDjga7lgKREYXRl44Kq44OW44K444Kn44Kv44OI44Gr5aSJ5o+b77yaXHJcbiAgICAgICAgICAgIGxldCBkYXRlT2JqID0gbmV3IERhdGUodmVyTmFtZUdldFZhbHVlKTtcclxuICAgICAgICAgICAgLy8g5pyI5pyr44KS6KiI566XXHJcbiAgICAgICAgICAgIGxldCB5ZWFyID0gZGF0ZU9iai5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICBsZXQgbW9udGggPSBkYXRlT2JqLmdldE1vbnRoKCkgKyAxOyAvL+aciOOBrzDjgYvjgonlp4vjgb7jgovjgZ/jgoHjgIEx44KS6Laz44GZXHJcbiAgICAgICAgICAgIGxldCBsYXN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKTsgLy8g57+M5pyI44GuMOaXpeebruOBr+S7iuaciOOBruaciOacq1xyXG4gICAgICAgICAgICBpZih0aGlzLnByb3BzLnZlck5hbWUgJiYgdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWUhPT0nJyl7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV09bGFzdERheU9mTW9udGgudG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OnRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdID0gdGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgRW5kT2ZNb250aEFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElBY3Rpb24sIElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCAsSUNvbnRleHQsIElWYXJOYW1lfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElEYXRlU3BlY2lmaWVkUHJvcHMge1xyXG4gICAgdmVyTmFtZUdldDpzdHJpbmc7XHJcbiAgICBuZXdZZWFyOm51bWJlcjtcclxuICAgIG5ld01vbnRoOm51bWJlcjtcclxuICAgIG5ld0RheTpudW1iZXI7XHJcbiAgICB2ZXJOYW1lOklWYXJOYW1lO1xyXG59XHJcbi8qKlxyXG4gKiDml6Xku5jmjIflrprjgqLjgq/jgrfjg6fjg7NcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEYXRlU3BlY2lmaWVkQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XHJcbiAgICBwcm9wczogSURhdGVTcGVjaWZpZWRQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwi5pel5LuY5oyH5a6aXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xyXG4gICAgICAgIHRoaXMucHJvcHMgPSB7XHJcbiAgICAgICAgICAgIHZlck5hbWVHZXQ6JycsXHJcbiAgICAgICAgICAgIG5ld1llYXI6MCxcclxuICAgICAgICAgICAgbmV3TW9udGg6MCxcclxuICAgICAgICAgICAgbmV3RGF5OjAsXHJcbiAgICAgICAgICAgIHZlck5hbWU6e25hbWU6Jyd9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LGNvbnRleHQ6SUNvbnRleHQpOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICBjYW5OZXh0OiB0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xyXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzID0gYWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcclxuICAgICAgICAgICAgaWYgKCEoJ3Zlck5hbWUnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3Zlck5hbWVHZXQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElEYXRlU3BlY2lmaWVkUHJvcHM7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICAvL+acrOeVquOCs+ODvOODiemWi+Wni++8mlxyXG4gICAgICAgICAgICAvL+WPluW+l+WkieaVsOOBruWApOOCkuWRvOOBs+WHuuOBl+OBpuS7o+WFpeOBmeOCi++8mlxyXG4gICAgICAgICAgICBjb25zdCBnZXRDb250ZXh0VmFyQnlQYXRoID0gKG9iajogYW55LCBwYXRoOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgb2JqKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgbGV0IHZlck5hbWVHZXRWYWx1ZSA9IGdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMsdGhpcy5wcm9wcy52ZXJOYW1lR2V0KTtcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8v5Y+W5b6X5aSJ5pWw44Gu5YCkRGF0ZeOCquODluOCuOOCp+OCr+ODiOOBq+WkieaPm++8mlxyXG4gICAgICAgICAgICBsZXQgZGF0ZU9iaiA9IG5ldyBEYXRlKHZlck5hbWVHZXRWYWx1ZSk7XHJcbiAgICAgICAgICAgIGlmKHZlck5hbWVHZXRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZlck5hbWVHZXRWYWx1ZSA9PT0gbnVsbCB8fCB2ZXJOYW1lR2V0VmFsdWUgPT09ICcnIHx8IGlzTmFOKGRhdGVPYmouZ2V0RGF0ZSgpKSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRpbWUgdmFsdWVcIik7XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIOW5tOOBruioreWumu+8iG5ld1llYXLjgYzoqK3lrprjgZXjgozjgabjgYTjgarjgYTloLTlkIjjga/jgIHlhYPjga7lgKTjgpLkvb/nlKjvvIlcclxuICAgICAgICAgICAgZGF0ZU9iai5zZXRGdWxsWWVhcih0aGlzLnByb3BzLm5ld1llYXIgPj0xOTAwICYmIHRoaXMucHJvcHMubmV3WWVhciA8PTk5OTkgPyB0aGlzLnByb3BzLm5ld1llYXIgOiBkYXRlT2JqLmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgICAgICAgICAvLyDmnIjjga7oqK3lrprvvIhuZXdNb250aOOBjOioreWumuOBleOCjOOBpuOBhOOBquOBhOWgtOWQiOOBr+OAgeWFg+OBruWApOOCkuS9v+eUqO+8iS8vIOaciOOBrzDlp4vjgb7jgorjgarjga7jgafjgIExMuaciOOBrzEx44CCXHJcbiAgICAgICAgICAgIGRhdGVPYmouc2V0TW9udGgodGhpcy5wcm9wcy5uZXdNb250aCA+PTEgJiYgdGhpcy5wcm9wcy5uZXdNb250aCA8PTEyID8gdGhpcy5wcm9wcy5uZXdNb250aC0xICA6IGRhdGVPYmouZ2V0TW9udGgoKSk7XHJcbiAgICAgICAgICAgIC8vIOaXpeOBruioreWumu+8iG5ld0RheeOBjOioreWumuOBleOCjOOBpuOBhOOBquOBhOWgtOWQiOOBr+OAgeWFg+OBruWApOOCkuS9v+eUqO+8iVxyXG4gICAgICAgICAgICBkYXRlT2JqLnNldERhdGUodGhpcy5wcm9wcy5uZXdEYXkgPj0xICYmIHRoaXMucHJvcHMubmV3RGF5IDw9MzEgP3RoaXMucHJvcHMubmV3RGF5IDogZGF0ZU9iai5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAvLyDlpInmlbDjgavmlrDjgZfjgYTlgKTjgpLoqK3lrppcclxuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lICYmIHRoaXMucHJvcHMudmVyTmFtZS5uYW1lIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdPWRhdGVPYmoudG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0OnRydWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xyXG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdID0gdGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgRGF0ZVNwZWNpZmllZEFjdGlvbigpOyIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG4vKipcbiAqIOeUu+mdouWHpueQhuS4reOBrkxvYWRkaW5n6KGo56S6XG4gKi9cbmV4cG9ydCBjbGFzcyBTbmlwcGVyIHtcbiAgICBwcml2YXRlIHNwaW5uZXJFbGVtZW50OiBKUXVlcnk8SFRNTEVsZW1lbnQ+OztcbiAgICBwcml2YXRlIGNvbnRhaW5lciA6SlF1ZXJ5PEhUTUxFbGVtZW50PjtcbiAgICBjb25zdHJ1Y3RvcihzZWxlY3Rvcjogc3RyaW5nKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9ICQoc2VsZWN0b3I/Pydib2R5Jyk7XG4gICAgICB0aGlzLnNwaW5uZXJFbGVtZW50PXRoaXMuY3JlYXRlU3Bpbm5lcigpO1xuICAgIH1cbiAgXG4gICAgY3JlYXRlU3Bpbm5lcigpIHtcbiAgICAgIGNvbnN0IGh0bWwgPVtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJicy1zY29wZSBhbGMtbG9hZGluZyBhbGMtZG5vbmVcIj4nLFxuICAgICAgICAnPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyXCIgc3R5bGU9XCJ3aWR0aDogM3JlbTsgaGVpZ2h0OiAzcmVtO1wiIHJvbGU9XCJzdGF0dXNcIj4nLFxuICAgICAgICAnPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj48L3NwYW4+JyxcbiAgICAgICAgJzwvZGl2PjwvZGl2PidcbiAgICAgICAgXS5qb2luKFwiXCIpO1xuICAgICAgY29uc3Qgc3Bpbm5lciA9ICQoaHRtbCk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3Bpbm5lcik7XG4gICAgICByZXR1cm4gc3Bpbm5lcjtcbiAgICB9XG4gIFxuICAgIHJlbW92ZVNwaW5uZXIoKSB7XG4gICAgICAgIHRoaXMuc3Bpbm5lckVsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuICBcbiAgICBzaG93U3Bpbm5lcigpIHtcbiAgICAgICAgdGhpcy5zcGlubmVyRWxlbWVudC5yZW1vdmVDbGFzcygnYWxjLWRub25lJyk7XG4gICAgfVxuICBcbiAgICBoaWRlU3Bpbm5lcigpIHtcbiAgICAgICAgdGhpcy5zcGlubmVyRWxlbWVudC5hZGRDbGFzcygnYWxjLWRub25lJyk7XG4gICAgfVxuICB9XG4gICIsIi8qKlxuICog44Oa44O844K444Gu56iu6aGe44KS6KGo44GZ5Z6LXG4gKi9cbmV4cG9ydCB0eXBlIFBhZ2VUeXBlID0gJ2FwcCcgfCAnc2hvdycgfCAnZWRpdCcgfCAnb3RoZXInO1xuXG4vKipcbiAqIHNob3fjg5rjg7zjgrjjga7jg6Ljg7zjg4njgpLooajjgZnlnotcbiAqL1xuZXhwb3J0IHR5cGUgU2hvd1BhZ2VNb2RlID0gJ3Nob3cnIHwgJ2VkaXQnIHwgbnVsbDtcblxuLyoqXG4gKiDjg5rjg7zjgrjjga7nirbmhYvjgpLooajjgZnjgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlU3RhdGUge1xuICB0eXBlOiBQYWdlVHlwZTtcbiAgbW9kZTogU2hvd1BhZ2VNb2RlO1xufVxuXG4vKipcbiAqIFVSTOOBrueJueWumuOBruOCu+OCsOODoeODs+ODiOOCkuWPluW+l+OBmeOCi1xuICogQHBhcmFtIHVybCDliIbmnpDlr77osaHjga5VUkxcbiAqIEBwYXJhbSBpbmRleCDlj5blvpfjgZfjgZ/jgYTjgrvjgrDjg6Hjg7Pjg4jjga7jgqTjg7Pjg4fjg4Pjgq/jgrnvvIjosqDjga7mlbDjga/mnKvlsL7jgYvjgonjga7jgqTjg7Pjg4fjg4Pjgq/jgrnvvIlcbiAqL1xuY29uc3QgZ2V0U2VnbWVudCA9ICh1cmw6IFVSTCwgaW5kZXg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHNlZ21lbnRzID0gdXJsLnBhdGhuYW1lLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4gc2VnbWVudHMuYXQoaW5kZXgpID8/ICcnO1xufTtcblxuLyoqXG4gKiBVUkzjgajjgqLjg5fjg6pJROOBq+WfuuOBpeOBhOOBpuePvuWcqOOBruODmuODvOOCuOOBrueKtuaFi+OCkuWIpOaWreOBmeOCi1xuICogQHBhcmFtIHVybCDliIbmnpDlr77osaHjga5VUkxcbiAqIEBwYXJhbSBhcHBJZCDnorroqo3jgZnjgovjgqLjg5fjg6pJRFxuICovXG5leHBvcnQgY29uc3QgZ2V0UGFnZVN0YXRlID0gKHVybDogc3RyaW5nLCBhcHBJZDogc3RyaW5nKTogUGFnZVN0YXRlID0+IHtcbiAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICBjb25zdCBsYXN0U2VnbWVudCA9IGdldFNlZ21lbnQocGFyc2VkVXJsLCAtMSk7XG4gIGNvbnN0IHNlY29uZExhc3RTZWdtZW50ID0gZ2V0U2VnbWVudChwYXJzZWRVcmwsIC0yKTtcblxuICBpZiAobGFzdFNlZ21lbnQgPT09IGFwcElkICYmIC9eXFxkKyQvLnRlc3QoYXBwSWQpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2FwcCcsIG1vZGU6IG51bGwgfTtcbiAgfVxuXG4gIGlmIChsYXN0U2VnbWVudC50b0xvd2VyQ2FzZSgpID09PSAnc2hvdycgJiYgc2Vjb25kTGFzdFNlZ21lbnQgPT09IGFwcElkICYmIC9eXFxkKyQvLnRlc3QoYXBwSWQpKSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcnNlZFVybC5zZWFyY2hQYXJhbXMuZ2V0KCdtb2RlJyk7XG4gICAgcmV0dXJuIHsgXG4gICAgICB0eXBlOiAnc2hvdycsIFxuICAgICAgbW9kZTogKG1vZGUgPT09ICdzaG93JyB8fCBtb2RlID09PSAnZWRpdCcpID8gbW9kZSA6IG51bGwgXG4gICAgfTtcbiAgfVxuXG4gIGlmIChsYXN0U2VnbWVudC50b0xvd2VyQ2FzZSgpID09PSAnZWRpdCcgJiYgc2Vjb25kTGFzdFNlZ21lbnQgPT09IGFwcElkICYmIC9eXFxkKyQvLnRlc3QoYXBwSWQpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2VkaXQnLCBtb2RlOiBudWxsIH07XG4gIH1cblxuICByZXR1cm4geyB0eXBlOiAnb3RoZXInLCBtb2RlOiBudWxsIH07XG59O1xuXG4vKipcbiAqIOePvuWcqOOBruODmuODvOOCuOOBrueKtuaFi+OCkuWIpOaWreOBmeOCi++8iOePvuWcqOOBrlVSTOOCkuS9v+eUqO+8iVxuICogQHBhcmFtIGFwcElkIOeiuuiqjeOBmeOCi+OCouODl+ODqklEXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50UGFnZVN0YXRlID0gKGFwcElkOiBzdHJpbmcpOiBQYWdlU3RhdGUgPT4gXG4gIGdldFBhZ2VTdGF0ZSh3aW5kb3cubG9jYXRpb24uaHJlZiwgYXBwSWQpO1xuXG4vKipcbiAqIFVSTOOCkuato+imj+WMluOBmeOCi++8iOacq+WwvuOBruOCueODqeODg+OCt+ODpeOCkuWJiumZpO+8iVxuICogQHBhcmFtIHVybCDmraPopo/ljJblr77osaHjga5VUkxcbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVVybCA9ICh1cmw6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgcGFyc2VkVXJsLnBhdGhuYW1lID0gcGFyc2VkVXJsLnBhdGhuYW1lLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gIHJldHVybiBwYXJzZWRVcmwudG9TdHJpbmcoKTtcbn07XG5cbi8qKlxuICogVVJM44KS5a6J5YWo44Gr6Kej5p6Q44GZ44KLXG4gKiBAcGFyYW0gdXJsIOino+aekOWvvuixoeOBrlVSTOaWh+Wtl+WIl1xuICovXG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlVXJsID0gKHVybDogc3RyaW5nKTogVVJMIHwgbnVsbCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodXJsKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbiIsImltcG9ydCB7SUZpZWxkLElBY3Rpb25Ob2RlfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IEtpbnRvbmVSZXN0QVBJQ2xpZW50IH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHsgZ2V0UGFnZVN0YXRlIH0gZnJvbSBcIi4uL3V0aWwvdXJsXCI7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgUmVjb3JkIGFzIEtUUmVjb3JkIH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC90eXBlc1wiO1xuXG5cbi8vIOmajuWxpOWMluODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOBruioreWumuOCpOODs+OCv+ODvOODleOCp+ODvOOCuVxuZXhwb3J0IGludGVyZmFjZSBJQ2FzY2FkaW5nRHJvcERvd24ge1xuICBzb3VyY2VBcHA6IElBcHA7XG4gIGRyb3BEb3duQXBwOiBJQXBwO1xuICBmaWVsZExpc3Q6IElGaWVsZExpc3RbXTtcbn1cblxuLy8g44Ki44OX44Oq44Kx44O844K344On44Oz44Kk44Oz44K/44O844OV44Kn44O844K5XG5leHBvcnQgaW50ZXJmYWNlIElBcHAge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG59XG4vLyDjg5XjgqPjg7zjg6vjg4njg6rjgrnjg4jjgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrlcbmV4cG9ydCBpbnRlcmZhY2UgSUZpZWxkTGlzdCB7XG4gIHNvdXJjZTogSUZpZWxkO1xuICBkcm9wRG93bjogSUZpZWxkO1xufVxuXG5cbi8vIOODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOBrui+nuabuOOCv+OCpOODl+OAgeODieODreODg+ODl+ODgOOCpuODs+OCquODl+OCt+ODp+ODs+OBruaknOe0ouOCkumrmOmAn+WMluOBmeOCi+OBn+OCgeOBq+S9v+eUqFxudHlwZSBEcm9wZG93bkRpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cbi8vIOODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOBruWHpueQhuOCr+ODqeOCuVxuZXhwb3J0IGNsYXNzIERyb3BEb3duTWFuYWdlciB7XG4gIHByaXZhdGUgZGljdGlvbmFyeTogRHJvcGRvd25EaWN0aW9uYXJ5ID0ge307XG4gIHByaXZhdGUgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBzZWxlY3RzOiBNYXA8c3RyaW5nLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29sdW1uTWFwOiBNYXA8SFRNTEVsZW1lbnQsIElGaWVsZExpc3Q+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGNvbHVtTWFwVmFsdWVBcnJheTogSUZpZWxkTGlzdFtdID0gW107XG4gIHByaXZhdGUgY29sdW1NYXBBcnJheTogW0hUTUxFbGVtZW50LCBJRmllbGRMaXN0XVtdID0gW107XG4gIHByaXZhdGUgcHJvcHMgOklDYXNjYWRpbmdEcm9wRG93bjtcbiAgcHJpdmF0ZSBldmVudDpFdmVudDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSUNhc2NhZGluZ0Ryb3BEb3duLGV2ZW50OmFueSl7XG4gICAgdGhpcy5wcm9wcz1wcm9wcztcbiAgICB0aGlzLmV2ZW50PWV2ZW50O1xuICB9XG5cbiAgLy8g5Yid5pyf5YyW44Oh44K944OD44OJXG4gIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBLaW50b25lUmVzdEFQSUNsaWVudCgpO1xuICAgICAgY29uc3Qgc291cmNlQXBwSWQgPSB0aGlzLnByb3BzLnNvdXJjZUFwcC5pZDtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucHJvcHMuZmllbGRMaXN0Lm1hcCgoZikgPT4gZi5zb3VyY2UuY29kZSk7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgY2xpZW50LnJlY29yZC5nZXRBbGxSZWNvcmRzKHtcbiAgICAgICAgYXBwOiBzb3VyY2VBcHBJZCxcbiAgICAgICAgZmllbGRzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpY3Rpb25hcnkgPXRoaXMuYnVpbGREcm9wZG93bkRpY3Rpb25hcnkocmVjb3JkcywgdGhpcy5wcm9wcy5maWVsZExpc3QpO1xuICAgICAgLy8gY29uc3QgaGFzaCA9IGF3YWl0IHRoaXMuY2FsY3VsYXRlSGFzaChyZWNvcmRzLCB0aGlzLmFjdGlvbk5vZGUpO1xuICAgICAgLy8gY29uc3Qgc3RvcmFnZUtleSA9IGBkcm9wZG93bl9kaWN0aW9uYXJ5Ojoke3RoaXMucHJvcHMuZHJvcERvd25BcHAuaWR9XyR7aGFzaH1gO1xuXG4gICAgICAvLyBjb25zdCBsc0RpY3Rpb25hcnkgPSB0aGlzLmdldEZyb21Mb2NhbFN0b3JhZ2Uoc3RvcmFnZUtleSk7XG4gICAgICAvLyB0aGlzLmRpY3Rpb25hcnkgPVxuICAgICAgLy8gICBsc0RpY3Rpb25hcnkgfHwgdGhpcy5idWlsZERyb3Bkb3duRGljdGlvbmFyeShyZWNvcmRzLCB0aGlzLnByb3BzLmZpZWxkTGlzdCk7XG4gICAgICAvLyBpZiAoIWxzRGljdGlvbmFyeSkge1xuICAgICAgLy8gICB0aGlzLnNhdmVUb0xvY2FsU3RvcmFnZShzdG9yYWdlS2V5LCB0aGlzLmRpY3Rpb25hcnkpO1xuICAgICAgLy8gfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIumajuWxpOWMluODieODreODg+ODl+ODgOOCpuODs+OBruWIneacn+WMluS4reOBq+OCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBnzpcIixcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBXZWIgQ3J5cHRvIEFQSeOCkuS9v+eUqOOBl+OBpuODj+ODg+OCt+ODpeWApOOCkuioiOeul1xuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZUhhc2goXG4gICAgcmVjb3JkczogS1RSZWNvcmRbXSxcbiAgICBhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KHJlY29yZHMpICsgSlNPTi5zdHJpbmdpZnkoYWN0aW9uTm9kZSk7XG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShzdHIpO1xuICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdChcIlNIQS0xXCIsIGRhdGEpO1xuICAgIGNvbnN0IGhhc2hBcnJheSA9IEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoaGFzaEJ1ZmZlcikpO1xuICAgIGNvbnN0IGhhc2hIZXggPSBoYXNoQXJyYXlcbiAgICAgIC5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgIC5qb2luKFwiXCIpO1xuICAgIHJldHVybiBoYXNoSGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIOODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOBrui+nuabuOOCkuani+eviVxuICAgKiBAcGFyYW0gcmVjb3JkcyDjg4fjg7zjgr/jgr3jg7zjgrnjga7jg6zjgrPjg7zjg4lcbiAgICogQHBhcmFtIGZpZWxkTGlzdCDjg4fjg7zjgr/jgr3jg7zjgrnjga7pmo7lsaTjg5XjgqPjg7zjg6vjg4lcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRHJvcGRvd25EaWN0aW9uYXJ5KHJlY29yZHM6IEtUUmVjb3JkW10sZmllbGRMaXN0OiBJRmllbGRMaXN0W10pOiBEcm9wZG93bkRpY3Rpb25hcnkge1xuICAgIGNvbnN0IHRlbXBEaWN0aW9uYXJ5OiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7IFwiMF9UT1BcIjogbmV3IFNldCgpIH07XG4gICAgY29uc3QgZmllbGRDb2RlVG9JbmRleE1hcCA9IG5ldyBNYXAoXG4gICAgICBmaWVsZExpc3QubWFwKChmaWVsZCwgaW5kZXgpID0+IFtmaWVsZC5zb3VyY2UuY29kZSwgaW5kZXhdKVxuICAgICk7XG5cbiAgICByZWNvcmRzXG4gICAgICAubWFwKChyZWNvcmQpID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlY29yZClcbiAgICAgICAgICAubWFwKChbZmllbGRDb2RlLCBmaWVsZERhdGFdKSA9PiAoe1xuICAgICAgICAgICAgZmllbGRDb2RlLFxuICAgICAgICAgICAgdmFsdWU6IGZpZWxkRGF0YS52YWx1ZSxcbiAgICAgICAgICAgIGluZGV4OiBmaWVsZENvZGVUb0luZGV4TWFwLmdldChmaWVsZENvZGUpLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaW5kZXggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCEgLSBiLmluZGV4ISlcbiAgICAgIClcbiAgICAgIC5mb3JFYWNoKChyZWNvcmRBcnJheSkgPT4ge1xuICAgICAgICByZWNvcmRBcnJheS5mb3JFYWNoKChpdGVtLCBpbmRleCwgYXJyYXkpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlLCBmaWVsZENvZGUgfSA9IGl0ZW07XG4gICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRlbXBEaWN0aW9uYXJ5W1wiMF9UT1BcIl0uYWRkKHYpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW0gPSBhcnJheVtpbmRleCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNLZXkgPSBgJHtwcmV2aW91c0l0ZW0uaW5kZXh9XyR7cHJldmlvdXNJdGVtLnZhbHVlfWA7XG4gICAgICAgICAgICB0ZW1wRGljdGlvbmFyeVtwcmV2aW91c0tleV0gPVxuICAgICAgICAgICAgICB0ZW1wRGljdGlvbmFyeVtwcmV2aW91c0tleV0gfHwgbmV3IFNldCgpO1xuICAgICAgICAgICAgdGVtcERpY3Rpb25hcnlbcHJldmlvdXNLZXldLmFkZCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBkaWN0aW9uYXJ5OiBEcm9wZG93bkRpY3Rpb25hcnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHNldF0gb2YgT2JqZWN0LmVudHJpZXModGVtcERpY3Rpb25hcnkpKSB7XG4gICAgICBkaWN0aW9uYXJ5W2tleV0gPSBBcnJheS5mcm9tKHNldCkuc29ydCgpO1xuICAgIH1cblxuICAgIHJldHVybiBkaWN0aW9uYXJ5O1xuICB9XG5cbiAgLy8g44Ot44O844Kr44Or44K544OI44Os44O844K444GL44KJ6L6e5pu444KS5Y+W5b6XXG4gIHByaXZhdGUgZ2V0RnJvbUxvY2FsU3RvcmFnZShrZXk6IHN0cmluZyk6IERyb3Bkb3duRGljdGlvbmFyeSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIHRoaXMuY2xlYXJVcERpY3Rpb25hcnkoa2V5KTtcbiAgICByZXR1cm4gZGF0YSA/IEpTT04ucGFyc2UoZGF0YSkgOiBudWxsO1xuICB9XG5cbiAgLy8g5Y+k44GE6L6e5pu444KS44Kv44Oq44KiXG4gIHByaXZhdGUgY2xlYXJVcERpY3Rpb25hcnkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyhsb2NhbFN0b3JhZ2UpXG4gICAgICAuZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoXCJkcm9wZG93bl9kaWN0aW9uYXJ5OjpcIikgJiYgIWsuZW5kc1dpdGgoa2V5KSlcbiAgICAgIC5mb3JFYWNoKChrKSA9PiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrKSk7XG4gIH1cblxuICAvLyDjg63jg7zjgqvjg6vjgrnjg4jjg6zjg7zjgrjjgavovp7mm7jjgpLkv53lrZhcbiAgcHJpdmF0ZSBzYXZlVG9Mb2NhbFN0b3JhZ2Uoa2V5OiBzdHJpbmcsIGRhdGE6IERyb3Bkb3duRGljdGlvbmFyeSk6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICB9XG5cbiAgLy8g44Oa44O844K444Gu54q25oWL44KS5Yem55CGXG4gIGFzeW5jIGhhbmRsZVBhZ2VTdGF0ZShhcHBJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gZ2V0UGFnZVN0YXRlKFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZShcIiNcIiwgXCI/XCIpLFxuICAgICAgYXBwSWRcbiAgICApO1xuXG4gICAgc3dpdGNoIChjdXJyZW50U3RhdGUudHlwZSkge1xuICAgICAgY2FzZSBcImFwcFwiOlxuICAgICAgY2FzZSBcImVkaXRcIjpcbiAgICAgIGNhc2UgXCJzaG93XCI6XG4gICAgICAgIGlmIChjdXJyZW50U3RhdGUudHlwZSA9PT0gXCJzaG93XCIgJiYgY3VycmVudFN0YXRlLm1vZGUgIT09IFwiZWRpdFwiKSBicmVhaztcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIHRoaXMuc2V0dXBDYXNjYWRpbmdEcm9wRG93bihjdXJyZW50U3RhdGUudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIOmajuWxpOWMluODieODreODg+ODl+ODgOOCpuODs+OCkuioreWumuOBmeOCi1xuICBzZXR1cENhc2NhZGluZ0Ryb3BEb3duKHBhZ2VUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgIHBhZ2VUeXBlID09PSBcImFwcFwiID8gXCJ2aWV3LWxpc3QtZGF0YS1nYWlhXCIgOiBcInJlY29yZC1nYWlhXCJcbiAgICApO1xuICAgIGlmICghdGFibGVFbGVtZW50KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwi44Or44O844OI6KaB57Sg44GM6KaL44Gk44GL44KK44G+44Gb44KTXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZihwYWdlVHlwZT09PVwiYXBwXCIpe1xuICAgICAgdGhpcy5pbml0RHJvcGRvd25Db250YWluZXJGb3JMaXN0KCk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmluaXREcm9wZG93bkNvbnRhaW5lcmZvckRldGFpbCh0YWJsZUVsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlckRyb3Bkb3duQ29udGFpbmVyKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiDjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg6Hjg4vjg6Xjg7zjgrPjg7Pjg4bjg4rjgpLliJ3mnJ/ljJYo5LiA6Kan57eo6ZuG55S76Z2iKVxuICAgKiBAcGFyYW0gdGFibGVFbGVtZW50IFxuICAgKi9cbiAgcHJpdmF0ZSBpbml0RHJvcGRvd25Db250YWluZXJGb3JMaXN0KCl7XG4gICAgY29uc3QgZmllbGRMaXN0cyA9IHRoaXMucHJvcHMuZmllbGRMaXN0O1xuICAgIGZpZWxkTGlzdHMuZm9yRWFjaCgoZmxkLGluZGV4LGFycmF5KT0+e1xuICAgICAgIGNvbnN0IGVsZW1zID0ga2ludG9uZS5hcHAuZ2V0RmllbGRFbGVtZW50cyhmbGQuZHJvcERvd24uY29kZSk7XG4gICAgICAgaWYoZWxlbXMpe1xuICAgICAgICBjb25zdCBlZGl0RWxlbSA9ICQoZWxlbXMpLmZpbHRlcihcIi5yZWNvcmRsaXN0LWVkaXRjZWxsLWdhaWFcIikuZ2V0KDApO1xuICAgICAgICBpZihlZGl0RWxlbSE9PXVuZGVmaW5lZCl7XG4gICAgICAgICAgdGhpcy5jb2x1bW5NYXAuc2V0KGVkaXRFbGVtLCBmbGQpO1xuICAgICAgICB9XG4gICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY29sdW1NYXBBcnJheSA9IEFycmF5LmZyb20odGhpcy5jb2x1bW5NYXAuZW50cmllcygpKTtcbiAgICB0aGlzLmNvbHVtTWFwVmFsdWVBcnJheSA9IEFycmF5LmZyb20odGhpcy5jb2x1bW5NYXAudmFsdWVzKCkpO1xuICB9XG5cbiAgLy8g44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Kz44Oz44OG44OK44KS5Yid5pyf5YyWKOaYjue0sOe3qOmbhueUu+mdoilcbiAgcHJpdmF0ZSBpbml0RHJvcGRvd25Db250YWluZXJmb3JEZXRhaWwodGFibGVFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGZpZWxkTGlzdCA9IHRoaXMucHJvcHMuZmllbGRMaXN0O1xuICAgIGxldCBoZWFkZXJDZWxscyA9ICQodGFibGVFbGVtZW50KS5maW5kKFwiLmNvbnRyb2wtZ2FpYVwiKTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkTGlzdCkge1xuICAgICAgY29uc3QgY2VsbCA9IGhlYWRlckNlbGxzLmhhcyhgZGl2LmNvbnRyb2wtbGFiZWwtZ2FpYSBzcGFuOmNvbnRhaW5zKFwiJHtmaWVsZC5kcm9wRG93bi5sYWJlbH1cIilgKS5nZXQoMCk7XG4gICAgICBpZihjZWxsIT09dW5kZWZpbmVkKXtcbiAgICAgICAgY29uc3QgdmFsdWVFbGVtID0gJChjZWxsKS5maW5kKFwiLmNvbnRyb2wtdmFsdWUtZ2FpYVwiKS5nZXQoMCk7XG4gICAgICAgIGlmKHZhbHVlRWxlbSE9PXVuZGVmaW5lZCl7XG4gICAgICAgICAgdGhpcy5jb2x1bW5NYXAuc2V0KGNlbGwsIGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbHVtTWFwQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMuY29sdW1uTWFwLmVudHJpZXMoKSk7XG4gICAgdGhpcy5jb2x1bU1hcFZhbHVlQXJyYXkgPSBBcnJheS5mcm9tKHRoaXMuY29sdW1uTWFwLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8vIOODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOCkuODrOODs+ODgOODquODs+OCsFxuICBwcml2YXRlIHJlbmRlckRyb3Bkb3duQ29udGFpbmVyKCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uTWFwLmZvckVhY2goKGZpZWxkLCBjZWxsKSA9PiB7XG4gICAgICAvLyBjb25zdCBjZWxsID0gY2VsbHNbY29sdW1uSW5kZXhdO1xuICAgICAgaWYgKCFjZWxsKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGlucHV0ID0gY2VsbC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwiaW5wdXRcIik7XG4gICAgICBpZiAoIWlucHV0KSByZXR1cm47XG5cbiAgICAgIHRoaXMuY3JlYXRlU2VsZWN0KGlucHV0LCBmaWVsZC5kcm9wRG93bi5jb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOCkuS9nOaIkFxuICBwcml2YXRlIGNyZWF0ZVNlbGVjdChpbnB1dDogSFRNTElucHV0RWxlbWVudCwgZmllbGRDb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5jbGFzc05hbWUgPSBcImJzLXNjb3BlXCI7XG4gICAgZGl2LnN0eWxlLm1hcmdpbiA9IFwiMC4xMnJlbVwiO1xuICAgIGNvbnN0IHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XG4gICAgc2VsZWN0LmNsYXNzTmFtZSA9IFwiY3VzdG9tLWRyb3Bkb3duIGZvcm0tc2VsZWN0XCI7XG4gICAgc2VsZWN0LmRhdGFzZXQuZmllbGQgPSBmaWVsZENvZGU7XG4gICAgc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKGV2ZW50KSA9PntcbiAgICAgIHRoaXMuc2VsZWN0b3JDaGFuZ2VIYW5kbGUoZmllbGRDb2RlLCBldmVudCk7XG4gICAgICBpbnB1dC52YWx1ZT10aGlzLnN0YXRlW2ZpZWxkQ29kZV07XG4gICAgfSk7XG4gICAgZGl2LmFwcGVuZENoaWxkKHNlbGVjdCk7XG4gICAgdGhpcy51cGRhdGVPcHRpb25zKGZpZWxkQ29kZSwgc2VsZWN0LCBpbnB1dC52YWx1ZSk7XG4gICAgaW5wdXQucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGRpdiwgaW5wdXQubmV4dFNpYmxpbmcpO1xuICAgIGlucHV0LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB0aGlzLnNlbGVjdHMuc2V0KGZpZWxkQ29kZSwgZGl2KTtcblxuICB9XG5cbiAgLy8g44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Gu44Kq44OX44K344On44Oz44KS5pu05pawXG4gIHByaXZhdGUgdXBkYXRlT3B0aW9ucyhcbiAgICBmaWVsZENvZGU6IHN0cmluZyxcbiAgICBpbml0U2VsZWN0PzogSFRNTFNlbGVjdEVsZW1lbnQgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHZhbHVlPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGxldCBzZWxlY3QgPSBpbml0U2VsZWN0O1xuICAgIGlmICghaW5pdFNlbGVjdCkge1xuICAgICAgc2VsZWN0ID0gdGhpcy5zZWxlY3RzXG4gICAgICAgIC5nZXQoZmllbGRDb2RlKVxuICAgICAgICA/LnF1ZXJ5U2VsZWN0b3I8SFRNTFNlbGVjdEVsZW1lbnQ+KFwic2VsZWN0XCIpO1xuICAgICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBg44OV44Kj44O844Or44OJICR7ZmllbGRDb2RlfSDjga7jg4njg63jg4Pjg5fjg4Djgqbjg7Pjg6Hjg4vjg6Xjg7zopoHntKDjgYzopovjgaTjgYvjgorjgb7jgZvjgpNgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZVtmaWVsZENvZGVdID0gdmFsdWUhO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5wcm9wcy5maWVsZExpc3QuZmluZCgoZikgPT4gZi5kcm9wRG93bi5jb2RlID09PSBmaWVsZENvZGUpO1xuICAgIGlmICghZmllbGQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYOODleOCo+ODvOODq+ODiSAke2ZpZWxkQ29kZX0g44Gu6Kit5a6a44GM6KaL44Gk44GL44KK44G+44Gb44KTYCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODiSAke2ZpZWxkQ29kZX0g44Gu6Kit5a6a44GM6KaL44Gk44GL44KK44G+44Gb44KTYCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGV2ZWwgPSB0aGlzLmdldExldmVsKGZpZWxkQ29kZSk7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuZ2V0UHJldmlvdXNWYWx1ZUZyb21TdGF0ZShmaWVsZENvZGUpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMobGV2ZWwsIHByZXZpb3VzVmFsdWUpO1xuICAgIGlmICghc2VsZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+6YG45oqe44GX44Gm44GP44Gg44GV44GEPC9vcHRpb24+JztcbiAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uO1xuICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbjtcbiAgICAgIHNlbGVjdD8uYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICBzZWxlY3QudmFsdWUgPSB2YWx1ZSA/PyB0aGlzLnN0YXRlW2ZpZWxkQ29kZV0gPz8gXCJcIjtcbiAgICBzZWxlY3QuZGlzYWJsZWQgPSBsZXZlbCA+IDAgJiYgIXByZXZpb3VzVmFsdWU7XG4gIH1cblxuICAvLyDjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg6Hjg4vjg6Xjg7zjgYzlpInmm7TjgZXjgozjgZ/lvozjgavjg4jjg6rjgqzjg7zjgZXjgozjgovplqLmlbBcbiAgcHJpdmF0ZSBzZWxlY3RvckNoYW5nZUhhbmRsZT0oZmllbGRDb2RlOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk9PiB7XG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgIHRoaXMuc3RhdGVbZmllbGRDb2RlXSA9IHNlbGVjdC52YWx1ZTtcbiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmdldExldmVsKGZpZWxkQ29kZSk7XG4gICAgdGhpcy5jb2x1bU1hcEFycmF5XG4gICAgICAuZmlsdGVyKChfLCBhcnJheUluZGV4KSA9PiBhcnJheUluZGV4ID4gY3VycmVudExldmVsKVxuICAgICAgLmZvckVhY2goKFtfLCBmaWVsZF0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRDb2RlID0gZmllbGQuZHJvcERvd24uY29kZTtcbiAgICAgICAgdGhpcy51cGRhdGVPcHRpb25zKGZpZWxkQ29kZSk7XG4gICAgICAgIGNvbnN0IGlucHV0RWxlbSA9IHRoaXMuc2VsZWN0cy5nZXQoZmllbGRDb2RlKT8ucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZihpbnB1dEVsZW0pe1xuICAgICAgICAgIGlucHV0RWxlbS52YWx1ZT1cIlwiO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlW2ZpZWxkQ29kZV07XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIOODleOCo+ODvOODq+ODieOBruODrOODmeODq+OCkuWPluW+l1xuICBwcml2YXRlIGdldExldmVsKGZpZWxkQ29kZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bU1hcFZhbHVlQXJyYXkuZmluZEluZGV4KFxuICAgICAgKGZpZWxkKSA9PiBmaWVsZC5kcm9wRG93bi5jb2RlID09PSBmaWVsZENvZGVcbiAgICApO1xuICB9XG5cbiAgLy8g5YmN44Gu44Os44OZ44Or44Gu44OV44Kj44O844Or44OJ44Gu5YCk44KS5Y+W5b6XXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNWYWx1ZUZyb21TdGF0ZShmaWVsZENvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5nZXRMZXZlbChmaWVsZENvZGUpO1xuICAgIGlmIChjdXJyZW50SW5kZXggPD0gMCkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgcHJldmlvdXNGaWVsZCA9IHRoaXMuY29sdW1NYXBWYWx1ZUFycmF5W2N1cnJlbnRJbmRleCAtIDFdO1xuICAgIHJldHVybiB0aGlzLnN0YXRlW3ByZXZpb3VzRmllbGQuZHJvcERvd24uY29kZV0gPz8gXCJcIjtcbiAgfVxuXG4gIC8vIOaMh+WumuOBleOCjOOBn+majuWxpOOBqOWApOOBruODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOCquODl+OCt+ODp+ODs+OCkuWPluW+l1xuICBwcml2YXRlIGdldE9wdGlvbnMobGV2ZWw6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBrZXkgPSBsZXZlbCA9PT0gMCA/IFwiMF9UT1BcIiA6IHRoaXMuYnVpbGRLZXkobGV2ZWwgLSAxLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyeVtrZXldIHx8IFtdO1xuICB9XG5cbiAgLy8g44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Gu44Kt44O844KS5qeL56+JXG4gIHByaXZhdGUgYnVpbGRLZXkobGV2ZWw6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2xldmVsfV8ke3ZhbHVlfWA7XG4gIH1cbn0iLCJpbXBvcnQge1xuICBJQWN0aW9uLFxuICBJQWN0aW9uUmVzdWx0LFxuICBJQWN0aW9uTm9kZSxcbiAgSUFjdGlvblByb3BlcnR5LFxuICBJQ29udGV4dCxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuLy8gaW1wb3J0IHsgS2ludG9uZVJlc3RBUElDbGllbnQgfSBmcm9tIFwiQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50XCI7XG4vLyBpbXBvcnQgeyBnZXRQYWdlU3RhdGUgfSBmcm9tIFwiLi4vdXRpbC91cmxcIjtcbmltcG9ydCB7IFNuaXBwZXIgfSBmcm9tICcuLi91dGlsL3VpLWhlbHBlcic7XG5pbXBvcnQgeyBEcm9wRG93bk1hbmFnZXIsSUNhc2NhZGluZ0Ryb3BEb3duLCBJRmllbGRMaXN0fSBmcm9tICcuLi90eXBlcy9DYXNjYWRpbmdEcm9wRG93bk1hbmFnZXInXG5pbXBvcnQgXCIuL2Nhc2NhZGluZy1kcm9wZG93bi5zY3NzXCI7XG4vLyBpbXBvcnQgeyBSZWNvcmQgYXMgS1RSZWNvcmQgfSBmcm9tIFwiQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L3R5cGVzXCI7XG5cbi8vIOmajuWxpOWMluODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOBruODl+ODreODkeODhuOCo+OCpOODs+OCv+ODvOODleOCp+ODvOOCuVxuaW50ZXJmYWNlIElDYXNjYWRpbmdEcm9wRG93blByb3BzIHtcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgY2FzY2FkaW5nRHJvcERvd246IElDYXNjYWRpbmdEcm9wRG93bjtcbn1cblxuLyoqXG4gKiDpmo7lsaTljJbjg4njg63jg4Pjg5fjg4Djgqbjg7Pjga7jgq/jg6njgrnlrp/oo4VcbiAqL1xuZXhwb3J0IGNsYXNzIENhc2NhZGluZ0Ryb3BEb3duQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBwcm9wczogSUNhc2NhZGluZ0Ryb3BEb3duUHJvcHM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLpmo7lsaTljJbjg4njg63jg4Pjg5fjg4Djgqbjg7NcIjtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XG4gICAgdGhpcy5wcm9wcyA9IHt9IGFzIElDYXNjYWRpbmdEcm9wRG93blByb3BzO1xuICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7jg5fjg63jgrvjgrnlrp/ooYxcbiAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAqIEBwYXJhbSBldmVudCBcbiAgICogQHBhcmFtIGNvbnRleHQgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgYXN5bmMgcHJvY2VzcyhcbiAgICBhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZSxcbiAgICBldmVudDogYW55LFxuICAgIGNvbnRleHQ6IElDb250ZXh0XG4gICk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElDYXNjYWRpbmdEcm9wRG93blByb3BzO1xuXG4gICAgY29uc3QgcmVzdWx0OiBJQWN0aW9uUmVzdWx0ID0geyBjYW5OZXh0OiB0cnVlLCByZXN1bHQ6IFwiXCIgfTtcbiAgICBjb25zdCBzbmlwcGVyID0gbmV3IFNuaXBwZXIoXCJib2R5XCIpO1xuICAgIGNvbnN0IGRyb3BEb3duTWFuYWdlcj0gbmV3IERyb3BEb3duTWFuYWdlcih0aGlzLnByb3BzLmNhc2NhZGluZ0Ryb3BEb3duLGV2ZW50KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLnByb3BzKSByZXR1cm4gcmVzdWx0O1xuICAgICAgY29uc3QgYXBwSWQgPSB0aGlzLnByb3BzLmNhc2NhZGluZ0Ryb3BEb3duLmRyb3BEb3duQXBwLmlkO1xuICAgICAgLy9zbmlwcGVy6KGo56S6XG4gICAgICBzbmlwcGVyLnNob3dTcGlubmVyKCk7XG4gICAgICBhd2FpdCBkcm9wRG93bk1hbmFnZXIuaGFuZGxlUGFnZVN0YXRlKGFwcElkKTtcbiAgICAgIHNuaXBwZXIuaGlkZVNwaW5uZXIoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiQ2FzY2FkaW5nRHJvcERvd25BY3Rpb24g44OX44Ot44K744K55Lit44Gr44Ko44Op44O844GM55m655Sf44GX44G+44GX44GfOlwiLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLCBhY3Rpb25Ob2RlKTtcbiAgICAgIHJldHVybiB7IGNhbk5leHQ6IGZhbHNlLCByZXN1bHQ6IFwiXCIgfTtcbiAgICB9ZmluYWxseXtcbiAgICAgIHNuaXBwZXIucmVtb3ZlU3Bpbm5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdID0gdGhpcztcbiAgfVxufVxuXG5uZXcgQ2FzY2FkaW5nRHJvcERvd25BY3Rpb24oKTtcbiIsIi8qKlxuICog44Ki44OX44Oq5oOF5aCxXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwSW5mbyB7XG4gIGFwcElkOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuKiDjgqLjgq/jgrfjg6fjg7Pjga7jg5fjg63jg5Hjg4bjgqPlrprnvqlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uUHJvcGVydHkge1xuICBjb21wb25lbnQ6IHN0cmluZztcbiAgcHJvcHM6IHtcbiAgICAvL+ODl+ODreODkeODhuOCo+WQjVxuICAgIG5hbWU6IHN0cmluZztcbiAgICAvL+ODl+ODreODkeODhuOCo+ihqOekuuWQjVxuICAgIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAvL+ODl+ODreODkeODhuOCo+ioreWumuWApFxuICAgIG1vZGVsVmFsdWU6IGFueTtcbiAgfTtcbn1cbi8qKlxuICog44Ki44Kv44K344On44Oz44K/44Kk44OX5a6a576pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbk5vZGUge1xuICBpZDogc3RyaW5nO1xuICAvL+OCouOCr+OCt+ODp+ODs+WQjVxuICBuYW1lOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHN1YlRpdGxlOiBzdHJpbmc7XG4gIGlucHV0UG9pbnQ6IHN0cmluZztcbiAgLy/lh7rlipvjg53jgqTjg7Pjg4jvvIjmnaHku7bliIblspDku6XlpJbmnKrkvb/nlKjvvIlcbiAgb3V0cHV0UG9pbnRzOiBBcnJheTxzdHJpbmc+O1xuICAvL+ODq+ODvOODiOOCouOCr+OCt+ODp+ODs++8iEtpbnRvbmUgZXZlbnTvvIlcbiAgaXNSb290OiBib29sZWFuO1xuICAvL+OCouOCr+OCt+ODp+ODs+OBruODl+ODreODkeODhuOCo+Wumue+qVxuICBhY3Rpb25Qcm9wczogQXJyYXk8SUFjdGlvblByb3BlcnR5PjtcbiAgLy/jgqLjgq/jgrfjg6fjg7Pjga7jg5fjg63jg5Hjg4bjgqPoqK3lrprlgKTmir3lh7pcbiAgQWN0aW9uVmFsdWU6IG9iamVjdFxuICBwcmV2Tm9kZUlkPzogc3RyaW5nO1xuICBuZXh0Tm9kZUlkczogTWFwPHN0cmluZywgc3RyaW5nPjtcbn1cbi8qKlxuICog44Ki44Kv44K344On44Oz44OV44Ot44O844Gu5a6a576pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbkZsb3cge1xuICBpZDogc3RyaW5nO1xuICBhY3Rpb25Ob2RlczogSUFjdGlvbk5vZGVbXTtcbiAgZmluZE5vZGVCeUlkKGlkOiBzdHJpbmcpOiBJQWN0aW9uTm9kZSB8IHVuZGVmaW5lZDtcbiAgdG9KU09OKCk6IGFueTtcbiAgZ2V0Um9vdCgpOiBJQWN0aW9uTm9kZSB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uUmVzdWx0e1xuICBjYW5OZXh0OmJvb2xlYW47XG4gIHJlc3VsdD86YW55O1xufVxuXG4vKipcbiAqIOOCs+ODs+ODhuOCreOCueODiFxuICog44Os44Kz44O844OJ44Go44OV44Ot44O844Gu5aSJ5pWw44KS5oyB44GkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRleHR7XG4gIHJlY29yZDphbnksXG4gIHZhcmlhYmxlczphbnksXG4gIGVycm9yczpFcnJvck1hbmFnZXJcbn1cblxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7jgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9ue1xuICAvL+OCouOCr+OCt+ODp+ODs+OBruWQjeWJje+8iOODpuODvOODi+ODg+OCr+WQjeOBjOW/heimge+8iVxuICBuYW1lOnN0cmluZztcbiAgLy/lsZ7mgKfoqK3lrprmg4XloLFcbiAgYWN0aW9uUHJvcHM6IEFycmF5PElBY3Rpb25Qcm9wZXJ0eT47XG4gIC8v44Ki44Kv44K344On44Oz44Gu44OX44Ot44K744K55a6f6KGM6Zai5pWwXG4gIHByb2Nlc3MocHJvcDpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PjtcbiAgLy/jgqLjgq/jgrfjg6fjg7Pjga7nmbvpjLLplqLmlbBcbiAgcmVnaXN0ZXIoKTp2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGaWVsZHtcbiAgbmFtZT86c3RyaW5nO1xuICBjb2RlOnN0cmluZztcbiAgdHlwZT86c3RyaW5nO1xuICByZXF1aXJlZD86Ym9vbGVhbjtcbiAgb3B0aW9ucz86c3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbn1cbi8v5aSJ5pWw44Gu44Kk44Oz44K/44O844OV44Kn44O844K5XG5leHBvcnQgaW50ZXJmYWNlIElWYXJOYW1le1xuICBuYW1lOnN0cmluZztcbiAgZmllbGRzPzpJVmFyTmFtZVtdO1xufVxuXG4vKipcbiAqIOODpuODvOOCtuODvOOAgeOCsOODq+ODvOODl+OAgee1hOe5lOOBquOBqeOCquODluOCuOOCp+OCr+ODiOmhnuWei1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlVmFsdWUge1xuICBjb2RlOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICog44Ki44Kv44K344On44Oz44Gu44OX44Ot44OR44OG44Kj5a6a576p44Gr5Z+644Gl44GE44Gf44Kv44Op44K5XG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25Qcm9wZXJ0eSBpbXBsZW1lbnRzIElBY3Rpb25Qcm9wZXJ0eSB7XG4gIGNvbXBvbmVudDogc3RyaW5nO1xuICBwcm9wczoge1xuICAgIC8vIOODl+ODreODkeODhuOCo+WQjVxuICAgIG5hbWU6IHN0cmluZztcbiAgICAvLyDjg5fjg63jg5Hjg4bjgqPooajnpLrlkI1cbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICAgLy8g44OX44Ot44OR44OG44Kj6Kit5a6a5YCkXG4gICAgbW9kZWxWYWx1ZTogYW55O1xuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcGVydHkoKTogSUFjdGlvblByb3BlcnR5IHtcbiAgICByZXR1cm4gbmV3IEFjdGlvblByb3BlcnR5KCdJbnB1dFRleHQnLCAnZGlzcGxheU5hbWUnLCAn6KGo56S65ZCNJywgJ+ihqOekuuOCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhCcsICcnKTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb21wb25lbnQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuICAgIG1vZGVsVmFsdWU6IGFueVxuICApIHtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLnByb3BzID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlcixcbiAgICAgIG1vZGVsVmFsdWU6IG1vZGVsVmFsdWVcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogSUFjdGlvbk5vZGXjga7lrp/oo4XjgIFSb290QWN0aW9uTm9kZeS7peWkluOBruOCouOCr+OCt+ODp+ODs+Wumue+qVxuICovXG5leHBvcnQgY2xhc3MgQWN0aW9uTm9kZSBpbXBsZW1lbnRzIElBY3Rpb25Ob2RlIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5hY3Rpb25Qcm9wcy5maW5kKChwcm9wKSA9PiBwcm9wLnByb3BzLm5hbWUgPT09IFwiZGlzcGxheU5hbWVcIik7XG4gICAgcmV0dXJuIHByb3A/LnByb3BzLm1vZGVsVmFsdWU7XG4gIH07XG4gIGdldCBzdWJUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH07XG4gIGlucHV0UG9pbnQ6IHN0cmluZztcbiAgLy/lh7rlipvjg53jgqTjg7Pjg4jvvIjmnaHku7bliIblspDku6XlpJbmnKrkvb/nlKjvvIlcbiAgb3V0cHV0UG9pbnRzOiBBcnJheTxzdHJpbmc+O1xuICBhY3Rpb25Qcm9wczogQXJyYXk8SUFjdGlvblByb3BlcnR5PjtcbiAgZ2V0IGlzUm9vdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGdldCBBY3Rpb25WYWx1ZSgpOiBvYmplY3Qge1xuICAgIGNvbnN0IHByb3BWYWx1ZTogYW55ID0ge307XG4gICAgdGhpcy5hY3Rpb25Qcm9wcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgcHJvcFZhbHVlW3ZhbHVlLnByb3BzLm5hbWVdID0gdmFsdWUucHJvcHMubW9kZWxWYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiBwcm9wVmFsdWU7XG4gIH07XG4gIHByZXZOb2RlSWQ/OiBzdHJpbmc7XG4gIG5leHROb2RlSWRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdHJ1Y3RvcihcbiAgICB7aWQsbmFtZSx0aXRsZSxpbnB1dFBvaW50LG91dHB1dFBvaW50cyxhY3Rpb25Qcm9wc306XG4gICAge1xuICAgICAgaWQ6c3RyaW5nLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgIGlucHV0UG9pbnQ6IHN0cmluZyxcbiAgICAgIG91dHB1dFBvaW50czogQXJyYXk8c3RyaW5nPixcbiAgICAgIGFjdGlvblByb3BzOiBBcnJheTxJQWN0aW9uUHJvcGVydHk+fVxuICApIHtcbiAgICB0aGlzLmlkPWlkO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5pbnB1dFBvaW50ID0gaW5wdXRQb2ludDtcbiAgICB0aGlzLm91dHB1dFBvaW50cyA9IG91dHB1dFBvaW50cztcbiAgICBjb25zdCBkZWZQcm9wID0gQWN0aW9uUHJvcGVydHkuZGVmYXVsdFByb3BlcnR5KCk7XG4gICAgZGVmUHJvcC5wcm9wcy5tb2RlbFZhbHVlID0gdGl0bGU7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvblByb3BzO1xuICAgIHRoaXMubmV4dE5vZGVJZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICB9XG5cbn1cbi8qKlxuICog44Or44O844OI44Ki44Kv44K344On44Oz5a6a576pXG4gKi9cbmV4cG9ydCBjbGFzcyBSb290QWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbk5vZGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHN1YlRpdGxlOiBzdHJpbmc7XG4gIGlucHV0UG9pbnQ6IHN0cmluZztcbiAgLy/lh7rlipvjg53jgqTjg7Pjg4jvvIjmnaHku7bliIblspDku6XlpJbmnKrkvb/nlKjvvIlcbiAgb3V0cHV0UG9pbnRzOiBBcnJheTxzdHJpbmc+O1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGFjdGlvblByb3BzOiBBcnJheTxJQWN0aW9uUHJvcGVydHk+O1xuICBBY3Rpb25WYWx1ZTogb2JqZWN0O1xuICBwcmV2Tm9kZUlkPzogc3RyaW5nID0gdW5kZWZpbmVkO1xuICBuZXh0Tm9kZUlkczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3RydWN0b3IoXG4gICAge2lkLG5hbWUsdGl0bGUsc3ViVGl0bGV9OntcbiAgICAgIGlkOnN0cmluZyxcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICBzdWJUaXRsZTogc3RyaW5nfVxuICApIHtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgdGhpcy5zdWJUaXRsZSA9IHN1YlRpdGxlO1xuICAgIHRoaXMuaW5wdXRQb2ludCA9ICcnO1xuICAgIHRoaXMub3V0cHV0UG9pbnRzID0gW107XG4gICAgdGhpcy5pc1Jvb3QgPSB0cnVlO1xuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcbiAgICB0aGlzLkFjdGlvblZhbHVlID0ge307XG4gICAgdGhpcy5uZXh0Tm9kZUlkcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIH1cbn1cblxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjg5Xjg63jg7zjga7lrprnvqlcbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGlvbkZsb3cgaW1wbGVtZW50cyBJQWN0aW9uRmxvdyB7XG4gIGlkOiBzdHJpbmc7XG4gIGFjdGlvbk5vZGVzOiBBcnJheTxJQWN0aW9uTm9kZT47XG4gIGNvbnN0cnVjdG9yKGFjdGlvbk5vZGVzOiBBcnJheTxJQWN0aW9uTm9kZT4gfCBSb290QWN0aW9uKSB7XG4gICAgaWYgKGFjdGlvbk5vZGVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRoaXMuYWN0aW9uTm9kZXMgPSBhY3Rpb25Ob2RlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3Rpb25Ob2RlcyA9IFthY3Rpb25Ob2Rlc107XG4gICAgfVxuICAgIHRoaXMuaWQgPSAnJztcbiAgfVxuICAvKioqXG4gICAqIElE44GnQWN0aW9uTm9kZeOCkuWPluW+l+OBmeOCi1xuICAgKi9cbiAgZmluZE5vZGVCeUlkKGlkOiBzdHJpbmcpOiBJQWN0aW9uTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uTm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGFjdGlvbk5vZGVzOiB0aGlzLmFjdGlvbk5vZGVzLm1hcChub2RlID0+IHtcbiAgICAgICAgY29uc3QgeyBuZXh0Tm9kZUlkcywgLi4ucmVzdCB9ID0gbm9kZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICAgIG5leHROb2RlSWRzOiBBcnJheS5mcm9tKG5leHROb2RlSWRzLmVudHJpZXMoKSlcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIGdldFJvb3QoKTogSUFjdGlvbk5vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFjdGlvbk5vZGVzLmZpbmQobm9kZSA9PiBub2RlLmlzUm9vdClcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBzdHJpbmcpOiBBY3Rpb25GbG93IHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBKU09OLnBhcnNlKGpzb24pO1xuXG4gICAgY29uc3QgYWN0aW9uTm9kZXMgPSBwYXJzZWRPYmplY3QuYWN0aW9uTm9kZXMubWFwKChub2RlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IG5vZGVDbGFzcyA9ICFub2RlLmlzUm9vdCA/IG5ldyBBY3Rpb25Ob2RlKG5vZGUpXG4gICAgICAgIDogbmV3IFJvb3RBY3Rpb24obm9kZSk7XG4gICAgICBub2RlQ2xhc3MubmV4dE5vZGVJZHMgPSBuZXcgTWFwPHN0cmluZyxzdHJpbmc+KE9iamVjdC5lbnRyaWVzKG5vZGUubmV4dE5vZGVJZHMpKTtcbiAgICAgIG5vZGVDbGFzcy5wcmV2Tm9kZUlkID0gbm9kZS5wcmV2Tm9kZUlkO1xuICAgICAgbm9kZUNsYXNzLmlkID0gbm9kZS5pZDtcbiAgICAgIHJldHVybiBub2RlQ2xhc3M7XG4gICAgfSk7XG4gICAgY29uc3QgYWN0aW9uRmxvdyA9IG5ldyBBY3Rpb25GbG93KGFjdGlvbk5vZGVzKTtcbiAgICBhY3Rpb25GbG93LmlkID0gcGFyc2VkT2JqZWN0LmlkO1xuICAgIHJldHVybiBhY3Rpb25GbG93O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGlvbkVycm9ye1xuICBhY3Rpb246IElBY3Rpb25Ob2RlLFxuICBlcnJvcjpzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yTWFuYWdlcntcbiAgcHJpdmF0ZSBlcnJvcnM6SUFjdGlvbkVycm9yW109W107XG4gIFxuICBwdWJsaWMgZ2V0IGhhc0Vycm9yKCk6Ym9vbGVhbntcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMubGVuZ3RoPjA7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRXJyb3IoZXJyOmFueSxhY3Rpb246SUFjdGlvbk5vZGUsZGVmYXVsdE1lc3NhZ2U/OnN0cmluZyl7XG4gICAgY29uc3QgZGVmTXNnID0gZGVmYXVsdE1lc3NhZ2UgPyBkZWZhdWx0TWVzc2FnZSA6ICcnO1xuICAgIGxldCBlcnJvciA9IGVyciBpbnN0YW5jZW9mIEVycm9yPyBgJHtkZWZNc2d9ICR7ZXJyLm1lc3NhZ2V9YCA6IGRlZk1zZyA7XG4gICAgY29uc29sZS5lcnJvcihg44CMJHthY3Rpb24ubmFtZX3jgI3lh6bnkIbkuK3kvovlpJbnmbrnlJ/jgZfjgb7jgZfjgZ/jgIJgLGVycik7XG4gICAgdGhpcy5lcnJvcnMucHVzaCh7ZXJyb3IsYWN0aW9ufSk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXZlbnQoZXZlbnQ6YW55KXtcbiAgICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmVycm9ycy5tYXAoKGVycik9PntcbiAgICAgICAgcmV0dXJuIGDjgIwke2Vyci5hY3Rpb24ubmFtZX3jgI3lh6bnkIbkuK3kvovlpJbnmbrnlJ/jgZfjgb7jgZfjgZ/jgIJcXG7oqbPntLA6JHtlcnIuZXJyb3J9YDtcbiAgICAgfSk7IFxuICAgICBldmVudC5lcnJvcj1tZXNzYWdlcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93RXJyb3IoKXtcbiAgICBjb25zdCBtc2cgPXRoaXMuZXJyb3JzLm1hcCgoZXJyKT0+e1xuICAgICAgcmV0dXJuIGDjgIwke2Vyci5hY3Rpb24ubmFtZX3jgI3lh6bnkIbkuK3kvovlpJbnmbrnlJ/jgZfjgb7jgZfjgZ/jgIJcXG7oqbPntLA6JHtlcnIuZXJyb3J9YDtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWxlcnQobXNnKTtcbiAgICAvLyBjb25zdCBodG1sPVxuICAgIC8vIGA8ZGl2IGlkPVwibXlhbGVydFwiIGNsYXNzPVwibm90aWZpZXItY3lib3p1IG5vdGlmaWVyLWVycm9yLWN5Ym96dVwiIHN0eWxlPVwibGVmdDogNTAlOyB0b3A6IDBweDtcIj5cbiAgICAvLyA8ZGl2IGNsYXNzPVwibm90aWZpZXItaGVhZGVyLWN5Ym96dVwiPjxkaXYgY2xhc3M9XCJub3RpZmllci10aXRsZS1jeWJvenVcIj7jgqjjg6njg7w8L2Rpdj5cbiAgICAvLyA8dWwgY2xhc3M9XCJub3RpZmllci1ib2R5LWN5Ym96dVwiPjxsaT4ke21zZ308L2xpPjwvdWw+PC9kaXY+XG4gICAgLy8gPGEgY2xhc3M9XCJub3RpZmllci1yZW1vdmUtY3lib3p1XCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiPjwvYT48L2Rpdj5gXG4gICAgLy8gY29uc3QgYWxlcnQgPSAkKGh0bWwpLmFwcGVuZFRvKFwiYm9keVwiKTtcbiAgICAvLyBhbGVydC5jaGlsZHJlbihcIiNteWFsZXJ0IC5ub3RpZmllci1yZW1vdmUtY3lib3p1XCIpLm9uKFwiY2xpY2tcIiwoZXYpPT57XG4gICAgLy8gICAgJChcIm15YWxlcnRcIikuc2xpZGVVcCgpLnJlbW92ZSgpO1xuICAgIC8vIH0pO1xuICB9XG59XG5cbiIsIlxuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi4uL2FjdGlvbnNcIjtcbmltcG9ydCAnLi4vYWN0aW9ucy9tdXN0LWlucHV0JztcbmltcG9ydCAnLi4vYWN0aW9ucy9hdXRvLW51bWJlcmluZyc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvZmllbGQtc2hvd24nO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2Vycm9yLXNob3cnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2J1dHRvbi1hZGQnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2NvbmRpdGlvbi1hY3Rpb24nO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2RhdGEtcHJvY2Vzc2luZyc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvZGF0YS11cGRhdGUnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2N1cnJlbnQtZmllbGQtZ2V0JztcbmltcG9ydCAnLi4vYWN0aW9ucy9yZWd1bGFyLWNoZWNrJztcbmltcG9ydCAnLi4vYWN0aW9ucy9tYWlsLWNoZWNrJztcbmltcG9ydCAnLi4vYWN0aW9ucy9jb3VudGVyLWNoZWNrJztcbmltcG9ydCAnLi4vYWN0aW9ucy9kYXRldGltZS1nZXR0ZXInO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2luc2VydC12YWx1ZSc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvdmFsdWUtZ2V0dGVyJztcbmltcG9ydCAnLi4vYWN0aW9ucy9zdHJpbmctam9pbic7XG5pbXBvcnQgJy4uL2FjdGlvbnMvdmFsaWRhdGlvbi1mdWxsd2lkdGgnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL3ZhbGlkYXRpb24taGFsZndpZHRoJztcbmltcG9ydCAnLi4vYWN0aW9ucy9oYWxmLWZ1bGwtY29udmVyc2lvbic7XG5pbXBvcnQgJy4uL2FjdGlvbnMvbG9naW4tdXNlci1nZXR0ZXInO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2F1dG8tbG9va3VwJztcbmltcG9ydCAnLi4vYWN0aW9ucy9maWVsZC1kaXNhYmxlJztcbmltcG9ydCAnLi4vYWN0aW9ucy9zdHlsZS1maWVsZCc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvZGF0ZXRpbWUtY2FsYyc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvZW5kLW9mLW1vbnRoJztcbmltcG9ydCAnLi4vYWN0aW9ucy9kYXRlLXNwZWNpZmllZCc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvY2FzY2FkaW5nLWRyb3Bkb3duJztcbmltcG9ydCB7IEFjdGlvbkZsb3csRXJyb3JNYW5hZ2VyLElBY3Rpb25GbG93LCBJQWN0aW9uUmVzdWx0LElDb250ZXh0IH0gZnJvbSBcIi4vQWN0aW9uVHlwZXNcIjtcbmNvbnN0IFNob3dFcnJvckV2ZW50czpzdHJpbmdbXSA9IFtcbiAgICBcImFwcC5yZWNvcmQuY3JlYXRlLnN1Ym1pdC5zdWNjZXNzXCIsXG4gICAgXCJhcHAucmVjb3JkLmVkaXQuc3VibWl0LnN1Y2Nlc3NcIixcbiAgICBcImFwcC5yZWNvcmQuaW5kZXguZWRpdC5zdWJtaXQuc3VjY2Vzc1wiLFxuICBdO1xuZXhwb3J0IGNsYXNzIEFjdGlvblByb2Nlc3N7XG4gICAgZXZlbnRJZDpzdHJpbmc7XG4gICAgZmxvdzpJQWN0aW9uRmxvdztcbiAgICBldmVudDphbnk7XG4gICAgY29udGV4dDpJQ29udGV4dDtcbiAgICAgY29uc3RydWN0b3IoZXZlbnRJZDpzdHJpbmcsZmxvdzpBY3Rpb25GbG93LGV2ZW50OmFueSl7XG4gICAgICAgIHRoaXMuZXZlbnRJZD1ldmVudElkO1xuICAgICAgICB0aGlzLmZsb3c9ZmxvdztcbiAgICAgICAgdGhpcy5ldmVudD1ldmVudDtcbiAgICAgICAgY29uc3QgZXJyb3JtYW5hZ2VyID0gbmV3IEVycm9yTWFuYWdlcigpO1xuIFxuICAgICAgICB0aGlzLmNvbnRleHQ9e1xuICAgICAgICAgICAgcmVjb3JkOnRoaXMuZXZlbnQucmVjb3JkLFxuICAgICAgICAgICAgdmFyaWFibGVzOnt9LFxuICAgICAgICAgICAgZXJyb3JzOmVycm9ybWFuYWdlclxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyBleGVjKCl7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLmZsb3cuZ2V0Um9vdCgpO1xuICAgICAgICBpZihyb290PT09dW5kZWZpbmVkIHx8IHJvb3QubmV4dE5vZGVJZHMuc2l6ZT09PTApe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZD1yb290Lm5leHROb2RlSWRzLmdldCgnJyk7XG4gICAgICAgIGlmKGlkPT09dW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXh0QWN0aW9uID0gdGhpcy5mbG93LmZpbmROb2RlQnlJZChpZCk7IFxuICAgICAgICBsZXQgcmVzdWx0OklBY3Rpb25SZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHdoaWxlKG5leHRBY3Rpb24hPT11bmRlZmluZWQgJiYgcmVzdWx0LmNhbk5leHQpe1xuICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25BZGRpbnNbbmV4dEFjdGlvbi5uYW1lXTtcbiAgICAgICAgICAgaWYoYWN0aW9uIT09dW5kZWZpbmVkKXtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGFjdGlvbi5wcm9jZXNzKG5leHRBY3Rpb24sdGhpcy5ldmVudCx0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICB9XG4gICAgICAgICAgIGxldCBuZXh0SW5wdXQgPSAnJztcbiAgICAgICAgICAgLy9vdXRwdXRQb2ludHPkuIDjgaTku6XkuIrjga7loLTlkIjjgIHmrKHjga5JbnB1dFBvaW5044Gv5oi744KK5YCk44KS6Kit5a6a44GZ44KLXG4gICAgICAgICAgIGlmKG5leHRBY3Rpb24ub3V0cHV0UG9pbnRzICYmIG5leHRBY3Rpb24ub3V0cHV0UG9pbnRzLmxlbmd0aD4xKXtcbiAgICAgICAgICAgICBuZXh0SW5wdXQgPSByZXN1bHQucmVzdWx0fHwnJztcbiAgICAgICAgICAgfVxuICAgICAgICAgICBpZD1uZXh0QWN0aW9uLm5leHROb2RlSWRzLmdldChuZXh0SW5wdXQpO1xuICAgICAgICAgICBpZihpZD09PXVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgICAgIG5leHRBY3Rpb24gPSB0aGlzLmZsb3cuZmluZE5vZGVCeUlkKGlkKTsgXG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5jb250ZXh0LmVycm9ycy5oYXNFcnJvcil7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZXJyb3JzLnNldEV2ZW50KHRoaXMuZXZlbnQpOyBcbiAgICAgICAgICAgIGlmKFNob3dFcnJvckV2ZW50cy5pbmNsdWRlcyh0aGlzLmV2ZW50LnR5cGUpKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZXJyb3JzLnNob3dFcnJvcigpO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgQWN0aW9uUHJvY2VzcyB9IGZyb20gJy4vdHlwZXMvYWN0aW9uLXByb2Nlc3MnO1xuaW1wb3J0IHsgQWN0aW9uRmxvdyB9IGZyb20gJy4vdHlwZXMvQWN0aW9uVHlwZXMnO1xuaW1wb3J0IHsgRmxvd0luZm8gfSBmcm9tICcuL3R5cGVzL2Zsb3dTZXR0aW5nJztcblxuZGVjbGFyZSBjb25zdCBhbGNmbG93IDoge1xuICBba2V5OnN0cmluZ106Rmxvd0luZm9cbn07XG5cbiQoZnVuY3Rpb24gKCl7XG4gICAgY29uc3QgZ2V0Q2hhbmdlRXZlbnRzPShldmVudHM6c3RyaW5nW10pPT57XG4gICAgICByZXR1cm4gZXZlbnRzLmZpbHRlcigoZXZlbnQpPT5ldmVudC5pbmNsdWRlcyhcIi5jaGFuZ2UuXCIpKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0Q2xpY2tFdmVudHM9KGV2ZW50czpzdHJpbmdbXSk9PntcbiAgICAgIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCk9PmV2ZW50LmluY2x1ZGVzKFwiLmN1c3RvbUJ1dHRvbkNsaWNrLlwiKSk7XG4gICAgfVxuICAgIGNvbnN0IGdldEtpbnRvbmVFdmVudHM9KGV2ZW50czpzdHJpbmdbXSk9PntcbiAgICAgIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCk9PntcbiAgICAgICAgcmV0dXJuICFldmVudC5pbmNsdWRlcyhcIi5jdXN0b21CdXR0b25DbGljay5cIikgJiYgIWV2ZW50LmluY2x1ZGVzKFwiLmNoYW5nZS5cIilcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBldmVudHM9T2JqZWN0LmtleXMoYWxjZmxvdyk7XG4gICAgY29uc3QgY2hhbmdlRXZlbnRzID0gZ2V0Q2hhbmdlRXZlbnRzKGV2ZW50cyk7XG4gICAgY29uc3QgY2xpY2tFdmVudHMgPSBnZXRDbGlja0V2ZW50cyhldmVudHMpO1xuICAgIGNvbnN0IGtpbnRvbmVFdmVudHMgPSBnZXRLaW50b25lRXZlbnRzKGV2ZW50cyk7XG4gICAgaWYoa2ludG9uZUV2ZW50cy5sZW5ndGg+MCApe1xuICAgICAgLy/pgJrluLhLaW50b25l44Kk44OZ44Oz44OI44KS44OQ44Oz44OJXG4gICAgICBraW50b25lLmV2ZW50cy5vbihraW50b25lRXZlbnRzLGFzeW5jIChldmVudDphbnkpPT57XG4gICAgICAgIGNvbnN0IGZsb3dpbmZvID0gYWxjZmxvd1tldmVudC50eXBlXTtcbiAgICAgICAgY29uc3QgZmxvdz1BY3Rpb25GbG93LmZyb21KU09OKGZsb3dpbmZvLmNvbnRlbnQpO1xuICAgICAgICBpZihmbG93IT09dW5kZWZpbmVkKXtcbiAgICAgICAgICBjb25zdCBwcm9jZXNzID0gbmV3IEFjdGlvblByb2Nlc3MoZXZlbnQudHlwZSxmbG93LGV2ZW50KTtcbiAgICAgICAgICBhd2FpdCBwcm9jZXNzLmV4ZWMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYoY2hhbmdlRXZlbnRzLmxlbmd0aD4wKXtcbiAgICAgIC8v5YCk5aSJ5pu044Kk44OZ44Oz44OI44KS44OQ44Oz44OJ44GZ44KLXG4gICAgICBraW50b25lLmV2ZW50cy5vbihjaGFuZ2VFdmVudHMsKGV2ZW50OmFueSk9PntcbiAgICAgICAgY29uc3QgZmxvd2luZm8gPSBhbGNmbG93W2V2ZW50LnR5cGVdO1xuICAgICAgICBjb25zdCBmbG93PUFjdGlvbkZsb3cuZnJvbUpTT04oZmxvd2luZm8uY29udGVudCk7XG4gICAgICAgIGlmKGZsb3chPT11bmRlZmluZWQpe1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBuZXcgQWN0aW9uUHJvY2VzcyhldmVudC50eXBlLGZsb3csZXZlbnQpO1xuICAgICAgICAgIHByb2Nlc3MuZXhlYygpLnRoZW4oKHJlcyk9PntcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGV2ZW50LnJlY29yZDsgIFxuICAgICAgICAgICAga2ludG9uZS5hcHAucmVjb3JkLnNldCh7cmVjb3JkfSk7XG4gICAgICAgICAgfSkuY2F0Y2goKGVycik9PntcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYoY2xpY2tFdmVudHMubGVuZ3RoPjApe1xuICAgICAgY2xpY2tFdmVudHMuZm9yRWFjaCgoZXZlbnROYW1lOnN0cmluZyk9PntcbiAgICAgICAgJChkb2N1bWVudCkub24oZXZlbnROYW1lLGFzeW5jICgpPT57XG4gICAgICAgICAgY29uc3QgZXZlbnQ9a2ludG9uZS5hcHAucmVjb3JkLmdldCgpO1xuICAgICAgICAgIGNvbnN0IGZsb3dpbmZvID0gYWxjZmxvd1tldmVudE5hbWVdO1xuICAgICAgICAgIGNvbnN0IGZsb3c9QWN0aW9uRmxvdy5mcm9tSlNPTihmbG93aW5mby5jb250ZW50KTtcbiAgICAgICAgICBpZihmbG93IT09dW5kZWZpbmVkKXtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBuZXcgQWN0aW9uUHJvY2VzcyhldmVudE5hbWUsZmxvdyxldmVudCk7XG4gICAgICAgICAgICBhd2FpdCBwcm9jZXNzLmV4ZWMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgICAgICAgIGtpbnRvbmUuYXBwLnJlY29yZC5zZXQoe3JlY29yZH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbn0pOyJdLCJuYW1lcyI6WyJnbG9iYWwiLCJmYWN0b3J5IiwibW9kdWxlIiwidyIsInRoaXMiLCJ3aW5kb3ciLCJub0dsb2JhbCIsImFyciIsImdldFByb3RvIiwic2xpY2UiLCJmbGF0IiwiYXJyYXkiLCJwdXNoIiwiaW5kZXhPZiIsImNsYXNzMnR5cGUiLCJ0b1N0cmluZyIsImhhc093biIsImZuVG9TdHJpbmciLCJPYmplY3RGdW5jdGlvblN0cmluZyIsInN1cHBvcnQiLCJpc0Z1bmN0aW9uIiwib2JqIiwiaXNXaW5kb3ciLCJkb2N1bWVudCIsInByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMiLCJET01FdmFsIiwiY29kZSIsIm5vZGUiLCJkb2MiLCJpIiwidmFsIiwic2NyaXB0IiwidG9UeXBlIiwidmVyc2lvbiIsInJodG1sU3VmZml4IiwialF1ZXJ5Iiwic2VsZWN0b3IiLCJjb250ZXh0IiwibnVtIiwiZWxlbXMiLCJyZXQiLCJjYWxsYmFjayIsImVsZW0iLCJfZWxlbSIsImxlbiIsImoiLCJvcHRpb25zIiwibmFtZSIsInNyYyIsImNvcHkiLCJjb3B5SXNBcnJheSIsImNsb25lIiwidGFyZ2V0IiwibGVuZ3RoIiwiZGVlcCIsIm1zZyIsInByb3RvIiwiQ3RvciIsImlzQXJyYXlMaWtlIiwibm9kZVR5cGUiLCJyZXN1bHRzIiwibmFtZXNwYWNlIiwiZG9jRWxlbSIsImZpcnN0Iiwic2Vjb25kIiwiaW52ZXJ0IiwiY2FsbGJhY2tJbnZlcnNlIiwibWF0Y2hlcyIsImNhbGxiYWNrRXhwZWN0IiwiYXJnIiwidmFsdWUiLCJfaSIsInR5cGUiLCJub2RlTmFtZSIsInBvcCIsInNvcnQiLCJzcGxpY2UiLCJ3aGl0ZXNwYWNlIiwicnRyaW1DU1MiLCJhIiwiYiIsImJ1cCIsInJjc3Nlc2NhcGUiLCJmY3NzZXNjYXBlIiwiY2giLCJhc0NvZGVQb2ludCIsInNlbCIsInByZWZlcnJlZERvYyIsInB1c2hOYXRpdmUiLCJFeHByIiwib3V0ZXJtb3N0Q29udGV4dCIsInNvcnRJbnB1dCIsImhhc0R1cGxpY2F0ZSIsImRvY3VtZW50RWxlbWVudCIsImRvY3VtZW50SXNIVE1MIiwicmJ1Z2d5UVNBIiwiZXhwYW5kbyIsImRpcnJ1bnMiLCJkb25lIiwiY2xhc3NDYWNoZSIsImNyZWF0ZUNhY2hlIiwidG9rZW5DYWNoZSIsImNvbXBpbGVyQ2FjaGUiLCJub25uYXRpdmVTZWxlY3RvckNhY2hlIiwic29ydE9yZGVyIiwiYm9vbGVhbnMiLCJpZGVudGlmaWVyIiwiYXR0cmlidXRlcyIsInBzZXVkb3MiLCJyd2hpdGVzcGFjZSIsInJjb21tYSIsInJsZWFkaW5nQ29tYmluYXRvciIsInJkZXNjZW5kIiwicnBzZXVkbyIsInJpZGVudGlmaWVyIiwibWF0Y2hFeHByIiwicmlucHV0cyIsInJoZWFkZXIiLCJycXVpY2tFeHByIiwicnNpYmxpbmciLCJydW5lc2NhcGUiLCJmdW5lc2NhcGUiLCJlc2NhcGUiLCJub25IZXgiLCJoaWdoIiwidW5sb2FkSGFuZGxlciIsInNldERvY3VtZW50IiwiaW5EaXNhYmxlZEZpZWxkc2V0IiwiYWRkQ29tYmluYXRvciIsInNhZmVBY3RpdmVFbGVtZW50IiwiZWxzIiwiZmluZCIsInNlZWQiLCJtIiwibmlkIiwibWF0Y2giLCJncm91cHMiLCJuZXdTZWxlY3RvciIsIm5ld0NvbnRleHQiLCJ0ZXN0Q29udGV4dCIsInRva2VuaXplIiwidG9TZWxlY3RvciIsInNlbGVjdCIsImtleXMiLCJjYWNoZSIsImtleSIsIm1hcmtGdW5jdGlvbiIsImZuIiwiYXNzZXJ0IiwiZWwiLCJjcmVhdGVJbnB1dFBzZXVkbyIsImNyZWF0ZUJ1dHRvblBzZXVkbyIsImNyZWF0ZURpc2FibGVkUHNldWRvIiwiZGlzYWJsZWQiLCJjcmVhdGVQb3NpdGlvbmFsUHNldWRvIiwiYXJndW1lbnQiLCJtYXRjaEluZGV4ZXMiLCJzdWJXaW5kb3ciLCJpZCIsImF0dHJJZCIsInRhZyIsImNsYXNzTmFtZSIsImlucHV0IiwiY29tcGFyZSIsImV4cHIiLCJlbGVtZW50cyIsImR1cGxpY2F0ZXMiLCJleGNlc3MiLCJ1bnF1b3RlZCIsIm5vZGVOYW1lU2VsZWN0b3IiLCJleHBlY3RlZE5vZGVOYW1lIiwicGF0dGVybiIsIm9wZXJhdG9yIiwiY2hlY2siLCJyZXN1bHQiLCJ3aGF0IiwiX2FyZ3VtZW50IiwibGFzdCIsInNpbXBsZSIsImZvcndhcmQiLCJvZlR5cGUiLCJfY29udGV4dCIsInhtbCIsIm91dGVyQ2FjaGUiLCJub2RlSW5kZXgiLCJzdGFydCIsImRpciIsInBhcmVudCIsInVzZUNhY2hlIiwiZGlmZiIsInBzZXVkbyIsImFyZ3MiLCJpZHgiLCJtYXRjaGVkIiwibWF0Y2hlciIsImNvbXBpbGUiLCJ1bm1hdGNoZWQiLCJ0ZXh0IiwibGFuZyIsImVsZW1MYW5nIiwiaGFzaCIsImF0dHIiLCJfbWF0Y2hJbmRleGVzIiwic2V0RmlsdGVycyIsInBhcnNlT25seSIsInRva2VucyIsInNvRmFyIiwicHJlRmlsdGVycyIsImNhY2hlZCIsImNvbWJpbmF0b3IiLCJiYXNlIiwic2tpcCIsImNoZWNrTm9uRWxlbWVudHMiLCJkb25lTmFtZSIsIm9sZENhY2hlIiwibmV3Q2FjaGUiLCJlbGVtZW50TWF0Y2hlciIsIm1hdGNoZXJzIiwibXVsdGlwbGVDb250ZXh0cyIsImNvbnRleHRzIiwiY29uZGVuc2UiLCJtYXAiLCJmaWx0ZXIiLCJuZXdVbm1hdGNoZWQiLCJtYXBwZWQiLCJzZXRNYXRjaGVyIiwicHJlRmlsdGVyIiwicG9zdEZpbHRlciIsInBvc3RGaW5kZXIiLCJwb3N0U2VsZWN0b3IiLCJ0ZW1wIiwibWF0Y2hlck91dCIsInByZU1hcCIsInBvc3RNYXAiLCJwcmVleGlzdGluZyIsIm1hdGNoZXJJbiIsIm1hdGNoZXJGcm9tVG9rZW5zIiwiY2hlY2tDb250ZXh0IiwibGVhZGluZ1JlbGF0aXZlIiwiaW1wbGljaXRSZWxhdGl2ZSIsIm1hdGNoQ29udGV4dCIsIm1hdGNoQW55Q29udGV4dCIsIm1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyIsImVsZW1lbnRNYXRjaGVycyIsInNldE1hdGNoZXJzIiwiYnlTZXQiLCJieUVsZW1lbnQiLCJzdXBlck1hdGNoZXIiLCJvdXRlcm1vc3QiLCJtYXRjaGVkQ291bnQiLCJzZXRNYXRjaGVkIiwiY29udGV4dEJhY2t1cCIsImRpcnJ1bnNVbmlxdWUiLCJ0b2tlbiIsImNvbXBpbGVkIiwidW50aWwiLCJ0cnVuY2F0ZSIsInNpYmxpbmdzIiwibiIsInJuZWVkc0NvbnRleHQiLCJyc2luZ2xlVGFnIiwid2lubm93IiwicXVhbGlmaWVyIiwibm90Iiwic2VsZiIsInJvb3RqUXVlcnkiLCJpbml0Iiwicm9vdCIsInJwYXJlbnRzcHJldiIsImd1YXJhbnRlZWRVbmlxdWUiLCJ0YXJnZXRzIiwibCIsInNlbGVjdG9ycyIsImN1ciIsInNpYmxpbmciLCJybm90aHRtbHdoaXRlIiwiY3JlYXRlT3B0aW9ucyIsIm9iamVjdCIsIl8iLCJmbGFnIiwiZmlyaW5nIiwibWVtb3J5IiwiZmlyZWQiLCJsb2NrZWQiLCJsaXN0IiwicXVldWUiLCJmaXJpbmdJbmRleCIsImZpcmUiLCJhZGQiLCJpbmRleCIsIklkZW50aXR5IiwidiIsIlRocm93ZXIiLCJleCIsImFkb3B0VmFsdWUiLCJyZXNvbHZlIiwicmVqZWN0Iiwibm9WYWx1ZSIsIm1ldGhvZCIsImZ1bmMiLCJ0dXBsZXMiLCJzdGF0ZSIsInByb21pc2UiLCJkZWZlcnJlZCIsImZucyIsIm5ld0RlZmVyIiwidHVwbGUiLCJyZXR1cm5lZCIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsIm9uUHJvZ3Jlc3MiLCJtYXhEZXB0aCIsImRlcHRoIiwiaGFuZGxlciIsInNwZWNpYWwiLCJ0aGF0IiwibWlnaHRUaHJvdyIsInRoZW4iLCJwcm9jZXNzIiwiZSIsInN0YXRlU3RyaW5nIiwic2luZ2xlVmFsdWUiLCJyZW1haW5pbmciLCJyZXNvbHZlQ29udGV4dHMiLCJyZXNvbHZlVmFsdWVzIiwicHJpbWFyeSIsInVwZGF0ZUZ1bmMiLCJyZXJyb3JOYW1lcyIsImVycm9yIiwiYXN5bmNFcnJvciIsInJlYWR5TGlzdCIsIndhaXQiLCJjb21wbGV0ZWQiLCJhY2Nlc3MiLCJjaGFpbmFibGUiLCJlbXB0eUdldCIsInJhdyIsImJ1bGsiLCJfa2V5Iiwicm1zUHJlZml4IiwicmRhc2hBbHBoYSIsImZjYW1lbENhc2UiLCJfYWxsIiwibGV0dGVyIiwiY2FtZWxDYXNlIiwic3RyaW5nIiwiYWNjZXB0RGF0YSIsIm93bmVyIiwiRGF0YSIsImRhdGEiLCJwcm9wIiwiZGF0YVByaXYiLCJkYXRhVXNlciIsInJicmFjZSIsInJtdWx0aURhc2giLCJnZXREYXRhIiwiZGF0YUF0dHIiLCJhdHRycyIsInN0YXJ0TGVuZ3RoIiwiaG9va3MiLCJuZXh0Iiwic2V0dGVyIiwidG1wIiwiY291bnQiLCJkZWZlciIsInBudW0iLCJyY3NzTnVtIiwiY3NzRXhwYW5kIiwiaXNBdHRhY2hlZCIsImNvbXBvc2VkIiwiaXNIaWRkZW5XaXRoaW5UcmVlIiwiYWRqdXN0Q1NTIiwidmFsdWVQYXJ0cyIsInR3ZWVuIiwiYWRqdXN0ZWQiLCJzY2FsZSIsIm1heEl0ZXJhdGlvbnMiLCJjdXJyZW50VmFsdWUiLCJpbml0aWFsIiwidW5pdCIsImluaXRpYWxJblVuaXQiLCJkZWZhdWx0RGlzcGxheU1hcCIsImdldERlZmF1bHREaXNwbGF5IiwiZGlzcGxheSIsInNob3dIaWRlIiwic2hvdyIsInZhbHVlcyIsInJjaGVja2FibGVUeXBlIiwicnRhZ05hbWUiLCJyc2NyaXB0VHlwZSIsImZyYWdtZW50IiwiZGl2Iiwid3JhcE1hcCIsImdldEFsbCIsInNldEdsb2JhbEV2YWwiLCJyZWZFbGVtZW50cyIsInJodG1sIiwiYnVpbGRGcmFnbWVudCIsInNjcmlwdHMiLCJzZWxlY3Rpb24iLCJpZ25vcmVkIiwid3JhcCIsImF0dGFjaGVkIiwibm9kZXMiLCJydHlwZW5hbWVzcGFjZSIsInJldHVyblRydWUiLCJyZXR1cm5GYWxzZSIsIm9uIiwidHlwZXMiLCJvbmUiLCJvcmlnRm4iLCJldmVudCIsImhhbmRsZU9iakluIiwiZXZlbnRIYW5kbGUiLCJldmVudHMiLCJ0IiwiaGFuZGxlT2JqIiwiaGFuZGxlcnMiLCJuYW1lc3BhY2VzIiwib3JpZ1R5cGUiLCJlbGVtRGF0YSIsIm1hcHBlZFR5cGVzIiwib3JpZ0NvdW50IiwibmF0aXZlRXZlbnQiLCJoYW5kbGVyUXVldWUiLCJtYXRjaGVkSGFuZGxlcnMiLCJtYXRjaGVkU2VsZWN0b3JzIiwiZGVsZWdhdGVDb3VudCIsImhvb2siLCJvcmlnaW5hbEV2ZW50IiwibGV2ZXJhZ2VOYXRpdmUiLCJpc1NldHVwIiwic2F2ZWQiLCJoYW5kbGUiLCJwcm9wcyIsImRlbGVnYXRlVHlwZSIsImZvY3VzTWFwcGVkSGFuZGxlciIsImF0dGFjaGVzIiwiZGF0YUhvbGRlciIsIm9yaWciLCJmaXgiLCJyZWxhdGVkIiwicm5vSW5uZXJodG1sIiwicmNoZWNrZWQiLCJyY2xlYW5TY3JpcHQiLCJtYW5pcHVsYXRpb25UYXJnZXQiLCJjb250ZW50IiwiZGlzYWJsZVNjcmlwdCIsInJlc3RvcmVTY3JpcHQiLCJjbG9uZUNvcHlFdmVudCIsImRlc3QiLCJwZGF0YU9sZCIsInVkYXRhT2xkIiwidWRhdGFDdXIiLCJmaXhJbnB1dCIsImRvbU1hbmlwIiwiY29sbGVjdGlvbiIsImhhc1NjcmlwdHMiLCJpTm9DbG9uZSIsInZhbHVlSXNGdW5jdGlvbiIsInJlbW92ZSIsImtlZXBEYXRhIiwiaHRtbCIsImRhdGFBbmRFdmVudHMiLCJkZWVwRGF0YUFuZEV2ZW50cyIsInNyY0VsZW1lbnRzIiwiZGVzdEVsZW1lbnRzIiwiaW5QYWdlIiwib3JpZ2luYWwiLCJpbnNlcnQiLCJybnVtbm9ucHgiLCJyY3VzdG9tUHJvcCIsImdldFN0eWxlcyIsInZpZXciLCJzd2FwIiwib2xkIiwicmJveFN0eWxlIiwiY29tcHV0ZVN0eWxlVGVzdHMiLCJjb250YWluZXIiLCJkaXZTdHlsZSIsInBpeGVsUG9zaXRpb25WYWwiLCJyZWxpYWJsZU1hcmdpbkxlZnRWYWwiLCJyb3VuZFBpeGVsTWVhc3VyZXMiLCJwaXhlbEJveFN0eWxlc1ZhbCIsImJveFNpemluZ1JlbGlhYmxlVmFsIiwic2Nyb2xsYm94U2l6ZVZhbCIsIm1lYXN1cmUiLCJyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCIsInRhYmxlIiwidHIiLCJ0ckNoaWxkIiwidHJTdHlsZSIsImN1ckNTUyIsImNvbXB1dGVkIiwid2lkdGgiLCJtaW5XaWR0aCIsIm1heFdpZHRoIiwiaXNDdXN0b21Qcm9wIiwic3R5bGUiLCJhZGRHZXRIb29rSWYiLCJjb25kaXRpb25GbiIsImhvb2tGbiIsImNzc1ByZWZpeGVzIiwiZW1wdHlTdHlsZSIsInZlbmRvclByb3BzIiwidmVuZG9yUHJvcE5hbWUiLCJjYXBOYW1lIiwiZmluYWxQcm9wTmFtZSIsImZpbmFsIiwicmRpc3BsYXlzd2FwIiwiY3NzU2hvdyIsImNzc05vcm1hbFRyYW5zZm9ybSIsInNldFBvc2l0aXZlTnVtYmVyIiwic3VidHJhY3QiLCJib3hNb2RlbEFkanVzdG1lbnQiLCJkaW1lbnNpb24iLCJib3giLCJpc0JvcmRlckJveCIsInN0eWxlcyIsImNvbXB1dGVkVmFsIiwiZXh0cmEiLCJkZWx0YSIsIm1hcmdpbkRlbHRhIiwiZ2V0V2lkdGhPckhlaWdodCIsImJveFNpemluZ05lZWRlZCIsInZhbHVlSXNCb3JkZXJCb3giLCJvZmZzZXRQcm9wIiwib3JpZ05hbWUiLCJzY3JvbGxib3hTaXplQnVnZ3kiLCJwcmVmaXgiLCJzdWZmaXgiLCJleHBhbmRlZCIsInBhcnRzIiwiVHdlZW4iLCJlbmQiLCJlYXNpbmciLCJwZXJjZW50IiwiZWFzZWQiLCJwIiwiZnhOb3ciLCJpblByb2dyZXNzIiwicmZ4dHlwZXMiLCJycnVuIiwic2NoZWR1bGUiLCJjcmVhdGVGeE5vdyIsImdlbkZ4IiwiaW5jbHVkZVdpZHRoIiwid2hpY2giLCJjcmVhdGVUd2VlbiIsImFuaW1hdGlvbiIsIkFuaW1hdGlvbiIsImRlZmF1bHRQcmVmaWx0ZXIiLCJvcHRzIiwidG9nZ2xlIiwib2xkZmlyZSIsInByb3BUd2VlbiIsInJlc3RvcmVEaXNwbGF5IiwiaXNCb3giLCJhbmltIiwiaGlkZGVuIiwiZGF0YVNob3ciLCJwcm9wRmlsdGVyIiwic3BlY2lhbEVhc2luZyIsInByb3BlcnRpZXMiLCJzdG9wcGVkIiwidGljayIsImN1cnJlbnRUaW1lIiwiZ290b0VuZCIsInByZXBlbmQiLCJzcGVlZCIsIm9wdCIsInRvIiwiZW1wdHkiLCJvcHRhbGwiLCJkb0FuaW1hdGlvbiIsImNsZWFyUXVldWUiLCJzdG9wUXVldWUiLCJzdG9wIiwiZGVxdWV1ZSIsInRpbWVycyIsImNzc0ZuIiwidGltZXIiLCJ0aW1lIiwidGltZW91dCIsImJvb2xIb29rIiwiYXR0ckhhbmRsZSIsIm5UeXBlIiwiYXR0ck5hbWVzIiwiZ2V0dGVyIiwiaXNYTUwiLCJsb3dlcmNhc2VOYW1lIiwicmZvY3VzYWJsZSIsInJjbGlja2FibGUiLCJ0YWJpbmRleCIsInN0cmlwQW5kQ29sbGFwc2UiLCJnZXRDbGFzcyIsImNsYXNzZXNUb0FycmF5IiwiY2xhc3NOYW1lcyIsImN1clZhbHVlIiwiZmluYWxWYWx1ZSIsInN0YXRlVmFsIiwiaXNWYWxpZFZhbHVlIiwicnJldHVybiIsIm9wdGlvbiIsIm1heCIsIm9wdGlvblNldCIsImxvY2F0aW9uIiwibm9uY2UiLCJycXVlcnkiLCJwYXJzZXJFcnJvckVsZW0iLCJyZm9jdXNNb3JwaCIsInN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrIiwib25seUhhbmRsZXJzIiwiYnViYmxlVHlwZSIsIm9udHlwZSIsImxhc3RFbGVtZW50IiwiZXZlbnRQYXRoIiwicmJyYWNrZXQiLCJyQ1JMRiIsInJzdWJtaXR0ZXJUeXBlcyIsInJzdWJtaXR0YWJsZSIsImJ1aWxkUGFyYW1zIiwidHJhZGl0aW9uYWwiLCJzIiwidmFsdWVPckZ1bmN0aW9uIiwicjIwIiwicmhhc2giLCJyYW50aUNhY2hlIiwicmhlYWRlcnMiLCJybG9jYWxQcm90b2NvbCIsInJub0NvbnRlbnQiLCJycHJvdG9jb2wiLCJwcmVmaWx0ZXJzIiwidHJhbnNwb3J0cyIsImFsbFR5cGVzIiwib3JpZ2luQW5jaG9yIiwiYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzIiwic3RydWN0dXJlIiwiZGF0YVR5cGVFeHByZXNzaW9uIiwiZGF0YVR5cGUiLCJkYXRhVHlwZXMiLCJpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyIsIm9yaWdpbmFsT3B0aW9ucyIsImpxWEhSIiwiaW5zcGVjdGVkIiwic2Vla2luZ1RyYW5zcG9ydCIsImluc3BlY3QiLCJzZWxlY3RlZCIsInByZWZpbHRlck9yRmFjdG9yeSIsImRhdGFUeXBlT3JUcmFuc3BvcnQiLCJhamF4RXh0ZW5kIiwiZmxhdE9wdGlvbnMiLCJhamF4SGFuZGxlUmVzcG9uc2VzIiwicmVzcG9uc2VzIiwiY3QiLCJmaW5hbERhdGFUeXBlIiwiZmlyc3REYXRhVHlwZSIsImNvbnRlbnRzIiwiYWpheENvbnZlcnQiLCJyZXNwb25zZSIsImlzU3VjY2VzcyIsImNvbnYyIiwiY3VycmVudCIsImNvbnYiLCJwcmV2IiwiY29udmVydGVycyIsInNldHRpbmdzIiwidXJsIiwidHJhbnNwb3J0IiwiY2FjaGVVUkwiLCJyZXNwb25zZUhlYWRlcnNTdHJpbmciLCJyZXNwb25zZUhlYWRlcnMiLCJ0aW1lb3V0VGltZXIiLCJ1cmxBbmNob3IiLCJmaXJlR2xvYmFscyIsInVuY2FjaGVkIiwiY2FsbGJhY2tDb250ZXh0IiwiZ2xvYmFsRXZlbnRDb250ZXh0IiwiY29tcGxldGVEZWZlcnJlZCIsInN0YXR1c0NvZGUiLCJyZXF1ZXN0SGVhZGVycyIsInJlcXVlc3RIZWFkZXJzTmFtZXMiLCJzdHJBYm9ydCIsInN0YXR1c1RleHQiLCJmaW5hbFRleHQiLCJzdGF0dXMiLCJuYXRpdmVTdGF0dXNUZXh0IiwiaGVhZGVycyIsInN1Y2Nlc3MiLCJtb2RpZmllZCIsImh0bWxJc0Z1bmN0aW9uIiwieGhyU3VjY2Vzc1N0YXR1cyIsInhoclN1cHBvcnRlZCIsImVycm9yQ2FsbGJhY2siLCJjb21wbGV0ZSIsInhociIsImV2dCIsIm9sZENhbGxiYWNrcyIsInJqc29ucCIsIm9yaWdpbmFsU2V0dGluZ3MiLCJjYWxsYmFja05hbWUiLCJvdmVyd3JpdHRlbiIsInJlc3BvbnNlQ29udGFpbmVyIiwianNvblByb3AiLCJib2R5Iiwia2VlcFNjcmlwdHMiLCJwYXJzZWQiLCJwYXJhbXMiLCJvZmYiLCJyZXNwb25zZVRleHQiLCJjdXJQb3NpdGlvbiIsImN1ckxlZnQiLCJjdXJDU1NUb3AiLCJjdXJUb3AiLCJjdXJPZmZzZXQiLCJjdXJDU1NMZWZ0IiwiY2FsY3VsYXRlUG9zaXRpb24iLCJwb3NpdGlvbiIsImN1ckVsZW0iLCJyZWN0Iiwid2luIiwib2Zmc2V0UGFyZW50Iiwib2Zmc2V0IiwicGFyZW50T2Zmc2V0IiwidG9wIiwiZGVmYXVsdEV4dHJhIiwiZnVuY05hbWUiLCJtYXJnaW4iLCJmbk92ZXIiLCJmbk91dCIsInJ0cmltIiwicHJveHkiLCJob2xkIiwiX2pRdWVyeSIsIl8kIiwiX19wdWJsaWNGaWVsZCIsImFjdGlvbk5vZGUiLCJyZWNvcmQiLCJmb3JtYXQiLCJpbnRlZ2VyUGFydCIsImZyYWN0aW9uUGFydCIsImlzTmVnYXRpdmUiLCJpc1BlcmNlbnQiLCJpbnRlZ2VyRm9ybWF0IiwiZnJhY3Rpb25Gb3JtYXQiLCJkYXRlIiwieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsIm1pbGxpc2Vjb25kIiwidGltZVpvbmVPZmZzZXQiLCJyZXBsYWNlbWVudHMiLCJkb2NOdW0iLCJ0ZW1wbGF0ZSIsInJlZ2V4Iiwibm93IiwibnVtYmVyIiwibm8iLCJyZWNObyIsImFwcHVybCIsInJlc3AiLCJsb2dpY09wIiwianNvbiIsImNoaWxkSnNvbiIsImZvdW5kTm9kZSIsIm1heEluZGV4IiwiY2hpbGQiLCJjaGlsZE1heCIsImNvbmRpdGlvblN0cmluZyIsImdyb3VwTm9kZSIsImNoaWxkQ29uZGl0aW9uU3RyaW5nIiwiY29uZE5vZGUiLCJjb25kaU5vZGVzIiwianNvblN0cmluZyIsInZhcnMiLCJwYXRoIiwibyIsImsiLCJmaWVsZFZhbHVlIiwidmFyVmFsdWUiLCJjb25kaXRpb24iLCJ0YXJnZXRPYmplY3QiLCJjb25kaXRpb25PYmplY3QiLCJpc0FycmF5VGFyZ2V0IiwiaXNBcnJheVZhbHVlIiwidGFyZ2V0VmFsdWUiLCJjb25kaXRpb25WYWx1ZSIsImRhdGVWYWx1ZSIsIm51bWJlclZhbHVlIiwic29ydEFycmF5IiwidGFyZ2V0QXJyYXkiLCJ2YWx1ZUFycmF5IiwidHJlZSIsImNvbmRpdGlvblJlc3VsdCIsImJ1dHRvblNwYWNlIiwiYnV0dG9uIiwiY2xpY2tFdmVudE5hbWUiLCJleHBvcnRzIiwiaW5qZWN0UGxhdGZvcm1EZXBzIiwiZGVwcyIsIl9fZXh0ZW5kcyIsImV4dGVuZFN0YXRpY3MiLCJkIiwiX18iLCJVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMSIsIl9zdXBlciIsIlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvciIsInBsYXRmb3JtIiwiX3RoaXMiLCJtZXNzYWdlIiwiTWltZSIsInR5cGVNYXAiLCJmb3JjZSIsImV4dGVuc2lvbnMiLCJleHQiLCJoYXNQYXRoIiwicmVxdWlyZSQkMCIsInJlcXVpcmUkJDEiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsImZ1bGZpbGxlZCIsInN0ZXAiLCJyZWplY3RlZCIsIl9fZ2VuZXJhdG9yIiwiZiIsInkiLCJnIiwidmVyYiIsIm9wIiwiX19pbXBvcnREZWZhdWx0IiwibW9kIiwiYnJvd3NlciIsImZpbGVQYXRoIiwiX2EiLCJfYiIsIl9jIiwiZmlsZU5hbWUiLCJiYXNlVXJsIiwiaG9zdCIsInByb3RvY29sIiwiZW5kcG9pbnROYW1lIiwiZ3Vlc3RTcGFjZUlkIiwicHJldmlldyIsImd1ZXN0UGF0aCIsInByZXZpZXdQYXRoIiwiX19hc3NpZ24iLCJCYXNlQ2xpZW50XzEiLCJCYXNlQ2xpZW50IiwiY2xpZW50IiwiX19yZXN0IiwiQnVsa1JlcXVlc3RDbGllbnRfMSIsIkJ1bGtSZXF1ZXN0Q2xpZW50IiwicmVxdWVzdHNQYXJhbSIsInJlcXVlc3RzIiwicmVxdWVzdCIsInJlc3QiLCJBcHBDbGllbnRfMSIsIkFwcENsaWVudCIsInNwYWNlIiwic3BhY2VQYXRoIiwiZGVmYXVsdFRocmVhZCIsIktpbnRvbmVBYm9ydFNlYXJjaEVycm9yXzEiLCJLaW50b25lQWJvcnRTZWFyY2hFcnJvciIsIktpbnRvbmVBbGxSZWNvcmRzRXJyb3JfMSIsIktpbnRvbmVBbGxSZWNvcmRzRXJyb3IiLCJwcm9jZXNzZWRSZWNvcmRzUmVzdWx0IiwidW5wcm9jZXNzZWRSZWNvcmRzIiwibnVtT2ZBbGxSZWNvcmRzIiwiY2h1bmtMZW5ndGgiLCJudW1PZlByb2Nlc3NlZFJlY29yZHMiLCJlcnJvckluZGV4IiwiZXJyb3JzIiwiZXJyb3JJbmRleGVzIiwiZXJyb3JLZXkiLCJlcnJvclBhcnNlUmVzdWx0IiwiS2ludG9uZVJlc3RBUElFcnJvcl8xIiwiS2ludG9uZVJlc3RBUElFcnJvciIsImJ1bGtSZXF1ZXN0SW5kZXgiLCJfX2NyZWF0ZUJpbmRpbmciLCJrMiIsImRlc2MiLCJfX2V4cG9ydFN0YXIiLCJyZXF1aXJlJCQyIiwiZnJvbSIsInBhY2siLCJhciIsIlJlY29yZENsaWVudF8xIiwiZXJyb3JfMSIsIlJlY29yZENsaWVudCIsImJ1bGtSZXF1ZXN0Q2xpZW50IiwiYXBwIiwidXBkYXRlS2V5IiwicmVjb3JkcyIsInJldmlzaW9uIiwicXVlcnkiLCJyZWdleHAiLCJpZHMiLCJyZXZpc2lvbnMiLCJvcmRlckJ5Iiwid2l0aEN1cnNvciIsImNvbmRpdGlvblF1ZXJ5Iiwib3JpZ2luYWxGaWVsZHMiLCJmaWVsZHMiLCJhbGxSZWNvcmRzIiwibGFzdElkIiwibGFzdFJlY29yZCIsImVycm9yXzIiLCJDSFVOS19MRU5HVEgiLCJyZWNvcmRzQ2h1bmsiLCJuZXdSZXN1bHRzIiwiZV8xIiwic2VwYXJhdGVkUmVjb3JkcyIsImFjYyIsImVfMiIsImVfMyIsInNpemUiLCJzZXBhcmF0ZWQiLCJjaHVuayIsIlNwYWNlQ2xpZW50XzEiLCJTcGFjZUNsaWVudCIsIkZpbGVDbGllbnRfMSIsImZvcm1fZGF0YV8xIiwicGxhdGZvcm1fMSIsInJlcXVpcmUkJDMiLCJGaWxlQ2xpZW50IiwiZm9ybURhdGEiLCJuYW1lXzEiLCJuYW1lXzIiLCJmaWxlRGF0YSIsIlBsdWdpbkNsaWVudF8xIiwiUGx1Z2luQ2xpZW50IiwiYmluZCIsInRoaW5nIiwic3RyIiwiaXNBcnJheSIsImlzQnVmZmVyIiwiaXNTdHJpbmciLCJpc051bWJlciIsImlzQm9vbGVhbiIsInByb3RvdHlwZSIsImlzRGF0ZSIsImtpbmQiLCJhbGxPd25LZXlzIiwibWVyZ2UiLCJjYXNlbGVzcyIsImFzc2lnblZhbHVlIiwidGFyZ2V0S2V5IiwiY29uc3RydWN0b3IiLCJzdXBlckNvbnN0cnVjdG9yIiwiZGVzY3JpcHRvcnMiLCJzb3VyY2VPYmoiLCJkZXN0T2JqIiwibWVyZ2VkIiwic2VhcmNoU3RyaW5nIiwibGFzdEluZGV4IiwiVHlwZWRBcnJheSIsIml0ZXJhdG9yIiwicGFpciIsInJlZ0V4cCIsInAxIiwicDIiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUmVnRXhwIiwicmVkdWNlciIsInJlZHVjZWREZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJhcnJheU9yU3RyaW5nIiwiZGVsaW1pdGVyIiwiZGVmaW5lIiwibm9vcCIsImRlZmF1bHRWYWx1ZSIsImFscGhhYmV0Iiwic3RhY2siLCJ2aXNpdCIsInNvdXJjZSIsInJlZHVjZWRWYWx1ZSIsInNldEltbWVkaWF0ZVN1cHBvcnRlZCIsInBvc3RNZXNzYWdlU3VwcG9ydGVkIiwiY2FsbGJhY2tzIiwiY2IiLCJ1dGlscyQxIiwiY29uZmlnIiwidG9KU09OIiwiY3VzdG9tUHJvcHMiLCJheGlvc0Vycm9yIiwiZG90cyIsIm1ldGFUb2tlbnMiLCJ2aXNpdG9yIiwiZGVmYXVsdFZpc2l0b3IiLCJpbmRleGVzIiwidXNlQmxvYiIsImNvbnZlcnRWYWx1ZSIsImV4cG9zZWRIZWxwZXJzIiwiYnVpbGQiLCJjaGFyTWFwIiwiYXBwZW5kIiwiZW5jb2RlciIsIl9lbmNvZGUiLCJlbmNvZGUiLCJzZXJpYWxpemVGbiIsInNlcmlhbGl6ZWRQYXJhbXMiLCJoYXNobWFya0luZGV4IiwiaCIsInV0aWxzIiwiaGVscGVycyIsImFycmF5VG9PYmplY3QiLCJidWlsZFBhdGgiLCJpc051bWVyaWNLZXkiLCJpc0xhc3QiLCJyYXdWYWx1ZSIsInBhcnNlciIsImRlZmF1bHRzIiwidHJhbnNmb3JtUmVxdWVzdCIsImNvbnRlbnRUeXBlIiwiaGFzSlNPTkNvbnRlbnRUeXBlIiwiaXNPYmplY3RQYXlsb2FkIiwiaXNGaWxlTGlzdCIsIl9Gb3JtRGF0YSIsInRyYW5zZm9ybVJlc3BvbnNlIiwidHJhbnNpdGlvbmFsIiwiZm9yY2VkSlNPTlBhcnNpbmciLCJKU09OUmVxdWVzdGVkIiwic3RyaWN0SlNPTlBhcnNpbmciLCJ2YWxpZGF0ZVN0YXR1cyIsImRlZmF1bHRzJDEiLCJyYXdIZWFkZXJzIiwibGluZSIsImhlYWRlciIsInRva2Vuc1JFIiwiaXNIZWFkZXJOYW1lRmlsdGVyIiwiY2hhciIsImFjY2Vzc29yTmFtZSIsIm1ldGhvZE5hbWUiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJ2YWx1ZU9yUmV3cml0ZSIsInJld3JpdGUiLCJzZXRIZWFkZXIiLCJfdmFsdWUiLCJfaGVhZGVyIiwiX3Jld3JpdGUiLCJsSGVhZGVyIiwic2V0SGVhZGVycyIsImRlbGV0ZWQiLCJkZWxldGVIZWFkZXIiLCJub3JtYWxpemVkIiwiYXNTdHJpbmdzIiwiYWNjZXNzb3JzIiwiZGVmaW5lQWNjZXNzb3IiLCJoZWFkZXJWYWx1ZSIsInNhbXBsZXNDb3VudCIsIm1pbiIsImJ5dGVzIiwidGltZXN0YW1wcyIsImhlYWQiLCJ0YWlsIiwiZmlyc3RTYW1wbGVUUyIsInN0YXJ0ZWRBdCIsImJ5dGVzQ291bnQiLCJwYXNzZWQiLCJmcmVxIiwidGltZXN0YW1wIiwidGhyZXNob2xkIiwibGFzdEFyZ3MiLCJpbnZva2UiLCJsaXN0ZW5lciIsImlzRG93bmxvYWRTdHJlYW0iLCJieXRlc05vdGlmaWVkIiwiX3NwZWVkb21ldGVyIiwibG9hZGVkIiwidG90YWwiLCJwcm9ncmVzc0J5dGVzIiwicmF0ZSIsImluUmFuZ2UiLCJ0aHJvdHRsZWQiLCJsZW5ndGhDb21wdXRhYmxlIiwic3RhbmRhcmRCcm93c2VyRW52IiwibXNpZSIsInVybFBhcnNpbmdOb2RlIiwib3JpZ2luVVJMIiwicmVzb2x2ZVVSTCIsImhyZWYiLCJyZXF1ZXN0VVJMIiwibm9uU3RhbmRhcmRCcm93c2VyRW52IiwiZXhwaXJlcyIsImRvbWFpbiIsInNlY3VyZSIsImNvb2tpZSIsImJhc2VVUkwiLCJyZWxhdGl2ZVVSTCIsInJlcXVlc3RlZFVSTCIsImNvbmZpZzEiLCJjb25maWcyIiwiZ2V0TWVyZ2VkVmFsdWUiLCJtZXJnZURlZXBQcm9wZXJ0aWVzIiwidmFsdWVGcm9tQ29uZmlnMiIsImRlZmF1bHRUb0NvbmZpZzIiLCJtZXJnZURpcmVjdEtleXMiLCJtZXJnZU1hcCIsImNvbmZpZ1ZhbHVlIiwibmV3Q29uZmlnIiwid2l0aFhTUkZUb2tlbiIsInhzcmZIZWFkZXJOYW1lIiwieHNyZkNvb2tpZU5hbWUiLCJhdXRoIiwieHNyZlZhbHVlIiwiX2NvbmZpZyIsInJlcXVlc3REYXRhIiwicmVzcG9uc2VUeXBlIiwib25VcGxvYWRQcm9ncmVzcyIsIm9uRG93bmxvYWRQcm9ncmVzcyIsIm9uQ2FuY2VsZWQiLCJ1cGxvYWRUaHJvdHRsZWQiLCJkb3dubG9hZFRocm90dGxlZCIsImZsdXNoVXBsb2FkIiwiZmx1c2hEb3dubG9hZCIsIm9ubG9hZGVuZCIsImVyciIsInRpbWVvdXRFcnJvck1lc3NhZ2UiLCJjYW5jZWwiLCJzaWduYWxzIiwiY29udHJvbGxlciIsImFib3J0ZWQiLCJvbmFib3J0IiwicmVhc29uIiwidW5zdWJzY3JpYmUiLCJzaWduYWwiLCJjaHVua1NpemUiLCJwb3MiLCJpdGVyYWJsZSIsInN0cmVhbSIsInJlYWRlciIsIm9uRmluaXNoIiwiX29uRmluaXNoIiwibG9hZGVkQnl0ZXMiLCJ0ZXN0IiwiZHVwbGV4QWNjZXNzZWQiLCJoYXNDb250ZW50VHlwZSIsInJlcyIsImNhbmNlbFRva2VuIiwid2l0aENyZWRlbnRpYWxzIiwiZmV0Y2hPcHRpb25zIiwiY29tcG9zZWRTaWduYWwiLCJyZXF1ZXN0Q29udGVudExlbmd0aCIsIl9yZXF1ZXN0IiwiY29udGVudFR5cGVIZWFkZXIiLCJmbHVzaCIsImlzQ3JlZGVudGlhbHNTdXBwb3J0ZWQiLCJpc1N0cmVhbVJlc3BvbnNlIiwicmVzcG9uc2VDb250ZW50TGVuZ3RoIiwicmVzcG9uc2VEYXRhIiwiYWRhcHRlciIsImFkYXB0ZXJzIiwibmFtZU9yQWRhcHRlciIsInJlamVjdGVkUmVhc29ucyIsInJlYXNvbnMiLCJWRVJTSU9OIiwidmFsaWRhdG9yIiwiZm9ybWF0TWVzc2FnZSIsInNjaGVtYSIsImFsbG93VW5rbm93biIsImluc3RhbmNlQ29uZmlnIiwiY29uZmlnT3JVcmwiLCJkdW1teSIsInBhcmFtc1NlcmlhbGl6ZXIiLCJjb250ZXh0SGVhZGVycyIsInJlcXVlc3RJbnRlcmNlcHRvckNoYWluIiwic3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3IiLCJyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4iLCJjaGFpbiIsImZ1bGxQYXRoIiwiZm9yRWFjaE1ldGhvZE5vRGF0YSIsImZvckVhY2hNZXRob2RXaXRoRGF0YSIsImdlbmVyYXRlSFRUUE1ldGhvZCIsImlzRm9ybSIsImV4ZWN1dG9yIiwicmVzb2x2ZVByb21pc2UiLCJvbmZ1bGZpbGxlZCIsIl9yZXNvbHZlIiwiYWJvcnQiLCJjIiwicGF5bG9hZCIsImRlZmF1bHRDb25maWciLCJpbnN0YW5jZSIsImFsbCIsInByb21pc2VzIiwiYXhpb3NfMSIsIkF4aW9zQ2xpZW50XzEiLCJBeGlvc0NsaWVudCIsInJlc3BvbnNlSGFuZGxlciIsInJlcXVlc3RDb25maWdCdWlsZGVyIiwicmVxdWVzdENvbmZpZyIsImhhc1N5bWJvbHMiLCJzeW0iLCJzeW1PYmoiLCJzeW1WYWwiLCJzeW1zIiwiaGFzTmF0aXZlU3ltYm9scyIsImhhc1Byb3RvIiwidG9TdHIiLCJjb25jYXR0eSIsInNsaWN5IiwiYXJyTGlrZSIsImpvaW5lciIsImltcGxlbWVudGF0aW9uIiwiYm91bmQiLCJiaW5kZXIiLCJib3VuZExlbmd0aCIsImJvdW5kQXJncyIsIkVtcHR5IiwidW5kZWZpbmVkIiwiJFN5bnRheEVycm9yIiwicmVxdWlyZSQkNCIsIiRUeXBlRXJyb3IiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsImV4cHJlc3Npb25TeW50YXgiLCIkZ09QRCIsInJlcXVpcmUkJDciLCJyZXF1aXJlJCQ4IiwieCIsImRvRXZhbCIsImdlbiIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsIiRjb25jYXQiLCIkcmVwbGFjZSIsInN0cmluZ1RvUGF0aCIsInF1b3RlIiwic3ViU3RyaW5nIiwiZ2V0QmFzZUludHJpbnNpYyIsImFsbG93TWlzc2luZyIsImludHJpbnNpY05hbWUiLCJhbGlhcyIsIkdldEludHJpbnNpYyIsImludHJpbnNpY0Jhc2VOYW1lIiwiaW50cmluc2ljIiwiaW50cmluc2ljUmVhbE5hbWUiLCJza2lwRnVydGhlckNhY2hpbmciLCJpc093biIsInBhcnQiLCIkZGVmaW5lUHJvcGVydHkiLCJnb3BkIiwiZGVmaW5lRGF0YVByb3BlcnR5IiwicHJvcGVydHkiLCJub25FbnVtZXJhYmxlIiwibm9uV3JpdGFibGUiLCJub25Db25maWd1cmFibGUiLCJsb29zZSIsImhhc1Byb3BlcnR5RGVzY3JpcHRvcnMiLCJoYXNBcnJheUxlbmd0aERlZmluZUJ1ZyIsIiRmbG9vciIsInNldEZ1bmN0aW9uTGVuZ3RoIiwiZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZSIsImZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSIsIiRhcHBseSIsIiRjYWxsIiwiJHJlZmxlY3RBcHBseSIsIiRtYXgiLCJvcmlnaW5hbEZ1bmN0aW9uIiwiYXBwbHlCaW5kIiwiY2FsbEJvdW5kIiwiY2FsbEJvdW5kSW50cmluc2ljIiwiTyIsInNlcFJlZ2V4IiwiaW50IiwiaW50U3RyIiwiZGVjIiwiaW5zcGVjdF8iLCJzZWVuIiwiaGFzIiwiY3VzdG9tSW5zcGVjdCIsIm51bWVyaWNTZXBhcmF0b3IiLCJiaWdJbnRTdHIiLCJpbmRlbnQiLCJub0luZGVudCIsIm5ld09wdHMiLCJzeW1TdHJpbmciLCJpc0VsZW1lbnQiLCJ4cyIsIm1hcFBhcnRzIiwic2V0UGFydHMiLCJ5cyIsImlzUGxhaW5PYmplY3QiLCJwcm90b1RhZyIsInN0cmluZ1RhZyIsImNvbnN0cnVjdG9yVGFnIiwiZGVmYXVsdFN0eWxlIiwicXVvdGVDaGFyIiwidHJhaWxlciIsImVudHJpZXMiLCJqb2luZWRFbnRyaWVzIiwiYmFzZUluZGVudCIsImxpbmVKb2luZXIiLCJpc0FyciIsInN5bU1hcCIsImN1cnIiLCJvYmplY3RzIiwiZ2V0U2lkZUNoYW5uZWwiLCIkd20iLCIkbSIsIiRvIiwiY2hhbm5lbCIsImZvcm1hdHMiLCJjb21wYWN0UXVldWUiLCJpdGVtIiwiY29tcGFjdGVkIiwibWVyZ2VUYXJnZXQiLCJ0YXJnZXRJdGVtIiwiYXNzaWduU2luZ2xlU291cmNlIiwiZGVjb2RlciIsImNoYXJzZXQiLCJzdHJXaXRob3V0UGx1cyIsImRlZmF1bHRFbmNvZGVyIiwiJDAiLCJvdXQiLCJzZWdtZW50IiwiY29tcGFjdCIsInJlZnMiLCJjb21iaW5lIiwibWF5YmVNYXAiLCJicmFja2V0cyIsImluZGljZXMiLCJyZXBlYXQiLCJ2YWx1ZU9yQXJyYXkiLCJzZXJpYWxpemVEYXRlIiwiaXNOb25OdWxsaXNoUHJpbWl0aXZlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVBcnJheVByZWZpeCIsImNvbW1hUm91bmRUcmlwIiwiYWxsb3dFbXB0eUFycmF5cyIsInN0cmljdE51bGxIYW5kbGluZyIsInNraXBOdWxscyIsImVuY29kZURvdEluS2V5cyIsImFsbG93RG90cyIsImZvcm1hdHRlciIsImVuY29kZVZhbHVlc09ubHkiLCJzaWRlQ2hhbm5lbCIsInRtcFNjIiwiZmluZEZsYWciLCJrZXlWYWx1ZSIsIm9iaktleXMiLCJlbmNvZGVkUHJlZml4IiwiYWRqdXN0ZWRQcmVmaXgiLCJlbmNvZGVkS2V5Iiwia2V5UHJlZml4IiwidmFsdWVTaWRlQ2hhbm5lbCIsIm5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMiLCJhcnJheUZvcm1hdCIsImpvaW5lZCIsIm51bWJlclN0ciIsInBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMiLCJjbGVhblN0ciIsImxpbWl0Iiwic2tpcEluZGV4IiwiYnJhY2tldEVxdWFsc1BvcyIsImVuY29kZWRWYWwiLCJleGlzdGluZyIsInZhbHVlc1BhcnNlZCIsImxlYWYiLCJjbGVhblJvb3QiLCJkZWNvZGVkUm9vdCIsInBhcnNlUXVlcnlTdHJpbmdLZXlzIiwiZ2l2ZW5LZXkiLCJub3JtYWxpemVQYXJzZU9wdGlvbnMiLCJwYXJzZSIsInRlbXBPYmoiLCJuZXdPYmoiLCJfaGFzQnVmZmVyIiwiX1REIiwiX1RFIiwiYjY0Y2giLCJiNjRjaHMiLCJiNjR0YWIiLCJ0YWIiLCJiNjRyZSIsIl9mcm9tQ0MiLCJfVThBZnJvbSIsIml0IiwiX21rVXJpU2FmZSIsIm0wIiwiX3RpZHlCNjQiLCJidG9hUG9seWZpbGwiLCJiaW4iLCJ1MzIiLCJjMCIsImMxIiwiYzIiLCJhc2MiLCJwYWQiLCJfYnRvYSIsIl9mcm9tVWludDhBcnJheSIsInU4YSIsIm1heGFyZ3MiLCJzdHJzIiwiZnJvbVVpbnQ4QXJyYXkiLCJ1cmxzYWZlIiwiY2JfdXRvYiIsImNjIiwicmVfdXRvYiIsInV0b2IiLCJ1IiwiZW5jb2RlVVJJIiwicmVfYnRvdSIsImNiX2J0b3UiLCJjY2NjIiwiY3AiLCJidG91IiwiYXRvYlBvbHlmaWxsIiwidTI0IiwicjEiLCJyMiIsIl9hdG9iIiwiX3RvVWludDhBcnJheSIsInRvVWludDhBcnJheSIsIl91blVSSSIsIl9kZWNvZGUiLCJkZWNvZGUiLCJpc1ZhbGlkIiwiX25vRW51bSIsImV4dGVuZFN0cmluZyIsIl9hZGQiLCJleHRlbmRVaW50OEFycmF5IiwiZXh0ZW5kQnVpbHRpbnMiLCJnQmFzZTY0IiwiS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyXzEiLCJLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIiLCJyZXF1ZXN0VXJsIiwiX2QiLCJfZSIsIl9mIiwiX2ciLCJfaCIsIl9qIiwiX2siLCJwcm94eUNvbmZpZyIsInJlcXVlc3RUb2tlbiIsImJhc2ljQXV0aCIsInVzZXJBZ2VudCIsImJhc2ljQXV0aEhlYWRlcnMiLCJwbGF0Zm9ybURlcHNIZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsImFwaVRva2VuIiwiS2ludG9uZVJlc3BvbnNlSGFuZGxlcl8xIiwiS2ludG9uZVJlc3BvbnNlSGFuZGxlciIsImVuYWJsZUFib3J0U2VhcmNoRXJyb3IiLCJlcnJvclJlc3BvbnNlIiwiS2ludG9uZVJlc3RBUElDbGllbnRfMSIsIktpbnRvbmVSZXN0QVBJQ2xpZW50IiwiaHR0cENsaWVudCIsInNvY2tldFRpbWVvdXQiLCJfX3NldE1vZHVsZURlZmF1bHQiLCJfX2ltcG9ydFN0YXIiLCJicm93c2VyRGVwcyIsIkZpZWxkVHlwZSIsIkNhbGNGb3JtYXQiLCJmaWVsZCIsIm51bWJlckFycmF5IiwiY2FsY0ZpZWxkIiwidmFyTmFtZSIsImFwaSIsImVsZW1lbnQiLCJ2YXJWYWx1ZXMiLCJkYXRhcyIsImxvb2t1cEZpeGVkRmllbGRDb2RlcyIsImlzS2V5IiwicmZyb20iLCJtYXBwaW5nRGF0YSIsImFwcElkIiwibmVlZENyZWF0ZSIsInRhcmdldEZpZWxkIiwibWFwcGluZ1J1bGVzIiwidXBkYXRlUmVjb3JkcyIsInRhcmdldFJlY29yZCIsInVwZGF0ZVJlY29yZCIsIm1hcHBpbmciLCJxdWVyeVN0ciIsInZmcm9tIiwiZmlsdGVySGFuZGxlciIsImFjY3VtdWxhdG9yIiwibWF4TGVuZ3RoIiwidG9kYXkiLCJmaWVsZFR5cGUiLCJpbnB1dFZhbHVlIiwiZmllbGRDb2RlIiwiZmllbGRSZXF1aXJlZCIsInZhbHVlSGFzQmxhbmsiLCJpbnB1dFZhbHVlQXJyYXkiLCJ2YXJpYWJsZUhhc0JsYW5rIiwiaW5wdXROdW1iZXJWYWx1ZSIsInR3b0RpZ2l0TW9udGhEYXkiLCJzaW5nbGVEaWdpdE1vbnRoRGF5Iiwic2luZ2xlRGlnaXRNb250aCIsInNpbmdsZURpZ2l0RGF5IiwiZGF0ZVRpbWVNaWxsaVNlY29uZCIsImRhdGVUaW1lIiwiZGF0ZVRpbWVOb3RJbmNsdWRpbmdNaWxsaVNlY29uZHMiLCJqc3REYXRlIiwiZGF0ZUFycmF5IiwieWVhckluZGV4IiwibW9udGhJbmRleCIsImRheUluZGV4IiwiZmllbGRPcHRpb25zIiwib3B0aW9uc0luZGV4IiwidXNlcnNOYW1lIiwidXNlcnNJbmZvIiwiaW5kZXhVc2Vyc0luZm8iLCJpbmRleElucHV0VXNlciIsIm9yZ2FuaXphdGlvbk5hbWUiLCJncm91cHNOYW1lIiwib2JqZWN0VmFsdWUiLCJ2YXJpYWJsZVZhbHVlIiwib2JqZWN0UHJvcGVydHlOYW1lIiwiZmllbGRDb2x1bW5JbmRleCIsImluc2VydFZhbHVlVHlwZSIsImZpZWxkVmFsdWVBcnJheSIsIm5vdElucHV0RXJyb3IiLCJjb250ZXh0SGFzVmFyaWFibGVzTmFtZXMiLCJnZXRDb250ZXh0VmFyQnlQYXRoIiwiaW5wdXRWYXJpYWJsZXNOYW1lIiwiaW5wdXRWYXJpYWJsZXNFeGlzdCIsIm9iamVjdFByb3BlcnRpZXMiLCJjb3JyZWN0Rm9ybWF0dGVkVmFsdWUiLCJjb3JyZWN0VmFsdWVzIiwiZm9ybWF0dGVkRGF0ZSIsIm9yZ2FuaXphdGlvbnMiLCJzZXRVcGRhdGVEYXRhIiwidXBkYXRlRGF0YSIsImluc2VydFZhbHVlIiwidXBkYXRlZFJlY29yZCIsImdldFZhbHVlIiwibW90b3RleHQiLCJqb2luRmllbGQxdHlwZSIsImpvaW5GaWVsZDJ0eXBlIiwic2F2ZUZpZWxkdHlwZSIsImpvaW5WYWx1ZTEiLCJqb2luVmFsdWUyIiwiY29uU3RyaW5nIiwic2F2ZVZhbHVlIiwiY2hlY2tSZWdleCIsInJldFN0ciIsImVsZW1lbnRNYXAiLCJpbnN0YW5jZU1hcCIsIlRSQU5TSVRJT05fRU5EIiwicGFyc2VTZWxlY3RvciIsImdldFVJRCIsImdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50IiwidHJhbnNpdGlvbkR1cmF0aW9uIiwidHJhbnNpdGlvbkRlbGF5IiwiZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24iLCJmbG9hdFRyYW5zaXRpb25EZWxheSIsInRyaWdnZXJUcmFuc2l0aW9uRW5kIiwiZ2V0RWxlbWVudCIsImlzVmlzaWJsZSIsImVsZW1lbnRJc1Zpc2libGUiLCJjbG9zZWREZXRhaWxzIiwic3VtbWFyeSIsImlzRGlzYWJsZWQiLCJmaW5kU2hhZG93Um9vdCIsInJlZmxvdyIsImdldGpRdWVyeSIsIkRPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MiLCJvbkRPTUNvbnRlbnRMb2FkZWQiLCJpc1JUTCIsImRlZmluZUpRdWVyeVBsdWdpbiIsInBsdWdpbiIsIiQiLCJKUVVFUllfTk9fQ09ORkxJQ1QiLCJleGVjdXRlIiwicG9zc2libGVDYWxsYmFjayIsImV4ZWN1dGVBZnRlclRyYW5zaXRpb24iLCJ0cmFuc2l0aW9uRWxlbWVudCIsIndhaXRGb3JUcmFuc2l0aW9uIiwiZHVyYXRpb25QYWRkaW5nIiwiZW11bGF0ZWREdXJhdGlvbiIsImNhbGxlZCIsImdldE5leHRBY3RpdmVFbGVtZW50IiwiYWN0aXZlRWxlbWVudCIsInNob3VsZEdldE5leHQiLCJpc0N5Y2xlQWxsb3dlZCIsImxpc3RMZW5ndGgiLCJpbmRleF9qcyIsIm5hbWVzcGFjZVJlZ2V4Iiwic3RyaXBOYW1lUmVnZXgiLCJzdHJpcFVpZFJlZ2V4IiwiZXZlbnRSZWdpc3RyeSIsInVpZEV2ZW50IiwiY3VzdG9tRXZlbnRzIiwibmF0aXZlRXZlbnRzIiwibWFrZUV2ZW50VWlkIiwidWlkIiwiZ2V0RWxlbWVudEV2ZW50cyIsImJvb3RzdHJhcEhhbmRsZXIiLCJoeWRyYXRlT2JqIiwiRXZlbnRIYW5kbGVyIiwiYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIiLCJkb21FbGVtZW50cyIsImRvbUVsZW1lbnQiLCJmaW5kSGFuZGxlciIsImNhbGxhYmxlIiwiZGVsZWdhdGlvblNlbGVjdG9yIiwibm9ybWFsaXplUGFyYW1ldGVycyIsIm9yaWdpbmFsVHlwZUV2ZW50IiwiZGVsZWdhdGlvbkZ1bmN0aW9uIiwiaXNEZWxlZ2F0ZWQiLCJ0eXBlRXZlbnQiLCJnZXRUeXBlRXZlbnQiLCJhZGRIYW5kbGVyIiwib25lT2ZmIiwicHJldmlvdXNGdW5jdGlvbiIsInJlbW92ZUhhbmRsZXIiLCJyZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMiLCJzdG9yZUVsZW1lbnRFdmVudCIsImhhbmRsZXJLZXkiLCJpbk5hbWVzcGFjZSIsImlzTmFtZXNwYWNlIiwiZWxlbWVudEV2ZW50Iiwia2V5SGFuZGxlcnMiLCJqUXVlcnlFdmVudCIsImJ1YmJsZXMiLCJuYXRpdmVEaXNwYXRjaCIsImRlZmF1bHRQcmV2ZW50ZWQiLCJtZXRhIiwibm9ybWFsaXplRGF0YSIsIm5vcm1hbGl6ZURhdGFLZXkiLCJjaHIiLCJic0tleXMiLCJwdXJlS2V5IiwiTWFuaXB1bGF0b3IiLCJDb25maWciLCJqc29uQ29uZmlnIiwiY29uZmlnVHlwZXMiLCJleHBlY3RlZFR5cGVzIiwidmFsdWVUeXBlIiwiQmFzZUNvbXBvbmVudCIsInByb3BlcnR5TmFtZSIsImlzQW5pbWF0ZWQiLCJnZXRTZWxlY3RvciIsImhyZWZBdHRyaWJ1dGUiLCJTZWxlY3RvckVuZ2luZSIsInBhcmVudHMiLCJhbmNlc3RvciIsInByZXZpb3VzIiwiZm9jdXNhYmxlcyIsIk5BTUUiLCJDTEFTU19OQU1FX0ZBREUiLCJDTEFTU19OQU1FX1NIT1ciLCJFVkVOVF9NT1VTRURPV04iLCJEZWZhdWx0IiwiRGVmYXVsdFR5cGUiLCJCYWNrZHJvcCIsImJhY2tkcm9wIiwiZW5hYmxlRGlzbWlzc1RyaWdnZXIiLCJjb21wb25lbnQiLCJjbGlja0V2ZW50IiwiRVZFTlRfS0VZIiwiRVZFTlRfRk9DVVNJTiIsIkVWRU5UX0tFWURPV05fVEFCIiwiVEFCX0tFWSIsIlRBQl9OQVZfRk9SV0FSRCIsIlRBQl9OQVZfQkFDS1dBUkQiLCJGb2N1c1RyYXAiLCJ0cmFwRWxlbWVudCIsIlNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQiLCJTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCIsIlBST1BFUlRZX1BBRERJTkciLCJQUk9QRVJUWV9NQVJHSU4iLCJTY3JvbGxCYXJIZWxwZXIiLCJkb2N1bWVudFdpZHRoIiwiY2FsY3VsYXRlZFZhbHVlIiwic3R5bGVQcm9wZXJ0eSIsInNjcm9sbGJhcldpZHRoIiwibWFuaXB1bGF0aW9uQ2FsbEJhY2siLCJhY3R1YWxWYWx1ZSIsImNhbGxCYWNrIiwiY29tcG9uZW50RnVuY3Rpb25zX2pzIiwiREFUQV9BUElfS0VZIiwiRVNDQVBFX0tFWSIsIkVWRU5UX0hJREUiLCJFVkVOVF9ISURFX1BSRVZFTlRFRCIsIkVWRU5UX0hJRERFTiIsIkVWRU5UX1NIT1ciLCJFVkVOVF9TSE9XTiIsIkVWRU5UX1JFU0laRSIsIkVWRU5UX0NMSUNLX0RJU01JU1MiLCJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsIkVWRU5UX0tFWURPV05fRElTTUlTUyIsIkVWRU5UX0NMSUNLX0RBVEFfQVBJIiwiQ0xBU1NfTkFNRV9PUEVOIiwiQ0xBU1NfTkFNRV9TVEFUSUMiLCJPUEVOX1NFTEVDVE9SIiwiU0VMRUNUT1JfRElBTE9HIiwiU0VMRUNUT1JfTU9EQUxfQk9EWSIsIlNFTEVDVE9SX0RBVEFfVE9HR0xFIiwiTW9kYWwiLCJyZWxhdGVkVGFyZ2V0IiwibW9kYWxCb2R5IiwidHJhbnNpdGlvbkNvbXBsZXRlIiwiZXZlbnQyIiwiaXNNb2RhbE92ZXJmbG93aW5nIiwiaW5pdGlhbE92ZXJmbG93WSIsImlzQm9keU92ZXJmbG93aW5nIiwic2hvd0V2ZW50IiwiYWxyZWFkeU9wZW4iLCJwbGFjZW1lbnQiLCJvd25lckRvY3VtZW50IiwiT3duRWxlbWVudCIsIl9yZWYiLCJlZmZlY3QiLCJfcmVmMiIsImluaXRpYWxTdHlsZXMiLCJzdHlsZVByb3BlcnRpZXMiLCJhdHRyaWJ1dGUiLCJ1YURhdGEiLCJpbmNsdWRlU2NhbGUiLCJpc0ZpeGVkU3RyYXRlZ3kiLCJjbGllbnRSZWN0Iiwic2NhbGVYIiwic2NhbGVZIiwidmlzdWFsVmlld3BvcnQiLCJhZGRWaXN1YWxPZmZzZXRzIiwiaGVpZ2h0Iiwicm9vdE5vZGUiLCJnZXRDb21wdXRlZFN0eWxlIiwiaXNGaXJlZm94IiwiaXNJRSIsImVsZW1lbnRDc3MiLCJjdXJyZW50Tm9kZSIsImNzcyIsIm1hdGhNYXgiLCJtYXRoTWluIiwicGFkZGluZ09iamVjdCIsImhhc2hNYXAiLCJ0b1BhZGRpbmdPYmplY3QiLCJwYWRkaW5nIiwiX3N0YXRlJG1vZGlmaWVyc0RhdGEkIiwiYXJyb3dFbGVtZW50IiwicG9wcGVyT2Zmc2V0cyIsImJhc2VQbGFjZW1lbnQiLCJheGlzIiwiaXNWZXJ0aWNhbCIsImFycm93UmVjdCIsIm1pblByb3AiLCJtYXhQcm9wIiwiZW5kRGlmZiIsInN0YXJ0RGlmZiIsImFycm93T2Zmc2V0UGFyZW50IiwiY2xpZW50U2l6ZSIsImNlbnRlclRvUmVmZXJlbmNlIiwiY2VudGVyIiwiYXhpc1Byb3AiLCJfb3B0aW9ucyRlbGVtZW50IiwiZHByIiwiX09iamVjdCRhc3NpZ24yIiwicG9wcGVyIiwicG9wcGVyUmVjdCIsInZhcmlhdGlvbiIsIm9mZnNldHMiLCJncHVBY2NlbGVyYXRpb24iLCJhZGFwdGl2ZSIsInJvdW5kT2Zmc2V0cyIsImlzRml4ZWQiLCJfb2Zmc2V0cyR4IiwiX29mZnNldHMkeSIsIl9yZWYzIiwiaGFzWCIsImhhc1kiLCJzaWRlWCIsInNpZGVZIiwiaGVpZ2h0UHJvcCIsIndpZHRoUHJvcCIsIm9mZnNldFkiLCJvZmZzZXRYIiwiY29tbW9uU3R5bGVzIiwiX3JlZjQiLCJfT2JqZWN0JGFzc2lnbiIsIl9yZWY1IiwiX29wdGlvbnMkZ3B1QWNjZWxlcmF0IiwiX29wdGlvbnMkYWRhcHRpdmUiLCJfb3B0aW9ucyRyb3VuZE9mZnNldHMiLCJfb3B0aW9ucyRzY3JvbGwiLCJzY3JvbGwiLCJfb3B0aW9ucyRyZXNpemUiLCJyZXNpemUiLCJzY3JvbGxQYXJlbnRzIiwic2Nyb2xsUGFyZW50Iiwic2Nyb2xsTGVmdCIsInNjcm9sbFRvcCIsInN0cmF0ZWd5IiwibGF5b3V0Vmlld3BvcnQiLCJfZWxlbWVudCRvd25lckRvY3VtZW4iLCJ3aW5TY3JvbGwiLCJfZ2V0Q29tcHV0ZWRTdHlsZSIsIm92ZXJmbG93Iiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwiaXNCb2R5IiwidXBkYXRlZExpc3QiLCJjbGlwcGluZ1BhcmVudCIsImNsaXBwaW5nUGFyZW50cyIsImNhbkVzY2FwZUNsaXBwaW5nIiwiY2xpcHBlckVsZW1lbnQiLCJib3VuZGFyeSIsInJvb3RCb3VuZGFyeSIsIm1haW5DbGlwcGluZ1BhcmVudHMiLCJmaXJzdENsaXBwaW5nUGFyZW50IiwiY2xpcHBpbmdSZWN0IiwiYWNjUmVjdCIsInJlZmVyZW5jZSIsImNvbW1vblgiLCJjb21tb25ZIiwibWFpbkF4aXMiLCJfb3B0aW9ucyIsIl9vcHRpb25zJHBsYWNlbWVudCIsIl9vcHRpb25zJHN0cmF0ZWd5IiwiX29wdGlvbnMkYm91bmRhcnkiLCJfb3B0aW9ucyRyb290Qm91bmRhcnkiLCJfb3B0aW9ucyRlbGVtZW50Q29udGUiLCJlbGVtZW50Q29udGV4dCIsIl9vcHRpb25zJGFsdEJvdW5kYXJ5IiwiYWx0Qm91bmRhcnkiLCJfb3B0aW9ucyRwYWRkaW5nIiwiYWx0Q29udGV4dCIsImNsaXBwaW5nQ2xpZW50UmVjdCIsInJlZmVyZW5jZUNsaWVudFJlY3QiLCJwb3BwZXJDbGllbnRSZWN0IiwiZWxlbWVudENsaWVudFJlY3QiLCJvdmVyZmxvd09mZnNldHMiLCJvZmZzZXREYXRhIiwibXVsdGlwbHkiLCJmbGlwVmFyaWF0aW9ucyIsIl9vcHRpb25zJGFsbG93ZWRBdXRvUCIsImFsbG93ZWRBdXRvUGxhY2VtZW50cyIsImFsbFBsYWNlbWVudHMiLCJwbGFjZW1lbnRzIiwiYWxsb3dlZFBsYWNlbWVudHMiLCJvdmVyZmxvd3MiLCJvcHBvc2l0ZVBsYWNlbWVudCIsIl9vcHRpb25zJG1haW5BeGlzIiwiY2hlY2tNYWluQXhpcyIsIl9vcHRpb25zJGFsdEF4aXMiLCJjaGVja0FsdEF4aXMiLCJzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMiLCJfb3B0aW9ucyRmbGlwVmFyaWF0aW8iLCJwcmVmZXJyZWRQbGFjZW1lbnQiLCJpc0Jhc2VQbGFjZW1lbnQiLCJmYWxsYmFja1BsYWNlbWVudHMiLCJyZWZlcmVuY2VSZWN0IiwiY2hlY2tzTWFwIiwibWFrZUZhbGxiYWNrQ2hlY2tzIiwiZmlyc3RGaXR0aW5nUGxhY2VtZW50IiwiX2Jhc2VQbGFjZW1lbnQiLCJpc1N0YXJ0VmFyaWF0aW9uIiwibWFpblZhcmlhdGlvblNpZGUiLCJhbHRWYXJpYXRpb25TaWRlIiwiY2hlY2tzIiwibnVtYmVyT2ZDaGVja3MiLCJfbG9vcCIsImZpdHRpbmdQbGFjZW1lbnQiLCJfcmV0IiwicHJldmVudGVkT2Zmc2V0cyIsInNpZGUiLCJyZWZlcmVuY2VPdmVyZmxvdyIsInBvcHBlckFsdE92ZXJmbG93IiwicmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzIiwicG9wcGVyRXNjYXBlT2Zmc2V0cyIsImlzUmVmZXJlbmNlSGlkZGVuIiwiaGFzUG9wcGVyRXNjYXBlZCIsInJlY3RzIiwiaW52ZXJ0RGlzdGFuY2UiLCJza2lkZGluZyIsImRpc3RhbmNlIiwiX29wdGlvbnMkb2Zmc2V0IiwiX2RhdGEkc3RhdGUkcGxhY2VtZW50IiwiX29wdGlvbnMkdGV0aGVyIiwidGV0aGVyIiwiX29wdGlvbnMkdGV0aGVyT2Zmc2V0IiwidGV0aGVyT2Zmc2V0IiwiYWx0QXhpcyIsInRldGhlck9mZnNldFZhbHVlIiwibm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlIiwib2Zmc2V0TW9kaWZpZXJTdGF0ZSIsIl9vZmZzZXRNb2RpZmllclN0YXRlJCIsIm1haW5TaWRlIiwiYWx0U2lkZSIsImFkZGl0aXZlIiwibWluTGVuIiwibWF4TGVuIiwiYXJyb3dQYWRkaW5nT2JqZWN0IiwiYXJyb3dQYWRkaW5nTWluIiwiYXJyb3dQYWRkaW5nTWF4IiwiYXJyb3dMZW4iLCJtaW5PZmZzZXQiLCJtYXhPZmZzZXQiLCJjbGllbnRPZmZzZXQiLCJvZmZzZXRNb2RpZmllclZhbHVlIiwidGV0aGVyTWluIiwidGV0aGVyTWF4IiwicHJldmVudGVkT2Zmc2V0IiwiX29mZnNldE1vZGlmaWVyU3RhdGUkMiIsIl9tYWluU2lkZSIsIl9hbHRTaWRlIiwiX29mZnNldCIsIl9sZW4iLCJfbWluIiwiX21heCIsImlzT3JpZ2luU2lkZSIsIl9vZmZzZXRNb2RpZmllclZhbHVlIiwiX3RldGhlck1pbiIsIl90ZXRoZXJNYXgiLCJfcHJldmVudGVkT2Zmc2V0IiwiZWxlbWVudE9yVmlydHVhbEVsZW1lbnQiLCJpc09mZnNldFBhcmVudEFuRWxlbWVudCIsIm9mZnNldFBhcmVudElzU2NhbGVkIiwibW9kaWZpZXJzIiwidmlzaXRlZCIsIm1vZGlmaWVyIiwicmVxdWlyZXMiLCJkZXAiLCJkZXBNb2RpZmllciIsIm9yZGVyZWRNb2RpZmllcnMiLCJwaGFzZSIsInBlbmRpbmciLCJnZW5lcmF0b3JPcHRpb25zIiwiX2dlbmVyYXRvck9wdGlvbnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyRkZWYiLCJkZWZhdWx0TW9kaWZpZXJzIiwiX2dlbmVyYXRvck9wdGlvbnMkZGVmMiIsImRlZmF1bHRPcHRpb25zIiwiZWZmZWN0Q2xlYW51cEZucyIsImlzRGVzdHJveWVkIiwic2V0T3B0aW9uc0FjdGlvbiIsImNsZWFudXBNb2RpZmllckVmZmVjdHMiLCJydW5Nb2RpZmllckVmZmVjdHMiLCJfc3RhdGUkZWxlbWVudHMiLCJfc3RhdGUkb3JkZXJlZE1vZGlmaWUiLCJfc3RhdGUkb3JkZXJlZE1vZGlmaWUyIiwiX3JlZiRvcHRpb25zIiwiY2xlYW51cEZuIiwibm9vcEZuIiwiY3JlYXRlUG9wcGVyIiwiY29tcHV0ZVN0eWxlcyIsImFwcGx5U3R5bGVzIiwiZmxpcCIsInByZXZlbnRPdmVyZmxvdyIsImFycm93IiwiaGlkZSIsImFic0RlbHRhWCIsImRpcmVjdGlvbiIsIml0ZW1zIiwiYWN0aXZlSW5kZXgiLCJvcmRlciIsImltZyIsInN3aXBlQ29uZmlnIiwiYWN0aXZlSW5kaWNhdG9yIiwibmV3QWN0aXZlSW5kaWNhdG9yIiwiZWxlbWVudEludGVydmFsIiwiaXNOZXh0IiwibmV4dEVsZW1lbnQiLCJuZXh0RWxlbWVudEluZGV4IiwidHJpZ2dlckV2ZW50IiwiZXZlbnROYW1lIiwiaXNDeWNsaW5nIiwiZGlyZWN0aW9uYWxDbGFzc05hbWUiLCJvcmRlckNsYXNzTmFtZSIsImNvbXBsZXRlQ2FsbEJhY2siLCJjYXJvdXNlbCIsInNsaWRlSW5kZXgiLCJjYXJvdXNlbHMiLCJ0b2dnbGVMaXN0IiwiZmlsdGVyRWxlbWVudCIsImZvdW5kRWxlbWVudCIsImFjdGl2ZUNoaWxkcmVuIiwiYWN0aXZlSW5zdGFuY2UiLCJzY3JvbGxTaXplIiwidHJpZ2dlciIsImNoaWxkcmVuIiwidHJpZ2dlckFycmF5IiwiaXNPcGVuIiwicmVmZXJlbmNlRWxlbWVudCIsInBvcHBlckNvbmZpZyIsIlBvcHBlci5jcmVhdGVQb3BwZXIiLCJwYXJlbnREcm9wZG93biIsImlzRW5kIiwicG9wcGVyRGF0YSIsImRlZmF1bHRCc1BvcHBlckNvbmZpZyIsIm9wZW5Ub2dnbGVzIiwiY29tcG9zZWRQYXRoIiwiaXNNZW51VGFyZ2V0IiwiaXNJbnB1dCIsImlzRXNjYXBlRXZlbnQiLCJpc1VwT3JEb3duRXZlbnQiLCJnZXRUb2dnbGVCdXR0b24iLCJjb21wbGV0ZUNhbGxiYWNrIiwiY2xpY2tDYWxsYmFjayIsImFsbG93ZWRBdHRyaWJ1dGVMaXN0IiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZVJlZ2V4IiwidW5zYWZlSHRtbCIsImFsbG93TGlzdCIsInNhbml0aXplRnVuY3Rpb24iLCJjcmVhdGVkRG9jdW1lbnQiLCJlbGVtZW50TmFtZSIsImF0dHJpYnV0ZUxpc3QiLCJhbGxvd2VkQXR0cmlidXRlcyIsInRlbXBsYXRlV3JhcHBlciIsImV4dHJhQ2xhc3MiLCJ0ZW1wbGF0ZUVsZW1lbnQiLCJpc0luVGhlRG9tIiwidGlwIiwidGlwSWQiLCJhdHRhY2htZW50IiwidHJpZ2dlcnMiLCJldmVudEluIiwiZXZlbnRPdXQiLCJ0aXRsZSIsImRhdGFBdHRyaWJ1dGVzIiwiZGF0YUF0dHJpYnV0ZSIsInNlY3Rpb24iLCJvYnNlcnZhYmxlU2VjdGlvbiIsInRhcmdldEVsZW1lbnQiLCJlbnRyeSIsImFjdGl2YXRlIiwicGFyZW50U2Nyb2xsVG9wIiwidXNlclNjcm9sbHNEb3duIiwiZW50cnlJc0xvd2VyVGhhblByZXZpb3VzIiwidGFyZ2V0TGlua3MiLCJhbmNob3IiLCJsaXN0R3JvdXAiLCJhY3RpdmVOb2RlcyIsInNweSIsImlubmVyRWxlbSIsImFjdGl2ZSIsImhpZGVFdmVudCIsInJlbGF0ZWRFbGVtIiwibmV4dEFjdGl2ZUVsZW1lbnQiLCJpc0FjdGl2ZSIsIm91dGVyRWxlbSIsIm9wZW4iLCJpc0ludGVyYWN0aW5nIiwibG9va1VwRmllbGQiLCJ0YXJnZXRSZWNvcmRzIiwiciIsImxvb2t1cCIsImRpYWxvZyIsIm1vZGFsSFRNTCIsImV2IiwiZGlhbG9nQm9keSIsImh0bWxyb3ciLCJhbGxDb3VudCIsInByb1JlY29yZHMiLCJsb29rVXBGaWVsZHMiLCJyZWNvcmRUYWJsZSIsInNwYW4iLCJpbnB1dEVsZW1lbnQiLCJjZWxscyIsImNvbmRpdGlvblRyZWUiLCJjdXJyQ29udGV4dCIsInRleHREZWNvcmF0aW9uIiwidHdvRGlnaXRNb250aCIsInNpbmdsZURpZ2l0RGF0ZSIsInR3b0RpZ2l0RGF0ZSIsImNhbGNWYWx1ZSIsImNhbGNPcHRpb24iLCJjYWxjUmVzdWx0IiwiY2hlY2tEYXRlVmFsdWUiLCJjYWxjT3B0aW9ucyIsImNhbGN1bGF0ZWREYXRlIiwidmVyTmFtZUdldFZhbHVlIiwiZGF0ZU9iaiIsImxhc3REYXlPZk1vbnRoIiwic3Bpbm5lciIsInBhcnNlZFVybCIsImxhc3RTZWdtZW50Iiwic2Vjb25kTGFzdFNlZ21lbnQiLCJtb2RlIiwiY3VycmVudExldmVsIiwiYXJyYXlJbmRleCIsImlucHV0RWxlbSIsInNvdXJjZUFwcElkIiwiaGFzaEJ1ZmZlciIsImZpZWxkTGlzdCIsInRlbXBEaWN0aW9uYXJ5IiwiZmllbGRDb2RlVG9JbmRleE1hcCIsImZpZWxkRGF0YSIsInJlY29yZEFycmF5IiwicHJldmlvdXNJdGVtIiwicHJldmlvdXNLZXkiLCJkaWN0aW9uYXJ5Iiwic2V0IiwiY3VycmVudFN0YXRlIiwicGFnZVR5cGUiLCJ0YWJsZUVsZW1lbnQiLCJmbGQiLCJlZGl0RWxlbSIsImhlYWRlckNlbGxzIiwiY2VsbCIsImluaXRTZWxlY3QiLCJsZXZlbCIsInByZXZpb3VzVmFsdWUiLCJvcHRpb25FbGVtZW50IiwiY3VycmVudEluZGV4IiwicHJldmlvdXNGaWVsZCIsInNuaXBwZXIiLCJkcm9wRG93bk1hbmFnZXIiLCJkaXNwbGF5TmFtZSIsInBsYWNlaG9sZGVyIiwibW9kZWxWYWx1ZSIsImlucHV0UG9pbnQiLCJvdXRwdXRQb2ludHMiLCJhY3Rpb25Qcm9wcyIsImRlZlByb3AiLCJwcm9wVmFsdWUiLCJzdWJUaXRsZSIsImFjdGlvbk5vZGVzIiwibmV4dE5vZGVJZHMiLCJwYXJzZWRPYmplY3QiLCJub2RlQ2xhc3MiLCJhY3Rpb25GbG93IiwiYWN0aW9uIiwiZGVmYXVsdE1lc3NhZ2UiLCJkZWZNc2ciLCJtZXNzYWdlcyIsImV2ZW50SWQiLCJmbG93IiwiZXJyb3JtYW5hZ2VyIiwibmV4dEFjdGlvbiIsIm5leHRJbnB1dCIsImdldENoYW5nZUV2ZW50cyIsImdldENsaWNrRXZlbnRzIiwiZ2V0S2ludG9uZUV2ZW50cyIsImNoYW5nZUV2ZW50cyIsImNsaWNrRXZlbnRzIiwia2ludG9uZUV2ZW50cyIsImZsb3dpbmZvIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7aUJBVUUsU0FBVUEsRUFBUUMsRUFBVSxDQWE1QkMsRUFBQSxRQUFpQkYsRUFBTyxTQUN2QkMsRUFBU0QsRUFBUSxFQUFNLEVBQ3ZCLFNBQVVHLEVBQUksQ0FDYixHQUFLLENBQUNBLEVBQUUsU0FDUCxNQUFNLElBQUksTUFBTyw0Q0FFbEIsT0FBT0YsRUFBU0UsRUFDcEIsQ0FNQSxHQUFLLE9BQU8sT0FBVyxJQUFjLE9BQVNDLGVBQU0sU0FB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Q0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTSxNQUFNLEVBQUUsYUFBYSxDQUFDLE9BQU8sTUFBTSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLE1BQU0sS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxNQUFNLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLG1DQUFt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Q0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILElBQUssSUFDTCxJQUFLLElBQ0wsRUFBRyxJQUNILElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssR0FDUCxFQUVNLHdCQUFxRCxDQUN6RCxHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNI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QUFjenJELEVBQU0sS0FBS3lyRCxFQUFLenJELENBQUssRUFDekMsT0FFVEEsQ0FBQSxDQUNSLEVBRUFnc0QsRUFBYSxPQUFPLEdBRXJCLFFBQVEsT0FBTyxHQUFHQSxFQUFjaHNELEdBQVksQ0FDcEMsTUFBQW1zRCxFQUFXLFFBQVFuc0QsRUFBTSxJQUFJLEVBQzdCeXJELEVBQUssV0FBVyxTQUFTVSxFQUFTLE9BQU8sRUFDL0MsT0FBR1YsSUFBTyxRQUNRLElBQUksY0FBY3pyRCxFQUFNLEtBQUt5ckQsRUFBS3pyRCxDQUFLLEVBQy9DLEtBQUssRUFBRSxLQUFNOHRCLEdBQU0sQ0FDekIsTUFBTXhaLEVBQVN0VSxFQUFNLE9BQ3JCLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFBc1UsQ0FBTyxDQUFBLENBQUEsQ0FDaEMsRUFBRSxNQUFPbVksR0FBTSxDQUNkLFFBQVEsTUFBTUEsQ0FBRyxDQUFBLENBQ2xCLEVBRUl6c0IsQ0FBQSxDQUNSLEVBRUFpc0QsRUFBWSxPQUFPLEdBQ1JBLEVBQUEsUUFBUzNLLEdBQW1CLENBQ3RDLEVBQUUsUUFBUSxFQUFFLEdBQUdBLEVBQVUsU0FBVSxDQUNqQyxNQUFNdGhELEVBQU0sUUFBUSxJQUFJLE9BQU8sSUFBSSxFQUM3Qm1zRCxFQUFXLFFBQVE3SyxDQUFTLEVBQzVCbUssRUFBSyxXQUFXLFNBQVNVLEVBQVMsT0FBTyxFQUM1Q1YsSUFBTyxRQUVSLE1BRGdCLElBQUksY0FBY25LLEVBQVVtSyxFQUFLenJELENBQUssRUFDeEMsT0FFaEIsTUFBTXNVLEVBQVN0VSxFQUFNLE9BQ3JCLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFBc1UsQ0FBTyxDQUFBLENBQUEsQ0FDaEMsQ0FBQSxDQUNGLENBRVAsQ0FBQyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDldfQ==
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxjX3J1bnRpbWUuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCIuLi9zcmMvYWN0aW9ucy9pbmRleC50cyIsIi4uL3NyYy9hY3Rpb25zL211c3QtaW5wdXQudHMiLCIuLi9zcmMvdXRpbC9mb3JtYXQudHMiLCIuLi9zcmMvYWN0aW9ucy9hdXRvLW51bWJlcmluZy50cyIsIi4uL3NyYy90eXBlcy9Db25kaXRpb25zLnRzIiwiLi4vc3JjL2FjdGlvbnMvZmllbGQtc2hvd24udHMiLCIuLi9zcmMvYWN0aW9ucy9lcnJvci1zaG93LnRzIiwiLi4vc3JjL2FjdGlvbnMvYnV0dG9uLWFkZC50cyIsIi4uL3NyYy9hY3Rpb25zL2NvbmRpdGlvbi1hY3Rpb24udHMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvcGxhdGZvcm0vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvcGxhdGZvcm0vVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbWUvTWltZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9taW1lL3R5cGVzL3N0YW5kYXJkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL21pbWUvbGl0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9wbGF0Zm9ybS9icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL3VybC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvQmFzZUNsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvQnVsa1JlcXVlc3RDbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L0FwcENsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9lcnJvci9LaW50b25lQWJvcnRTZWFyY2hFcnJvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9lcnJvci9LaW50b25lQWxsUmVjb3Jkc0Vycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2Vycm9yL0tpbnRvbmVSZXN0QVBJRXJyb3IuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvZXJyb3IvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L1JlY29yZENsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvU3BhY2VDbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvZm9ybS1kYXRhL2xpYi9icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC9GaWxlQ2xpZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC9QbHVnaW5DbGllbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvYXhpb3MvZGlzdC9icm93c2VyL2F4aW9zLmNqcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9odHRwL0F4aW9zQ2xpZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2h0dHAvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9ldmFsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yYW5nZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvcmVmLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9zeW50YXguanMiLCIuLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3R5cGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3VyaS5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXMtcHJvdG8vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhc293bi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2VzLWRlZmluZS1wcm9wZXJ0eS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nb3BkL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RlZmluZS1kYXRhLXByb3BlcnR5L2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZXQtZnVuY3Rpb24tbGVuZ3RoL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvY2FsbEJvdW5kLmpzIiwiLi4vX192aXRlLWJyb3dzZXItZXh0ZXJuYWwiLCIuLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIi4uL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvanMtYmFzZTY0L2Jhc2U2NC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvS2ludG9uZVJlc3BvbnNlSGFuZGxlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9LaW50b25lUmVzdEFQSUNsaWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Aa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9pbmRleC5icm93c2VyLmpzIiwiLi4vc3JjL3R5cGVzL0ZpZWxkTGF5b3V0LnRzIiwiLi4vc3JjL3V0aWwvYWdncmVnYXRlcy50cyIsIi4uL3NyYy9hY3Rpb25zL2RhdGEtcHJvY2Vzc2luZy50cyIsIi4uL3NyYy9hY3Rpb25zL2RhdGEtdXBkYXRlLnRzIiwiLi4vc3JjL2FjdGlvbnMvY3VycmVudC1maWVsZC1nZXQudHMiLCIuLi9zcmMvYWN0aW9ucy9yZWd1bGFyLWNoZWNrLnRzIiwiLi4vc3JjL2FjdGlvbnMvbWFpbC1jaGVjay50cyIsIi4uL3NyYy9hY3Rpb25zL2NvdW50ZXItY2hlY2sudHMiLCIuLi9zcmMvYWN0aW9ucy9kYXRldGltZS1nZXR0ZXIudHMiLCIuLi9zcmMvYWN0aW9ucy9pbnNlcnQtdmFsdWUudHMiLCIuLi9zcmMvYWN0aW9ucy92YWx1ZS1nZXR0ZXIudHMiLCIuLi9zcmMvYWN0aW9ucy9zdHJpbmctam9pbi50cyIsIi4uL3NyYy9hY3Rpb25zL3ZhbGlkYXRpb24tZnVsbHdpZHRoLnRzIiwiLi4vc3JjL2FjdGlvbnMvdmFsaWRhdGlvbi1oYWxmd2lkdGgudHMiLCIuLi9zcmMvYWN0aW9ucy9oYWxmLWZ1bGwtY29udmVyc2lvbi50cyIsIi4uL3NyYy9hY3Rpb25zL2xvZ2luLXVzZXItZ2V0dGVyLnRzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L2RvbS9kYXRhLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L3V0aWwvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL21hbmlwdWxhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L3V0aWwvY29uZmlnLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L2Jhc2UtY29tcG9uZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L2RvbS9zZWxlY3Rvci1lbmdpbmUuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9iYWNrZHJvcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9mb2N1c3RyYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9zY3JvbGxiYXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvbW9kYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3VzZXJBZ2VudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2lzTGF5b3V0Vmlld3BvcnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvY29udGFpbnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNUYWJsZUVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2Fycm93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRWYXJpYXRpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvd1Njcm9sbEJhclguanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXREb2N1bWVudFJlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1Njcm9sbFBhcmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9jb21wdXRlT2Zmc2V0cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvZmxpcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2hpZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRBbHRBeGlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlU2Nyb2xsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvb3JkZXJNb2RpZmllcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RlYm91bmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvY3JlYXRlUG9wcGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9wb3BwZXItbGl0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5lc20uanMiLCIuLi9zcmMvYWN0aW9ucy9hdXRvLWxvb2t1cC50cyIsIi4uL3NyYy9hY3Rpb25zL2ZpZWxkLWRpc2FibGUudHMiLCIuLi9zcmMvYWN0aW9ucy9zdHlsZS1maWVsZC50cyIsIi4uL3NyYy9hY3Rpb25zL2RhdGV0aW1lLWNhbGMudHMiLCIuLi9zcmMvYWN0aW9ucy9lbmQtb2YtbW9udGgudHMiLCIuLi9zcmMvYWN0aW9ucy9kYXRlLXNwZWNpZmllZC50cyIsIi4uL3NyYy91dGlsL3VpLWhlbHBlci50cyIsIi4uL3NyYy91dGlsL3VybC50cyIsIi4uL3NyYy90eXBlcy9DYXNjYWRpbmdEcm9wRG93bk1hbmFnZXIudHMiLCIuLi9zcmMvYWN0aW9ucy9jYXNjYWRpbmctZHJvcGRvd24udHMiLCIuLi9zcmMvdHlwZXMvQWN0aW9uVHlwZXMudHMiLCIuLi9zcmMvdHlwZXMvYWN0aW9uLXByb2Nlc3MudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjcuMVxuICogaHR0cHM6Ly9qcXVlcnkuY29tL1xuICpcbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAyMy0wOC0yOFQxMzozN1pcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgdHJhYy0xNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSApKCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIEVkZ2UgPD0gMTIgLSAxMyssIEZpcmVmb3ggPD0xOCAtIDQ1KywgSUUgMTAgLSAxMSwgU2FmYXJpIDUuMSAtIDkrLCBpT1MgNiAtIDkuMVxuLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlXG4vLyBhcmd1bWVudHMuY2FsbGVlLmNhbGxlciAodHJhYy0xMzMzNSkuIEJ1dCBhcyBvZiBqUXVlcnkgMy4wICgyMDE2KSwgc3RyaWN0IG1vZGUgc2hvdWxkIGJlIGNvbW1vblxuLy8gZW5vdWdoIHRoYXQgYWxsIHN1Y2ggYXR0ZW1wdHMgYXJlIGd1YXJkZWQgaW4gYSB0cnkgYmxvY2suXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIGFyciA9IFtdO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGZsYXQgPSBhcnIuZmxhdCA/IGZ1bmN0aW9uKCBhcnJheSApIHtcblx0cmV0dXJuIGFyci5mbGF0LmNhbGwoIGFycmF5ICk7XG59IDogZnVuY3Rpb24oIGFycmF5ICkge1xuXHRyZXR1cm4gYXJyLmNvbmNhdC5hcHBseSggW10sIGFycmF5ICk7XG59O1xuXG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD01NywgRmlyZWZveCA8PTUyXG5cdFx0Ly8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIDxvYmplY3Q+IGVsZW1lbnRzXG5cdFx0Ly8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cblx0XHQvLyBXZSBkb24ndCB3YW50IHRvIGNsYXNzaWZ5ICphbnkqIERPTSBub2RlIGFzIGEgZnVuY3Rpb24uXG5cdFx0Ly8gU3VwcG9ydDogUXRXZWIgPD0zLjguNSwgV2ViS2l0IDw9NTM0LjM0LCB3a2h0bWx0b3BkZiB0b29sIDw9MC4xMi41XG5cdFx0Ly8gUGx1cyBmb3Igb2xkIFdlYktpdCwgdHlwZW9mIHJldHVybnMgXCJmdW5jdGlvblwiIGZvciBIVE1MIGNvbGxlY3Rpb25zXG5cdFx0Ly8gKGUuZy4sIGB0eXBlb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIikgPT09IFwiZnVuY3Rpb25cImApLiAoZ2gtNDc1Nilcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBvYmoubm9kZVR5cGUgIT09IFwibnVtYmVyXCIgJiZcblx0XHRcdHR5cGVvZiBvYmouaXRlbSAhPT0gXCJmdW5jdGlvblwiO1xuXHR9O1xuXG5cbnZhciBpc1dpbmRvdyA9IGZ1bmN0aW9uIGlzV2luZG93KCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fTtcblxuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cblxuXG5cdHZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0ge1xuXHRcdHR5cGU6IHRydWUsXG5cdFx0c3JjOiB0cnVlLFxuXHRcdG5vbmNlOiB0cnVlLFxuXHRcdG5vTW9kdWxlOiB0cnVlXG5cdH07XG5cblx0ZnVuY3Rpb24gRE9NRXZhbCggY29kZSwgbm9kZSwgZG9jICkge1xuXHRcdGRvYyA9IGRvYyB8fCBkb2N1bWVudDtcblxuXHRcdHZhciBpLCB2YWwsXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDY0KywgRWRnZSAxOCtcblx0XHRcdFx0Ly8gU29tZSBicm93c2VycyBkb24ndCBzdXBwb3J0IHRoZSBcIm5vbmNlXCIgcHJvcGVydHkgb24gc2NyaXB0cy5cblx0XHRcdFx0Ly8gT24gdGhlIG90aGVyIGhhbmQsIGp1c3QgdXNpbmcgYGdldEF0dHJpYnV0ZWAgaXMgbm90IGVub3VnaCBhc1xuXHRcdFx0XHQvLyB0aGUgYG5vbmNlYCBhdHRyaWJ1dGUgaXMgcmVzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHdoZW5ldmVyIGl0XG5cdFx0XHRcdC8vIGJlY29tZXMgYnJvd3NpbmctY29udGV4dCBjb25uZWN0ZWQuXG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvaXNzdWVzLzIzNjlcblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI25vbmNlLWF0dHJpYnV0ZXNcblx0XHRcdFx0Ly8gVGhlIGBub2RlLmdldEF0dHJpYnV0ZWAgY2hlY2sgd2FzIGFkZGVkIGZvciB0aGUgc2FrZSBvZlxuXHRcdFx0XHQvLyBgalF1ZXJ5Lmdsb2JhbEV2YWxgIHNvIHRoYXQgaXQgY2FuIGZha2UgYSBub25jZS1jb250YWluaW5nIG5vZGVcblx0XHRcdFx0Ly8gdmlhIGFuIG9iamVjdC5cblx0XHRcdFx0dmFsID0gbm9kZVsgaSBdIHx8IG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCBpICk7XG5cdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoIGksIHZhbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRvYy5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIHRvVHlwZSggb2JqICkge1xuXHRpZiAoIG9iaiA9PSBudWxsICkge1xuXHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHR0eXBlb2Ygb2JqO1xufVxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmVzbGludHJjLmpzb24gd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlXG5cblxuXG52YXIgdmVyc2lvbiA9IFwiMy43LjFcIixcblxuXHRyaHRtbFN1ZmZpeCA9IC9IVE1MJC9pLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fTtcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblxuXHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRpZiAoIG51bSA9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0cmV0dXJuIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF07XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXZlbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICggaSArIDEgKSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0b2RkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5ncmVwKCB0aGlzLCBmdW5jdGlvbiggX2VsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gaSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKCk7XG5cdH0sXG5cblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuXHQvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC5cblx0cHVzaDogcHVzaCxcblx0c29ydDogYXJyLnNvcnQsXG5cdHNwbGljZTogYXJyLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IE9iamVjdC5wcm90b3R5cGUgcG9sbHV0aW9uXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCBuYW1lID09PSBcIl9fcHJvdG9fX1wiIHx8IHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHtcblx0XHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSBwcm9wZXIgdHlwZSBmb3IgdGhlIHNvdXJjZSB2YWx1ZVxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgJiYgIUFycmF5LmlzQXJyYXkoIHNyYyApICkge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBbXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhY29weUlzQXJyYXkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0ge307XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgcHJvdG8sIEN0b3I7XG5cblx0XHQvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcblx0XHQvLyBVc2UgdG9TdHJpbmcgaW5zdGVhZCBvZiBqUXVlcnkudHlwZSB0byBjYXRjaCBob3N0IG9iamVjdHNcblx0XHRpZiAoICFvYmogfHwgdG9TdHJpbmcuY2FsbCggb2JqICkgIT09IFwiW29iamVjdCBPYmplY3RdXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cHJvdG8gPSBnZXRQcm90byggb2JqICk7XG5cblx0XHQvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluXG5cdFx0aWYgKCAhcHJvdG8gKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuXHRcdEN0b3IgPSBoYXNPd24uY2FsbCggcHJvdG8sIFwiY29uc3RydWN0b3JcIiApICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIHByb3ZpZGVkIGNvbnRleHQ7IGZhbGxzIGJhY2sgdG8gdGhlIGdsb2JhbCBvbmVcblx0Ly8gaWYgbm90IHNwZWNpZmllZC5cblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUsIG9wdGlvbnMsIGRvYyApIHtcblx0XHRET01FdmFsKCBjb2RlLCB7IG5vbmNlOiBvcHRpb25zICYmIG9wdGlvbnMubm9uY2UgfSwgZG9jICk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXG5cdC8vIFJldHJpZXZlIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuXHR0ZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbm9kZSxcblx0XHRcdHJldCA9IFwiXCIsXG5cdFx0XHRpID0gMCxcblx0XHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdGlmICggIW5vZGVUeXBlICkge1xuXG5cdFx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBlbGVtWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRcdHJldCArPSBqUXVlcnkudGV4dCggbm9kZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50O1xuXHRcdH1cblx0XHRpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHRcdH1cblxuXHRcdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0aXNYTUxEb2M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lc3BhY2UgPSBlbGVtICYmIGVsZW0ubmFtZXNwYWNlVVJJLFxuXHRcdFx0ZG9jRWxlbSA9IGVsZW0gJiYgKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdC8vIEFzc3VtZSBIVE1MIHdoZW4gZG9jdW1lbnRFbGVtZW50IGRvZXNuJ3QgeWV0IGV4aXN0LCBzdWNoIGFzIGluc2lkZVxuXHRcdC8vIGRvY3VtZW50IGZyYWdtZW50cy5cblx0XHRyZXR1cm4gIXJodG1sU3VmZml4LnRlc3QoIG5hbWVzcGFjZSB8fCBkb2NFbGVtICYmIGRvY0VsZW0ubm9kZU5hbWUgfHwgXCJIVE1MXCIgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBmbGF0KCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcblx0ZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHRcdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHR9ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogcmVhbCBpT1MgOC4yIG9ubHkgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSB0b1R5cGUoIG9iaiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cblxuXG5mdW5jdGlvbiBub2RlTmFtZSggZWxlbSwgbmFtZSApIHtcblxuXHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblxufVxudmFyIHBvcCA9IGFyci5wb3A7XG5cblxudmFyIHNvcnQgPSBhcnIuc29ydDtcblxuXG52YXIgc3BsaWNlID0gYXJyLnNwbGljZTtcblxuXG52YXIgd2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIjtcblxuXG52YXIgcnRyaW1DU1MgPSBuZXcgUmVnRXhwKFxuXHRcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLFxuXHRcImdcIlxuKTtcblxuXG5cblxuLy8gTm90ZTogYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxualF1ZXJ5LmNvbnRhaW5zID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdHZhciBidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblxuXHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0XHQvLyBJRSBkb2Vzbid0IGhhdmUgYGNvbnRhaW5zYCBvbiBTVkcuXG5cdFx0YS5jb250YWlucyA/XG5cdFx0XHRhLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0KSApO1xufTtcblxuXG5cblxuLy8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cbi8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jY29tbW9uLXNlcmlhbGl6aW5nLWlkaW9tc1xudmFyIHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXHg4MC1cXHVGRkZGXFx3LV0vZztcblxuZnVuY3Rpb24gZmNzc2VzY2FwZSggY2gsIGFzQ29kZVBvaW50ICkge1xuXHRpZiAoIGFzQ29kZVBvaW50ICkge1xuXG5cdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0aWYgKCBjaCA9PT0gXCJcXDBcIiApIHtcblx0XHRcdHJldHVybiBcIlxcdUZGRkRcIjtcblx0XHR9XG5cblx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdHJldHVybiBjaC5zbGljZSggMCwgLTEgKSArIFwiXFxcXFwiICsgY2guY2hhckNvZGVBdCggY2gubGVuZ3RoIC0gMSApLnRvU3RyaW5nKCAxNiApICsgXCIgXCI7XG5cdH1cblxuXHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdHJldHVybiBcIlxcXFxcIiArIGNoO1xufVxuXG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKCBzZWwgKyBcIlwiICkucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuXG5cblxudmFyIHByZWZlcnJlZERvYyA9IGRvY3VtZW50LFxuXHRwdXNoTmF0aXZlID0gcHVzaDtcblxuKCBmdW5jdGlvbigpIHtcblxudmFyIGksXG5cdEV4cHIsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXHRwdXNoID0gcHVzaE5hdGl2ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdGRvY3VtZW50LFxuXHRkb2N1bWVudEVsZW1lbnQsXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdG1hdGNoZXMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0galF1ZXJ5LmV4cGFuZG8sXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0bm9ubmF0aXZlU2VsZWN0b3JDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8XCIgK1xuXHRcdFwibG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNpZGVudC10b2tlbi1kaWFncmFtXG5cdGlkZW50aWZpZXIgPSBcIig/OlxcXFxcXFxcW1xcXFxkYS1mQS1GXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIj98XFxcXFxcXFxbXlxcXFxyXFxcXG5cXFxcZl18W1xcXFx3LV18W15cXDAtXFxcXHg3Zl0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblxuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJsZWFkaW5nQ29tYmluYXRvciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJkZXNjZW5kID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwifD5cIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0SUQ6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRDTEFTUzogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRUQUc6IG5ldyBSZWdFeHAoIFwiXihcIiArIGlkZW50aWZpZXIgKyBcInxbKl0pXCIgKSxcblx0XHRBVFRSOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRQU0VVRE86IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdENISUxEOiBuZXcgUmVnRXhwKFxuXHRcdFx0XCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICtcblx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICtcblx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdGJvb2w6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0bmVlZHNDb250ZXh0OiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cblx0Ly8gQ1NTIGVzY2FwZXNcblx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXFtcXFxcZGEtZkEtRl17MSw2fVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCI/fFxcXFxcXFxcKFteXFxcXHJcXFxcblxcXFxmXSlcIiwgXCJnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIGVzY2FwZSwgbm9uSGV4ICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlLnNsaWNlKCAxICkgLSAweDEwMDAwO1xuXG5cdFx0aWYgKCBub25IZXggKSB7XG5cblx0XHRcdC8vIFN0cmlwIHRoZSBiYWNrc2xhc2ggcHJlZml4IGZyb20gYSBub24taGV4IGVzY2FwZSBzZXF1ZW5jZVxuXHRcdFx0cmV0dXJuIG5vbkhleDtcblx0XHR9XG5cblx0XHQvLyBSZXBsYWNlIGEgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIHdpdGggdGhlIGVuY29kZWQgVW5pY29kZSBjb2RlIHBvaW50XG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMStcblx0XHQvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSwgbWFudWFsbHkgY29uc3RydWN0IGFcblx0XHQvLyBzdXJyb2dhdGUgcGFpclxuXHRcdHJldHVybiBoaWdoIDwgMCA/XG5cdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIFVzZWQgZm9yIGlmcmFtZXM7IHNlZSBgc2V0RG9jdW1lbnRgLlxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRS9FZGdlLlxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRpbkRpc2FibGVkRmllbGRzZXQgPSBhZGRDb21iaW5hdG9yKFxuXHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgbm9kZU5hbWUoIGVsZW0sIFwiZmllbGRzZXRcIiApO1xuXHRcdH0sXG5cdFx0eyBkaXI6IFwicGFyZW50Tm9kZVwiLCBuZXh0OiBcImxlZ2VuZFwiIH1cblx0KTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIEFjY2Vzc2luZyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiB0aHJvdyB1bmV4cGVjdGVkbHlcbi8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM5M1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0IClcbnRyeSB7XG5cdHB1c2guYXBwbHkoXG5cdFx0KCBhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApICksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wXG5cdC8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHlcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7XG5cdFx0YXBwbHk6IGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHB1c2hOYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbCggZWxzICkgKTtcblx0XHR9LFxuXHRcdGNhbGw6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0XHRwdXNoTmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApICk7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBmaW5kKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKCBtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKCBtID0gbWF0Y2hbIDEgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0XHRwdXNoLmNhbGwoIHJlc3VsdHMsIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFbGVtZW50IGNvbnRleHRcblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAmJiAoIGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkgKSAmJlxuXHRcdFx0XHRcdFx0XHRmaW5kLmNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRwdXNoLmNhbGwoIHJlc3VsdHMsIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbIDIgXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKCBtID0gbWF0Y2hbIDMgXSApICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggIW5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoICFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApICkgKSB7XG5cblx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cblx0XHRcdFx0Ly8gcVNBIGNvbnNpZGVycyBlbGVtZW50cyBvdXRzaWRlIGEgc2NvcGluZyByb290IHdoZW4gZXZhbHVhdGluZyBjaGlsZCBvclxuXHRcdFx0XHQvLyBkZXNjZW5kYW50IGNvbWJpbmF0b3JzLCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LlxuXHRcdFx0XHQvLyBJbiBzdWNoIGNhc2VzLCB3ZSB3b3JrIGFyb3VuZCB0aGUgYmVoYXZpb3IgYnkgcHJlZml4aW5nIGV2ZXJ5IHNlbGVjdG9yIGluIHRoZVxuXHRcdFx0XHQvLyBsaXN0IHdpdGggYW4gSUQgc2VsZWN0b3IgcmVmZXJlbmNpbmcgdGhlIHNjb3BlIGNvbnRleHQuXG5cdFx0XHRcdC8vIFRoZSB0ZWNobmlxdWUgaGFzIHRvIGJlIHVzZWQgYXMgd2VsbCB3aGVuIGEgbGVhZGluZyBjb21iaW5hdG9yIGlzIHVzZWRcblx0XHRcdFx0Ly8gYXMgc3VjaCBzZWxlY3RvcnMgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHF1ZXJ5U2VsZWN0b3JBbGwuXG5cdFx0XHRcdC8vIFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGlzIHRlY2huaXF1ZS5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggcmRlc2NlbmQudGVzdCggc2VsZWN0b3IgKSB8fCBybGVhZGluZ0NvbWJpbmF0b3IudGVzdCggc2VsZWN0b3IgKSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gV2UgY2FuIHVzZSA6c2NvcGUgaW5zdGVhZCBvZiB0aGUgSUQgaGFjayBpZiB0aGUgYnJvd3NlclxuXHRcdFx0XHRcdC8vIHN1cHBvcnRzIGl0ICYgaWYgd2UncmUgbm90IGNoYW5naW5nIHRoZSBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW5cblx0XHRcdFx0XHQvLyBzdHJpY3QtY29tcGFyaW5nIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICE9IGNvbnRleHQgfHwgIXN1cHBvcnQuc2NvcGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0XHRpZiAoICggbmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApICkgKSB7XG5cdFx0XHRcdFx0XHRcdG5pZCA9IGpRdWVyeS5lc2NhcGVTZWxlY3RvciggbmlkICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAoIG5pZCA9IGV4cGFuZG8gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzWyBpIF0gPSAoIG5pZCA/IFwiI1wiICsgbmlkIDogXCI6c2NvcGVcIiApICsgXCIgXCIgK1xuXHRcdFx0XHRcdFx0XHR0b1NlbGVjdG9yKCBncm91cHNbIGkgXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbUNTUywgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXNcblx0XHQvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2lzc3Vlcy8xNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoIGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUgKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBqUXVlcnkgc2VsZWN0b3IgbW9kdWxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGVsICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblxuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXG5cdFx0Ly8gcmVsZWFzZSBtZW1vcnkgaW4gSUVcblx0XHRlbCA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApIHx8IG5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICkgKSAmJlxuXHRcdFx0ZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExK1xuXHRcdFx0XHQvLyBVc2UgdGhlIGlzRGlzYWJsZWQgc2hvcnRjdXQgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGRpc2FibGVkIGZpZWxkc2V0IGFuY2VzdG9yc1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pc0Rpc2FibGVkID09PSBkaXNhYmxlZCB8fFxuXG5cdFx0XHRcdFx0Ly8gV2hlcmUgdGhlcmUgaXMgbm8gaXNEaXNhYmxlZCwgY2hlY2sgbWFudWFsbHlcblx0XHRcdFx0XHRlbGVtLmlzRGlzYWJsZWQgIT09ICFkaXNhYmxlZCAmJlxuXHRcdFx0XHRcdFx0aW5EaXNhYmxlZEZpZWxkc2V0KCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBhcmd1bWVudCApIHtcblx0XHRhcmd1bWVudCA9ICthcmd1bWVudDtcblx0XHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoIGogPSBtYXRjaEluZGV4ZXNbIGkgXSApIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFsgaiBdID0gISggbWF0Y2hlc1sgaiBdID0gc2VlZFsgaiBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0gKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgYSBub2RlIGZvciB2YWxpZGl0eSBhcyBhIGpRdWVyeSBzZWxlY3RvciBjb250ZXh0XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dFxuICogQHJldHVybnMge0VsZW1lbnR8T2JqZWN0fEJvb2xlYW59IFRoZSBpbnB1dCBub2RlIGlmIGFjY2VwdGFibGUsIG90aGVyd2lzZSBhIGZhbHN5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkge1xuXHRyZXR1cm4gY29udGV4dCAmJiB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb250ZXh0O1xufVxuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW25vZGVdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKi9cbmZ1bmN0aW9uIHNldERvY3VtZW50KCBub2RlICkge1xuXHR2YXIgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoIGRvYyA9PSBkb2N1bWVudCB8fCBkb2Mubm9kZVR5cGUgIT09IDkgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQgKSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50O1xuXHR9XG5cblx0Ly8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXNcblx0ZG9jdW1lbnQgPSBkb2M7XG5cdGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhalF1ZXJ5LmlzWE1MRG9jKCBkb2N1bWVudCApO1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA3IG9ubHksIElFIDkgLSAxMStcblx0Ly8gT2xkZXIgYnJvd3NlcnMgZGlkbid0IHN1cHBvcnQgdW5wcmVmaXhlZCBgbWF0Y2hlc2AuXG5cdG1hdGNoZXMgPSBkb2N1bWVudEVsZW1lbnQubWF0Y2hlcyB8fFxuXHRcdGRvY3VtZW50RWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2N1bWVudEVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3I7XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxMiAtIDE4K1xuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnNcblx0Ly8gKHNlZSB0cmFjLTEzOTM2KS5cblx0Ly8gTGltaXQgdGhlIGZpeCB0byBJRSAmIEVkZ2UgTGVnYWN5OyBkZXNwaXRlIEVkZ2UgMTUrIGltcGxlbWVudGluZyBgbWF0Y2hlc2AsXG5cdC8vIGFsbCBJRSA5KyBhbmQgRWRnZSBMZWdhY3kgdmVyc2lvbnMgaW1wbGVtZW50IGBtc01hdGNoZXNTZWxlY3RvcmAgYXMgd2VsbC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3IgJiZcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0cHJlZmVycmVkRG9jICE9IGRvY3VtZW50ICYmXG5cdFx0KCBzdWJXaW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldyApICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPDEwXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxuXHQvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggZWwgKS5pZCA9IGpRdWVyeS5leHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHxcblx0XHRcdCFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggalF1ZXJ5LmV4cGFuZG8gKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUuXG5cdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRyZXR1cm4gbWF0Y2hlcy5jYWxsKCBlbCwgXCIqXCIgKTtcblx0fSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCtcblx0Ly8gSUUvRWRnZSBkb24ndCBzdXBwb3J0IHRoZSA6c2NvcGUgcHNldWRvLWNsYXNzLlxuXHRzdXBwb3J0LnNjb3BlID0gYXNzZXJ0KCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggXCI6c2NvcGVcIiApO1xuXHR9ICk7XG5cblx0Ly8gU3VwcG9ydDogQ2hyb21lIDEwNSAtIDExMSBvbmx5LCBTYWZhcmkgMTUuNCAtIDE2LjMgb25seVxuXHQvLyBNYWtlIHN1cmUgdGhlIGA6aGFzKClgIGFyZ3VtZW50IGlzIHBhcnNlZCB1bmZvcmdpdmluZ2x5LlxuXHQvLyBXZSBpbmNsdWRlIGAqYCBpbiB0aGUgdGVzdCB0byBkZXRlY3QgYnVnZ3kgaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlXG5cdC8vIF9zZWxlY3RpdmVseV8gZm9yZ2l2aW5nIChzcGVjaWZpY2FsbHkgd2hlbiB0aGUgbGlzdCBpbmNsdWRlcyBhdCBsZWFzdFxuXHQvLyBvbmUgdmFsaWQgc2VsZWN0b3IpLlxuXHQvLyBOb3RlIHRoYXQgd2UgdHJlYXQgY29tcGxldGUgbGFjayBvZiBzdXBwb3J0IGZvciBgOmhhcygpYCBhcyBpZiBpdCB3ZXJlXG5cdC8vIHNwZWMtY29tcGxpYW50IHN1cHBvcnQsIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSB1c2Ugb2YgYDpoYXMoKWAgaW4gc3VjaFxuXHQvLyBlbnZpcm9ubWVudHMgd2lsbCBmYWlsIGluIHRoZSBxU0EgcGF0aCBhbmQgZmFsbCBiYWNrIHRvIGpRdWVyeSB0cmF2ZXJzYWxcblx0Ly8gYW55d2F5LlxuXHRzdXBwb3J0LmNzc0hhcyA9IGFzc2VydCggZnVuY3Rpb24oKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIFwiOmhhcygqLDpqcWZha2UpXCIgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fSApO1xuXG5cdC8vIElEIGZpbHRlciBhbmQgZmluZFxuXHRpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHtcblx0XHRFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0RXhwci5maW5kLklEID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlci5JRCA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaSwgZWxlbXMsXG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0Ly8gVmVyaWZ5IHRoZSBpZCBhdHRyaWJ1dGVcblx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHRcdHZhciBpbnB1dDtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggZWwgKS5pbm5lckhUTUwgPVxuXHRcdFx0XCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+XCIgK1xuXHRcdFx0XCI8c2VsZWN0IGlkPSdcIiArIGV4cGFuZG8gKyBcIi1cXHJcXFxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPlwiICtcblx0XHRcdFwiPG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcblxuXHRcdC8vIFN1cHBvcnQ6IGlPUyA8PTcgLSA4IG9ubHlcblx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kIFwidmFsdWVcIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5IGluIHNvbWUgWE1MIGRvY3VtZW50c1xuXHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW3NlbGVjdGVkXVwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgPD03IC0gOCBvbmx5XG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbaWR+PVwiICsgZXhwYW5kbyArIFwiLV1cIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIn49XCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBpT1MgOCBvbmx5XG5cdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmxpbmctY29tYmluYXRvciBzZWxlY3RvcmAgZmFpbHNcblx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiLiMuK1srfl1cIiApO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTEwNSssIEZpcmVmb3ggPD0xMDQrLCBTYWZhcmkgPD0xNS40K1xuXHRcdC8vIEluIHNvbWUgb2YgdGhlIGRvY3VtZW50IGtpbmRzLCB0aGVzZSBzZWxlY3RvcnMgd291bGRuJ3Qgd29yayBuYXRpdmVseS5cblx0XHQvLyBUaGlzIGlzIHByb2JhYmx5IE9LIGJ1dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2Ugd2FudCB0byBtYWludGFpblxuXHRcdC8vIGhhbmRsaW5nIHRoZW0gdGhyb3VnaCBqUXVlcnkgdHJhdmVyc2FsIGluIGpRdWVyeSAzLnguXG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCI6Y2hlY2tlZFwiICkubGVuZ3RoICkge1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmNoZWNrZWRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErXG5cdFx0Ly8gSUUncyA6ZGlzYWJsZWQgc2VsZWN0b3IgZG9lcyBub3QgcGljayB1cCB0aGUgY2hpbGRyZW4gb2YgZGlzYWJsZWQgZmllbGRzZXRzXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MTA1KywgRmlyZWZveCA8PTEwNCssIFNhZmFyaSA8PTE1LjQrXG5cdFx0Ly8gSW4gc29tZSBvZiB0aGUgZG9jdW1lbnQga2luZHMsIHRoZXNlIHNlbGVjdG9ycyB3b3VsZG4ndCB3b3JrIG5hdGl2ZWx5LlxuXHRcdC8vIFRoaXMgaXMgcHJvYmFibHkgT0sgYnV0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3ZSB3YW50IHRvIG1haW50YWluXG5cdFx0Ly8gaGFuZGxpbmcgdGhlbSB0aHJvdWdoIGpRdWVyeSB0cmF2ZXJzYWwgaW4galF1ZXJ5IDMueC5cblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbCggXCI6ZGlzYWJsZWRcIiApLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHQvLyBJRSAxMS9FZGdlIGRvbid0IGZpbmQgZWxlbWVudHMgb24gYSBgW25hbWU9JyddYCBxdWVyeSBpbiBzb21lIGNhc2VzLlxuXHRcdC8vIEFkZGluZyBhIHRlbXBvcmFyeSBhdHRyaWJ1dGUgdG8gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgc2VsZWN0aW9uIHdvcmtzXG5cdFx0Ly8gYXJvdW5kIHRoZSBpc3N1ZS5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBJRSAxMCAmIG9sZGVyIGRvbid0IHNlZW0gdG8gaGF2ZSB0aGUgaXNzdWUuXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIlwiICk7XG5cdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbbmFtZT0nJ11cIiApLmxlbmd0aCApIHtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqbmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKj1cIiArXG5cdFx0XHRcdHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdH1cblx0fSApO1xuXG5cdGlmICggIXN1cHBvcnQuY3NzSGFzICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDEwNSAtIDExMCssIFNhZmFyaSAxNS40IC0gMTYuMytcblx0XHQvLyBPdXIgcmVndWxhciBgdHJ5LWNhdGNoYCBtZWNoYW5pc20gZmFpbHMgdG8gZGV0ZWN0IG5hdGl2ZWx5LXVuc3VwcG9ydGVkXG5cdFx0Ly8gcHNldWRvLWNsYXNzZXMgaW5zaWRlIGA6aGFzKClgIChzdWNoIGFzIGA6aGFzKDpjb250YWlucyhcIkZvb1wiKSlgKVxuXHRcdC8vIGluIGJyb3dzZXJzIHRoYXQgcGFyc2UgdGhlIGA6aGFzKClgIGFyZ3VtZW50IGFzIGEgZm9yZ2l2aW5nIHNlbGVjdG9yIGxpc3QuXG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL3NlbGVjdG9ycy8jcmVsYXRpb25hbCBub3cgcmVxdWlyZXMgdGhlIGFyZ3VtZW50XG5cdFx0Ly8gdG8gYmUgcGFyc2VkIHVuZm9yZ2l2aW5nbHksIGJ1dCBicm93c2VycyBoYXZlIG5vdCB5ZXQgZnVsbHkgYWRqdXN0ZWQuXG5cdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmhhc1wiICk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCBcInxcIiApICk7XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCAhc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlICkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRmaW5kLmNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGEgKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT0gcHJlZmVycmVkRG9jICYmXG5cdFx0XHRcdGZpbmQuY29udGFpbnMoIHByZWZlcnJlZERvYywgYiApICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YuY2FsbCggc29ydElucHV0LCBhICkgLSBpbmRleE9mLmNhbGwoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59XG5cbmZpbmQubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIGZpbmQoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5maW5kLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHRzZXREb2N1bWVudCggZWxlbSApO1xuXG5cdGlmICggZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblxuXHRcdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBleHByLCB0cnVlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZpbmQoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5maW5kLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuXG5maW5kLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblxuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIHRyYWMtMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRpZiAoIHZhbCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcbn07XG5cbmZpbmQuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0Ly9cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCtcblx0Ly8gVGVzdGluZyBmb3IgZGV0ZWN0aW5nIGR1cGxpY2F0ZXMgaXMgdW5wcmVkaWN0YWJsZSBzbyBpbnN0ZWFkIGFzc3VtZSB3ZSBjYW4ndFxuXHQvLyBkZXBlbmQgb24gZHVwbGljYXRlIGRldGVjdGlvbiBpbiBhbGwgYnJvd3NlcnMgd2l0aG91dCBhIHN0YWJsZSBzb3J0LlxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5zb3J0U3RhYmxlO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHNsaWNlLmNhbGwoIHJlc3VsdHMsIDAgKTtcblx0c29ydC5jYWxsKCByZXN1bHRzLCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoICggZWxlbSA9IHJlc3VsdHNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHNwbGljZS5jYWxsKCByZXN1bHRzLCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbmpRdWVyeS5mbi51bmlxdWVTb3J0ID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZVNvcnQoIHNsaWNlLmFwcGx5KCB0aGlzICkgKSApO1xufTtcblxuRXhwciA9IGpRdWVyeS5leHByID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdEFUVFI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWyAxIF0gPSBtYXRjaFsgMSBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFsgMyBdID0gKCBtYXRjaFsgMyBdIHx8IG1hdGNoWyA0IF0gfHwgbWF0Y2hbIDUgXSB8fCBcIlwiIClcblx0XHRcdFx0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbIDIgXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFsgMyBdID0gXCIgXCIgKyBtYXRjaFsgMyBdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRDSElMRDogZnVuY3Rpb24oIG1hdGNoICkge1xuXG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbIDEgXSA9IG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsgMSBdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbIDMgXSApIHtcblx0XHRcdFx0XHRmaW5kLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFsgNCBdID0gKyggbWF0Y2hbIDQgXSA/XG5cdFx0XHRcdFx0bWF0Y2hbIDUgXSArICggbWF0Y2hbIDYgXSB8fCAxICkgOlxuXHRcdFx0XHRcdDIgKiAoIG1hdGNoWyAzIF0gPT09IFwiZXZlblwiIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRtYXRjaFsgNSBdID0gKyggKCBtYXRjaFsgNyBdICsgbWF0Y2hbIDggXSApIHx8IG1hdGNoWyAzIF0gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRmaW5kLmVycm9yKCBtYXRjaFsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0UFNFVURPOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFsgNiBdICYmIG1hdGNoWyAyIF07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByLkNISUxELnRlc3QoIG1hdGNoWyAwIF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWyAzIF0gKSB7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSBtYXRjaFsgNCBdIHx8IG1hdGNoWyA1IF0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdCggZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkgKSAmJlxuXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoIGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWyAwIF0gPSBtYXRjaFsgMCBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbIDIgXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRUQUc6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIGV4cGVjdGVkTm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBlbGVtLCBleHBlY3RlZE5vZGVOYW1lICk7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdENMQVNTOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQoIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgY2xhc3NOYW1lICtcblx0XHRcdFx0XHRcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkgKSAmJlxuXHRcdFx0XHRjbGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoXG5cdFx0XHRcdFx0XHR0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHxcblx0XHRcdFx0XHRcdFx0dHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8XG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9ICk7XG5cdFx0fSxcblxuXHRcdEFUVFI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBmaW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCI9XCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gY2hlY2s7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCIhPVwiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgIT09IGNoZWNrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiXj1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCIqPVwiICkge1xuXHRcdFx0XHRcdHJldHVybiBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwiJD1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggb3BlcmF0b3IgPT09IFwifj1cIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiIClcblx0XHRcdFx0XHRcdC5pbmRleE9mKCBjaGVjayApID4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBvcGVyYXRvciA9PT0gXCJ8PVwiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0Q0hJTEQ6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBfYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBub2RlWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlTmFtZSggbm9kZSwgbmFtZSApIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gcGFyZW50WyBleHBhbmRvIF0gfHwgKCBwYXJlbnRbIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gb3V0ZXJDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdCggZGlmZiA9IG5vZGVJbmRleCA9IDAgKSB8fCBzdGFydC5wb3AoKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoIGVsZW1bIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSBvdXRlckNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoIGRpZmYgPSBub2RlSW5kZXggPSAwICkgfHwgc3RhcnQucG9wKCkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGVOYW1lKCBub2RlLCBuYW1lICkgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0UFNFVURPOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblxuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0ZmluZC5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIGpRdWVyeSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZi5jYWxsKCBzZWVkLCBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbIGkgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblxuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdG5vdDogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSB1bm1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpIF0gPSAhKCBtYXRjaGVzWyBpIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50XG5cdFx0XHRcdFx0Ly8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9pc3N1ZXMvMjk5KVxuXHRcdFx0XHRcdGlucHV0WyAwIF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRoYXM6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZmluZCggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHRjb250YWluczogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgalF1ZXJ5LnRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9ICksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRsYW5nOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KCBsYW5nIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0ZmluZC5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcInhtbDpsYW5nXCIgKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSggXCJsYW5nXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKCBlbGVtID0gZWxlbS5wYXJlbnROb2RlICkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHR0YXJnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdHJvb3Q6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50RWxlbWVudDtcblx0XHR9LFxuXG5cdFx0Zm9jdXM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiZcblx0XHRcdFx0ZG9jdW1lbnQuaGFzRm9jdXMoKSAmJlxuXHRcdFx0XHQhISggZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCApO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRlbmFibGVkOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRkaXNhYmxlZDogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSxcblxuXHRcdGNoZWNrZWQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0cmV0dXJuICggbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmICEhZWxlbS5jaGVja2VkICkgfHxcblx0XHRcdFx0KCBub2RlTmFtZSggZWxlbSwgXCJvcHRpb25cIiApICYmICEhZWxlbS5zZWxlY3RlZCApO1xuXHRcdH0sXG5cblx0XHRzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTErXG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhlIHNlbGVjdGVkSW5kZXggcHJvcGVydHlcblx0XHRcdC8vIGZvcmNlcyB0aGUgYnJvd3NlciB0byB0cmVhdCB0aGUgZGVmYXVsdCBvcHRpb24gYXNcblx0XHRcdC8vIHNlbGVjdGVkIHdoZW4gaW4gYW4gb3B0Z3JvdXAuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0ZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3MuZW1wdHkoIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdGhlYWRlcjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdGlucHV0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0YnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8XG5cdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICk7XG5cdFx0fSxcblxuXHRcdHRleHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICYmIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8MTAgb25seVxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyXG5cdFx0XHRcdC8vIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoICggYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICkgPT0gbnVsbCB8fFxuXHRcdFx0XHRcdGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdGZpcnN0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9ICksXG5cblx0XHRsYXN0OiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0gKSxcblxuXHRcdGVxOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9ICksXG5cblx0XHRldmVuOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0b2RkOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0bHQ6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaTtcblxuXHRcdFx0aWYgKCBhcmd1bWVudCA8IDAgKSB7XG5cdFx0XHRcdGkgPSBhcmd1bWVudCArIGxlbmd0aDtcblx0XHRcdH0gZWxzZSBpZiAoIGFyZ3VtZW50ID4gbGVuZ3RoICkge1xuXHRcdFx0XHRpID0gbGVuZ3RoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aSA9IGFyZ3VtZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0Z3Q6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3MubnRoID0gRXhwci5wc2V1ZG9zLmVxO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbmZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKCBtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApICkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWyAwIF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKCB0b2tlbnMgPSBbXSApICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoICggbWF0Y2ggPSBybGVhZGluZ0NvbWJpbmF0b3IuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbIDAgXS5yZXBsYWNlKCBydHJpbUNTUywgXCIgXCIgKVxuXHRcdFx0fSApO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKCBtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkgKSAmJiAoICFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KCBtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSApICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRpZiAoIHBhcnNlT25seSApIHtcblx0XHRyZXR1cm4gc29GYXIubGVuZ3RoO1xuXHR9XG5cblx0cmV0dXJuIHNvRmFyID9cblx0XHRmaW5kLmVycm9yKCBzZWxlY3RvciApIDpcblxuXHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn1cblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1sgaSBdLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKCBlbGVtWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgbm9kZU5hbWUoIGVsZW0sIHNraXAgKSApIHtcblx0XHRcdFx0XHRcdFx0ZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCAoIG9sZENhY2hlID0gb3V0ZXJDYWNoZVsga2V5IF0gKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAoIG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAoIG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICkge1xuXHRyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBpID0gbWF0Y2hlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggIW1hdGNoZXJzWyBpIF0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbIDAgXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRmaW5kKCBzZWxlY3RvciwgY29udGV4dHNbIGkgXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkge1xuXHRcdHZhciB0ZW1wLCBpLCBlbGVtLCBtYXRjaGVyT3V0LFxuXHRcdFx0cHJlTWFwID0gW10sXG5cdFx0XHRwb3N0TWFwID0gW10sXG5cdFx0XHRwcmVleGlzdGluZyA9IHJlc3VsdHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBHZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dFxuXHRcdFx0ZWxlbXMgPSBzZWVkIHx8XG5cdFx0XHRcdG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yIHx8IFwiKlwiLFxuXHRcdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXM7XG5cblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyXG5cdFx0XHQvLyBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0bWF0Y2hlck91dCA9IHBvc3RGaW5kZXIgfHwgKCBzZWVkID8gcHJlRmlsdGVyIDogcHJlZXhpc3RpbmcgfHwgcG9zdEZpbHRlciApID9cblxuXHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdC8vIC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseVxuXHRcdFx0XHRyZXN1bHRzO1xuXG5cdFx0XHQvLyBGaW5kIHByaW1hcnkgbWF0Y2hlc1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXJJbjtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICggZWxlbSA9IHRlbXBbIGkgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXJPdXRbIHBvc3RNYXBbIGkgXSBdID0gISggbWF0Y2hlckluWyBwb3N0TWFwWyBpIF0gXSA9IGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggc2VlZCApIHtcblx0XHRcdGlmICggcG9zdEZpbmRlciB8fCBwcmVGaWx0ZXIgKSB7XG5cdFx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblxuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IG1hdGNoZXJPdXRbIGkgXSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKCBtYXRjaGVySW5bIGkgXSA9IGVsZW0gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCAoIG1hdGNoZXJPdXQgPSBbXSApLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSAmJlxuXHRcdFx0XHRcdFx0KCB0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YuY2FsbCggc2VlZCwgZWxlbSApIDogcHJlTWFwWyBpIF0gKSA+IC0xICkge1xuXG5cdFx0XHRcdFx0XHRzZWVkWyB0ZW1wIF0gPSAhKCByZXN1bHRzWyB0ZW1wIF0gPSBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBBZGQgZWxlbWVudHMgdG8gcmVzdWx0cywgdGhyb3VnaCBwb3N0RmluZGVyIGlmIGRlZmluZWRcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlck91dCA9IGNvbmRlbnNlKFxuXHRcdFx0XHRtYXRjaGVyT3V0ID09PSByZXN1bHRzID9cblx0XHRcdFx0XHRtYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOlxuXHRcdFx0XHRcdG1hdGNoZXJPdXRcblx0XHRcdCk7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIHJlc3VsdHMsIG1hdGNoZXJPdXQsIHhtbCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgbWF0Y2hlck91dCApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAwIF0udHlwZSBdLFxuXHRcdGltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsgXCIgXCIgXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoXG5cdFx0XHRcdCggY2hlY2tDb250ZXh0ID0gY29udGV4dCApLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50XG5cdFx0XHQvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL2lzc3Vlcy8yOTkpXG5cdFx0XHRjaGVja0NvbnRleHQgPSBudWxsO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9IF07XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoIG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGkgXS50eXBlIF0gKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKCBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlciApIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zWyBpIF0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbIGkgXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHQvLyBGaW5kIHRoZSBuZXh0IHJlbGF0aXZlIG9wZXJhdG9yIChpZiBhbnkpIGZvciBwcm9wZXIgaGFuZGxpbmdcblx0XHRcdFx0aiA9ICsraTtcblx0XHRcdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIGogXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3RvcihcblxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKVxuXHRcdFx0XHRcdFx0XHQuY29uY2F0KCB7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gXCIgXCIgPyBcIipcIiA6IFwiXCIgfSApXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbUNTUywgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAoIHRva2VucyA9IHRva2Vucy5zbGljZSggaiApICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7XG5cdHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0YnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0c3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkge1xuXHRcdFx0dmFyIGVsZW0sIGosIG1hdGNoZXIsXG5cdFx0XHRcdG1hdGNoZWRDb3VudCA9IDAsXG5cdFx0XHRcdGkgPSBcIjBcIixcblx0XHRcdFx0dW5tYXRjaGVkID0gc2VlZCAmJiBbXSxcblx0XHRcdFx0c2V0TWF0Y2hlZCA9IFtdLFxuXHRcdFx0XHRjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCxcblxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kLlRBRyggXCIqXCIsIG91dGVybW9zdCApLFxuXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoIGRpcnJ1bnMgKz0gY29udGV4dEJhY2t1cCA9PSBudWxsID8gMSA6IE1hdGgucmFuZG9tKCkgfHwgMC4xICksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdC8vIElFL0VkZ2Ugc29tZXRpbWVzIHRocm93IGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGVycm9yIHdoZW4gc3RyaWN0LWNvbXBhcmluZ1xuXHRcdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHQgPT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBpT1MgPD03IC0gOSBvbmx5XG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmdcblx0XHRcdC8vIGVsZW1lbnRzIGJ5IGlkLiAoc2VlIHRyYWMtMTQxNDIpXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdFx0XHRpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaGVyID0gZWxlbWVudE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cHVzaC5jYWxsKCByZXN1bHRzLCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblxuXHRcdFx0XHRcdC8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnNcblx0XHRcdFx0XHRpZiAoICggZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0gKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoICggbWF0Y2hlciA9IHNldE1hdGNoZXJzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXIoIHVubWF0Y2hlZCwgc2V0TWF0Y2hlZCwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISggdW5tYXRjaGVkWyBpIF0gfHwgc2V0TWF0Y2hlZFsgaSBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFsgaSBdID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5mdW5jdGlvbiBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblxuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFsgaSBdICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3Rvcixcblx0XHRcdG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufVxuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggalF1ZXJ5J3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBqUXVlcnkgc2VsZWN0b3IgY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbmZ1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKCBzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yICkgKTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBUcnkgdG8gbWluaW1pemUgb3BlcmF0aW9ucyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBzZWxlY3RvciBpbiB0aGUgbGlzdCBhbmQgbm8gc2VlZFxuXHQvLyAodGhlIGxhdHRlciBvZiB3aGljaCBndWFyYW50ZWVzIHVzIGNvbnRleHQpXG5cdGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xuXG5cdFx0Ly8gUmVkdWNlIGNvbnRleHQgaWYgdGhlIGxlYWRpbmcgY29tcG91bmQgc2VsZWN0b3IgaXMgYW4gSURcblx0XHR0b2tlbnMgPSBtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKCB0b2tlbiA9IHRva2Vuc1sgMCBdICkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyAxIF0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmQuSUQoXG5cdFx0XHRcdHRva2VuLm1hdGNoZXNbIDAgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRjb250ZXh0XG5cdFx0XHQpIHx8IFtdIClbIDAgXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHIubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zWyBpIF07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKCB0eXBlID0gdG9rZW4udHlwZSApIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoIGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSApICkge1xuXG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoICggc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1sgMCBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWyAwIF0udHlwZSApICYmXG5cdFx0XHRcdFx0XHR0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpICkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIC0gNC4xK1xuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoIFwiXCIgKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKCBcIlwiICkgPT09IGV4cGFuZG87XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCAtIDQuMStcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblxuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZpZWxkc2V0XCIgKSApICYgMTtcbn0gKTtcblxualF1ZXJ5LmZpbmQgPSBmaW5kO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlID0galF1ZXJ5LnVuaXF1ZVNvcnQ7XG5cbi8vIFRoZXNlIGhhdmUgYWx3YXlzIGJlZW4gcHJpdmF0ZSwgYnV0IHRoZXkgdXNlZCB0byBiZSBkb2N1bWVudGVkIGFzIHBhcnQgb2Zcbi8vIFNpenpsZSBzbyBsZXQncyBtYWludGFpbiB0aGVtIGZvciBub3cgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuZmluZC5jb21waWxlID0gY29tcGlsZTtcbmZpbmQuc2VsZWN0ID0gc2VsZWN0O1xuZmluZC5zZXREb2N1bWVudCA9IHNldERvY3VtZW50O1xuZmluZC50b2tlbml6ZSA9IHRva2VuaXplO1xuXG5maW5kLmVzY2FwZSA9IGpRdWVyeS5lc2NhcGVTZWxlY3RvcjtcbmZpbmQuZ2V0VGV4dCA9IGpRdWVyeS50ZXh0O1xuZmluZC5pc1hNTCA9IGpRdWVyeS5pc1hNTERvYztcbmZpbmQuc2VsZWN0b3JzID0galF1ZXJ5LmV4cHI7XG5maW5kLnN1cHBvcnQgPSBqUXVlcnkuc3VwcG9ydDtcbmZpbmQudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWVTb3J0O1xuXG5cdC8qIGVzbGludC1lbmFibGUgKi9cblxufSApKCk7XG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKHRyYWMtOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKHRyYWMtMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgPSAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIGpRdWVyeSNmaW5kXG5cdFx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBjdXIsIHNlbGVjdG9ycyApICkgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGNoZWQucHVzaCggY3VyICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yIClcblx0XHQpO1xuXHR9XG59ICk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoICggY3VyID0gY3VyWyBkaXIgXSApICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9XG5cdHJldHVybiBjdXI7XG59XG5cbmpRdWVyeS5lYWNoKCB7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiApO1xuXHR9LFxuXHRwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdGlmICggZWxlbS5jb250ZW50RG9jdW1lbnQgIT0gbnVsbCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMStcblx0XHRcdC8vIDxvYmplY3Q+IGVsZW1lbnRzIHdpdGggbm8gYGRhdGFgIGF0dHJpYnV0ZSBoYXMgYW4gb2JqZWN0XG5cdFx0XHQvLyBgY29udGVudERvY3VtZW50YCB3aXRoIGEgYG51bGxgIHByb3RvdHlwZS5cblx0XHRcdGdldFByb3RvKCBlbGVtLmNvbnRlbnREb2N1bWVudCApICkge1xuXG5cdFx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG5cdFx0Ly8gVHJlYXQgdGhlIHRlbXBsYXRlIGVsZW1lbnQgYXMgYSByZWd1bGFyIG9uZSBpbiBicm93c2VycyB0aGF0XG5cdFx0Ly8gZG9uJ3Qgc3VwcG9ydCBpdC5cblx0XHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcblx0XHRcdGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59ICk7XG52YXIgcm5vdGh0bWx3aGl0ZSA9ICggL1teXFx4MjBcXHRcXHJcXG5cXGZdKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gbG9ja2VkIHx8IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0b1R5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QsIG5vVmFsdWUgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUucHJvbWlzZSApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciB0aGVuYWJsZXNcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnRoZW4gKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIG5vbi10aGVuYWJsZXNcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb250cm9sIGByZXNvbHZlYCBhcmd1bWVudHMgYnkgbGV0dGluZyBBcnJheSNzbGljZSBjYXN0IGJvb2xlYW4gYG5vVmFsdWVgIHRvIGludGVnZXI6XG5cdFx0XHQvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApXG5cdFx0XHQvLyAqIHRydWU6IFsgdmFsdWUgXS5zbGljZSggMSApID0+IHJlc29sdmUoKVxuXHRcdFx0cmVzb2x2ZS5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0uc2xpY2UoIG5vVmFsdWUgKSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGNhbGxiYWNrcyxcblx0XHRcdFx0Ly8gLi4uIC50aGVuIGhhbmRsZXJzLCBhcmd1bWVudCBpbmRleCwgW2ZpbmFsIHN0YXRlXVxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSwgMiBdLFxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDAsIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMSwgXCJyZWplY3RlZFwiIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjYXRjaFwiOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2UudGhlbiggbnVsbCwgZm4gKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdHBpcGU6IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIF9pLCB0dXBsZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBNYXAgdHVwbGVzIChwcm9ncmVzcywgZG9uZSwgZmFpbCkgdG8gYXJndW1lbnRzIChkb25lLCBmYWlsLCBwcm9ncmVzcylcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0gaXNGdW5jdGlvbiggZm5zWyB0dXBsZVsgNCBdIF0gKSAmJiBmbnNbIHR1cGxlWyA0IF0gXTtcblxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5wcm9ncmVzcyhmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5ub3RpZnkgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmZhaWwoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVqZWN0IH0pXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5kb25lKCBuZXdEZWZlci5yZXNvbHZlIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmZhaWwoIG5ld0RlZmVyLnJlamVjdCApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0Zm5zID0gbnVsbDtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7XG5cdFx0XHRcdFx0dmFyIG1heERlcHRoID0gMDtcblx0XHRcdFx0XHRmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB0aGF0ID0gdGhpcyxcblx0XHRcdFx0XHRcdFx0XHRhcmdzID0gYXJndW1lbnRzLFxuXHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCwgdGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgZG91YmxlLXJlc29sdXRpb24gYXR0ZW1wdHNcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGVwdGggPCBtYXhEZXB0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCA9IGhhbmRsZXIuYXBwbHkoIHRoYXQsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNDhcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggXCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb25cIiApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9ucyAyLjMuMy4xLCAzLjVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU0XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmV0cmlldmUgYHRoZW5gIG9ubHkgb25jZVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhlbiA9IHJldHVybmVkICYmXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuNFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02NFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCB0eXBlb2YgcmV0dXJuZWQgPT09IFwib2JqZWN0XCIgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgcmV0dXJuZWQgPT09IFwiZnVuY3Rpb25cIiApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhIHJldHVybmVkIHRoZW5hYmxlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoZW4gKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTcGVjaWFsIHByb2Nlc3NvcnMgKG5vdGlmeSkganVzdCB3YWl0IGZvciByZXNvbHV0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBOb3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgYWxzbyBob29rIGludG8gcHJvZ3Jlc3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBkaXNyZWdhcmQgb2xkZXIgcmVzb2x1dGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtYXhEZXB0aCsrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGggKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBJZGVudGl0eSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIHJldHVybmVkIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBQcm9jZXNzIHRoZSB2YWx1ZShzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHNwZWNpYWwgfHwgZGVmZXJyZWQucmVzb2x2ZVdpdGggKSggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IG5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBjYXRjaCBhbmQgcmVqZWN0IGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzID0gc3BlY2lhbCA/XG5cdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93IDpcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MuZXJyb3IgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgZXJyb3IsIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0RXJyb3JIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5lcnJvciA9IGpRdWVyeS5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBkZXByZWNhdGVkIGFsaWFzIG9mIHRoZSBhYm92ZS4gV2hpbGUgdGhlIG5hbWUgc3VnZ2VzdHNcblx0XHRcdFx0XHRcdFx0XHQvLyByZXR1cm5pbmcgdGhlIHN0YWNrLCBub3QgYW4gZXJyb3IgaW5zdGFuY2UsIGpRdWVyeSBqdXN0IHBhc3Nlc1xuXHRcdFx0XHRcdFx0XHRcdC8vIGl0IGRpcmVjdGx5IHRvIGBjb25zb2xlLndhcm5gIHNvIGJvdGggd2lsbCB3b3JrOyBhbiBpbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHRcdC8vIGp1c3QgYmV0dGVyIGNvb3BlcmF0ZXMgd2l0aCBzb3VyY2UgbWFwcy5cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5lcnJvciA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBwcmltYXJ5IERlZmVycmVkXG5cdFx0XHRwcmltYXJ5ID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdHByaW1hcnkucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIHByaW1hcnkuZG9uZSggdXBkYXRlRnVuYyggaSApICkucmVzb2x2ZSwgcHJpbWFyeS5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBwcmltYXJ5LnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBwcmltYXJ5LnRoZW4oKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBNdWx0aXBsZSBhcmd1bWVudHMgYXJlIGFnZ3JlZ2F0ZWQgbGlrZSBQcm9taXNlLmFsbCBhcnJheSBlbGVtZW50c1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggcmVzb2x2ZVZhbHVlc1sgaSBdLCB1cGRhdGVGdW5jKCBpICksIHByaW1hcnkucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByaW1hcnkucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG4vLyBJZiBgalF1ZXJ5LkRlZmVycmVkLmdldEVycm9ySG9va2AgaXMgZGVmaW5lZCwgYGFzeW5jRXJyb3JgIGlzIGFuIGVycm9yXG4vLyBjYXB0dXJlZCBiZWZvcmUgdGhlIGFzeW5jIGJhcnJpZXIgdG8gZ2V0IHRoZSBvcmlnaW5hbCBlcnJvciBjYXVzZVxuLy8gd2hpY2ggbWF5IG90aGVyd2lzZSBiZSBoaWRkZW4uXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgYXN5bmNFcnJvciApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsXG5cdFx0XHRlcnJvci5zdGFjaywgYXN5bmNFcnJvciApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgdHJhYy02NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBfa2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBfYWxsLCBsZXR0ZXIgKSB7XG5cdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbn1cblxuLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKHRyYWMtOTU3MilcbmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkge1xuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcbn1cbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlIHRyYWMtODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUgXSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvbiB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKHRyYWMtMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG5cdHZhciBpc0F0dGFjaGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0XHR9LFxuXHRcdGNvbXBvc2VkID0geyBjb21wb3NlZDogdHJ1ZSB9O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSssIEVkZ2UgMTIgLSAxOCssIGlPUyAxMC4wIC0gMTAuMiBvbmx5XG5cdC8vIENoZWNrIGF0dGFjaG1lbnQgYWNyb3NzIHNoYWRvdyBET00gYm91bmRhcmllcyB3aGVuIHBvc3NpYmxlIChnaC0zNTA0KVxuXHQvLyBTdXBwb3J0OiBpT1MgMTAuMC0xMC4yIG9ubHlcblx0Ly8gRWFybHkgaU9TIDEwIHZlcnNpb25zIHN1cHBvcnQgYGF0dGFjaFNoYWRvd2AgYnV0IG5vdCBgZ2V0Um9vdE5vZGVgLFxuXHQvLyBsZWFkaW5nIHRvIGVycm9ycy4gV2UgbmVlZCB0byBjaGVjayBmb3IgYGdldFJvb3ROb2RlYC5cblx0aWYgKCBkb2N1bWVudEVsZW1lbnQuZ2V0Um9vdE5vZGUgKSB7XG5cdFx0aXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRSb290Tm9kZSggY29tcG9zZWQgKSA9PT0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdH07XG5cdH1cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpc0F0dGFjaGVkKCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsIHNjYWxlLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9IGVsZW0ubm9kZVR5cGUgJiZcblx0XHRcdCggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0XHQvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpXG5cdFx0aW5pdGlhbCA9IGluaXRpYWwgLyAyO1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHR3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgYW5kIHVwZGF0ZSBvdXIgYmVzdCBndWVzcyAoZG91YmxpbmcgZ3Vlc3NlcyB0aGF0IHplcm8gb3V0KS5cblx0XHRcdC8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS5cblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblx0XHRcdGlmICggKCAxIC0gc2NhbGUgKSAqICggMSAtICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgfHwgMC41ICkgKSA8PSAwICkge1xuXHRcdFx0XHRtYXhJdGVyYXRpb25zID0gMDtcblx0XHRcdH1cblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cblx0XHR9XG5cblx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAqIDI7XG5cdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG52YXIgZGVmYXVsdERpc3BsYXlNYXAgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7XG5cdHZhciB0ZW1wLFxuXHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCxcblx0XHRub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUsXG5cdFx0ZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdO1xuXG5cdGlmICggZGlzcGxheSApIHtcblx0XHRyZXR1cm4gZGlzcGxheTtcblx0fVxuXG5cdHRlbXAgPSBkb2MuYm9keS5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICkgKTtcblx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsIFwiZGlzcGxheVwiICk7XG5cblx0dGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wICk7XG5cblx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRkaXNwbGF5ID0gXCJibG9ja1wiO1xuXHR9XG5cdGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdID0gZGlzcGxheTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSxcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdC8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZVxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdylcblx0XHRcdC8vIGNoZWNrIGlzIHJlcXVpcmVkIGluIHRoaXMgZmlyc3QgbG9vcCB1bmxlc3Mgd2UgaGF2ZSBhIG5vbmVtcHR5IGRpc3BsYXkgdmFsdWUgKGVpdGhlclxuXHRcdFx0Ly8gaW5saW5lIG9yIGFib3V0LXRvLWJlLXJlc3RvcmVkKVxuXHRcdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApIHx8IG51bGw7XG5cdFx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSApIHtcblx0XHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gXCJub25lXCI7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hhdCB3ZSdyZSBvdmVyd3JpdGluZ1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiZGlzcGxheVwiLCBkaXNwbGF5ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggdmFsdWVzWyBpbmRleCBdICE9IG51bGwgKSB7XG5cdFx0XHRlbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuV2l0aGluVHJlZSggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdGRpdiA9IGZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKSxcblx0XHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHlcblx0Ly8gQ2hlY2sgc3RhdGUgbG9zdCBpZiB0aGUgbmFtZSBpcyBzZXQgKHRyYWMtMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICh0cmFjLTE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSBvbmx5XG5cdC8vIE9sZGVyIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0Ly8gSUUgPD05IHJlcGxhY2VzIDxvcHRpb24+IHRhZ3Mgd2l0aCB0aGVpciBjb250ZW50cyB3aGVuIGluc2VydGVkIG91dHNpZGUgb2Zcblx0Ly8gdGhlIHNlbGVjdCBlbGVtZW50LlxuXHRkaXYuaW5uZXJIVE1MID0gXCI8b3B0aW9uPjwvb3B0aW9uPlwiO1xuXHRzdXBwb3J0Lm9wdGlvbiA9ICEhZGl2Lmxhc3RDaGlsZDtcbn0gKSgpO1xuXG5cbi8vIFdlIGhhdmUgdG8gY2xvc2UgdGhlc2UgdGFncyB0byBzdXBwb3J0IFhIVE1MICh0cmFjLTEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cbi8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5pZiAoICFzdXBwb3J0Lm9wdGlvbiApIHtcblx0d3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uID0gWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdO1xufVxuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAodHJhYy0xNTE1MSlcblx0dmFyIHJldDtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2Uge1xuXHRcdHJldCA9IFtdO1xuXHR9XG5cblx0aWYgKCB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgbm9kZU5hbWUoIGNvbnRleHQsIHRhZyApICkge1xuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cblxuLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkXG5mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7LztcblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBhdHRhY2hlZCwgaixcblx0XHRmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRpZiAoIHRvVHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKHRyYWMtMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGF0dGFjaGVkID0gaXNBdHRhY2hlZCggZWxlbSApO1xuXG5cdFx0Ly8gQXBwZW5kIHRvIGZyYWdtZW50XG5cdFx0dG1wID0gZ2V0QWxsKCBmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApLCBcInNjcmlwdFwiICk7XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0aWYgKCBhdHRhY2hlZCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIHRtcCApO1xuXHRcdH1cblxuXHRcdC8vIENhcHR1cmUgZXhlY3V0YWJsZXNcblx0XHRpZiAoIHNjcmlwdHMgKSB7XG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdG1wWyBqKysgXSApICkge1xuXHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFx0c2NyaXB0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZnJhZ21lbnQ7XG59XG5cblxudmFyIHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gT25seSBhdHRhY2ggZXZlbnRzIHRvIG9iamVjdHMgdGhhdCBhY2NlcHQgZGF0YVxuXHRcdGlmICggIWFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgdGhhdCBpbnZhbGlkIHNlbGVjdG9ycyB0aHJvdyBleGNlcHRpb25zIGF0IGF0dGFjaCB0aW1lXG5cdFx0Ly8gRXZhbHVhdGUgYWdhaW5zdCBkb2N1bWVudEVsZW1lbnQgaW4gY2FzZSBlbGVtIGlzIGEgbm9uLWVsZW1lbnQgbm9kZSAoZS5nLiwgZG9jdW1lbnQpXG5cdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhIHVuaXF1ZSBJRCwgdXNlZCB0byBmaW5kL3JlbW92ZSBpdCBsYXRlclxuXHRcdGlmICggIWhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxuXHRcdGlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgPSBPYmplY3QuY3JlYXRlKCBudWxsICk7XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0dmFyIGksIGosIHJldCwgbWF0Y2hlZCwgaGFuZGxlT2JqLCBoYW5kbGVyUXVldWUsXG5cdFx0XHRhcmdzID0gbmV3IEFycmF5KCBhcmd1bWVudHMubGVuZ3RoICksXG5cblx0XHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApLFxuXG5cdFx0XHRoYW5kbGVycyA9IChcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcImV2ZW50c1wiICkgfHwgT2JqZWN0LmNyZWF0ZSggbnVsbCApXG5cdFx0XHQpWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGUgZXZlbnQgaXMgbmFtZXNwYWNlZCwgdGhlbiBlYWNoIGhhbmRsZXIgaXMgb25seSBpbnZva2VkIGlmIGl0IGlzXG5cdFx0XHRcdC8vIHNwZWNpYWxseSB1bml2ZXJzYWwgb3IgaXRzIG5hbWVzcGFjZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIGV2ZW50J3MuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgaGFuZGxlT2JqLm5hbWVzcGFjZSA9PT0gZmFsc2UgfHxcblx0XHRcdFx0XHRldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycyxcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0ZGVsZWdhdGVDb3VudCA9IGhhbmRsZXJzLmRlbGVnYXRlQ291bnQsXG5cdFx0XHRjdXIgPSBldmVudC50YXJnZXQ7XG5cblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OVxuXHRcdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKHRyYWMtMTMxODApXG5cdFx0XHRjdXIubm9kZVR5cGUgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQyXG5cdFx0XHQvLyBTdXBwcmVzcyBzcGVjLXZpb2xhdGluZyBjbGlja3MgaW5kaWNhdGluZyBhIG5vbi1wcmltYXJ5IHBvaW50ZXIgYnV0dG9uICh0cmFjLTM4NjEpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHQvLyAuLi5idXQgbm90IGFycm93IGtleSBcImNsaWNrc1wiIG9mIHJhZGlvIGlucHV0cywgd2hpY2ggY2FuIGhhdmUgYGJ1dHRvbmAgLTEgKGdoLTIzNDMpXG5cdFx0XHQhKCBldmVudC50eXBlID09PSBcImNsaWNrXCIgJiYgZXZlbnQuYnV0dG9uID49IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICh0cmFjLTEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAodHJhYy02OTExLCB0cmFjLTgxNjUsIHRyYWMtMTEzODIsIHRyYWMtMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBjdXIuZGlzYWJsZWQgPT09IHRydWUgKSApIHtcblx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMgPSBbXTtcblx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzID0ge307XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAodHJhYy0xMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogbWF0Y2hlZEhhbmRsZXJzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0Y3VyID0gdGhpcztcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaGFuZGxlclF1ZXVlO1xuXHR9LFxuXG5cdGFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuXHRcdFx0Z2V0OiBpc0Z1bmN0aW9uKCBob29rICkgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRjbGljazoge1xuXG5cdFx0XHQvLyBVdGlsaXplIG5hdGl2ZSBldmVudCB0byBlbnN1cmUgY29ycmVjdCBzdGF0ZSBmb3IgY2hlY2thYmxlIGlucHV0c1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gQ2xhaW0gdGhlIGZpcnN0IGhhbmRsZXJcblx0XHRcdFx0aWYgKCByY2hlY2thYmxlVHlwZS50ZXN0KCBlbC50eXBlICkgJiZcblx0XHRcdFx0XHRlbC5jbGljayAmJiBub2RlTmFtZSggZWwsIFwiaW5wdXRcIiApICkge1xuXG5cdFx0XHRcdFx0Ly8gZGF0YVByaXYuc2V0KCBlbCwgXCJjbGlja1wiLCAuLi4gKVxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oIGRhdGEgKSB7XG5cblx0XHRcdFx0Ly8gRm9yIG11dHVhbCBjb21wcmVzc2liaWxpdHkgd2l0aCBfZGVmYXVsdCwgcmVwbGFjZSBgdGhpc2AgYWNjZXNzIHdpdGggYSBsb2NhbCB2YXIuXG5cdFx0XHRcdC8vIGB8fCBkYXRhYCBpcyBkZWFkIGNvZGUgbWVhbnQgb25seSB0byBwcmVzZXJ2ZSB0aGUgdmFyaWFibGUgdGhyb3VnaCBtaW5pZmljYXRpb24uXG5cdFx0XHRcdHZhciBlbCA9IHRoaXMgfHwgZGF0YTtcblxuXHRcdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlcmluZyBhIGNsaWNrXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdGxldmVyYWdlTmF0aXZlKCBlbCwgXCJjbGlja1wiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXR1cm4gbm9uLWZhbHNlIHRvIGFsbG93IG5vcm1hbCBldmVudC1wYXRoIHByb3BhZ2F0aW9uXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIHN1cHByZXNzIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0Ly8gQWxzbyBwcmV2ZW50IGl0IGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRyZXR1cm4gcmNoZWNrYWJsZVR5cGUudGVzdCggdGFyZ2V0LnR5cGUgKSAmJlxuXHRcdFx0XHRcdHRhcmdldC5jbGljayAmJiBub2RlTmFtZSggdGFyZ2V0LCBcImlucHV0XCIgKSAmJlxuXHRcdFx0XHRcdGRhdGFQcml2LmdldCggdGFyZ2V0LCBcImNsaWNrXCIgKSB8fFxuXHRcdFx0XHRcdG5vZGVOYW1lKCB0YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gRW5zdXJlIHRoZSBwcmVzZW5jZSBvZiBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGhhbmRsZXMgbWFudWFsbHktdHJpZ2dlcmVkXG4vLyBzeW50aGV0aWMgZXZlbnRzIGJ5IGludGVycnVwdGluZyBwcm9ncmVzcyB1bnRpbCByZWludm9rZWQgaW4gcmVzcG9uc2UgdG9cbi8vICpuYXRpdmUqIGV2ZW50cyB0aGF0IGl0IGZpcmVzIGRpcmVjdGx5LCBlbnN1cmluZyB0aGF0IHN0YXRlIGNoYW5nZXMgaGF2ZVxuLy8gYWxyZWFkeSBvY2N1cnJlZCBiZWZvcmUgb3RoZXIgbGlzdGVuZXJzIGFyZSBpbnZva2VkLlxuZnVuY3Rpb24gbGV2ZXJhZ2VOYXRpdmUoIGVsLCB0eXBlLCBpc1NldHVwICkge1xuXG5cdC8vIE1pc3NpbmcgYGlzU2V0dXBgIGluZGljYXRlcyBhIHRyaWdnZXIgY2FsbCwgd2hpY2ggbXVzdCBmb3JjZSBzZXR1cCB0aHJvdWdoIGpRdWVyeS5ldmVudC5hZGRcblx0aWYgKCAhaXNTZXR1cCApIHtcblx0XHRpZiAoIGRhdGFQcml2LmdldCggZWwsIHR5cGUgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZWwsIHR5cGUsIHJldHVyblRydWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVnaXN0ZXIgdGhlIGNvbnRyb2xsZXIgYXMgYSBzcGVjaWFsIHVuaXZlcnNhbCBoYW5kbGVyIGZvciBhbGwgZXZlbnQgbmFtZXNwYWNlc1xuXHRkYXRhUHJpdi5zZXQoIGVsLCB0eXBlLCBmYWxzZSApO1xuXHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwge1xuXHRcdG5hbWVzcGFjZTogZmFsc2UsXG5cdFx0aGFuZGxlcjogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJlc3VsdCxcblx0XHRcdFx0c2F2ZWQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0aWYgKCAoIGV2ZW50LmlzVHJpZ2dlciAmIDEgKSAmJiB0aGlzWyB0eXBlIF0gKSB7XG5cblx0XHRcdFx0Ly8gSW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgdGhlIG91dGVyIHN5bnRoZXRpYyAudHJpZ2dlcigpZWQgZXZlbnRcblx0XHRcdFx0aWYgKCAhc2F2ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBhcmd1bWVudHMgZm9yIHVzZSB3aGVuIGhhbmRsaW5nIHRoZSBpbm5lciBuYXRpdmUgZXZlbnRcblx0XHRcdFx0XHQvLyBUaGVyZSB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKGFuIGV2ZW50IG9iamVjdCksIHNvIHRoaXMgYXJyYXlcblx0XHRcdFx0XHQvLyB3aWxsIG5vdCBiZSBjb25mdXNlZCB3aXRoIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3QuXG5cdFx0XHRcdFx0c2F2ZWQgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIHR5cGUsIHNhdmVkICk7XG5cblx0XHRcdFx0XHQvLyBUcmlnZ2VyIHRoZSBuYXRpdmUgZXZlbnQgYW5kIGNhcHR1cmUgaXRzIHJlc3VsdFxuXHRcdFx0XHRcdHRoaXNbIHR5cGUgXSgpO1xuXHRcdFx0XHRcdHJlc3VsdCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgZmFsc2UgKTtcblxuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBvdXRlciBzeW50aGV0aWMgZXZlbnRcblx0XHRcdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgZm9yIGFuIGV2ZW50IHdpdGggYSBidWJibGluZyBzdXJyb2dhdGVcblx0XHRcdFx0Ly8gKGZvY3VzIG9yIGJsdXIpLCBhc3N1bWUgdGhhdCB0aGUgc3Vycm9nYXRlIGFscmVhZHkgcHJvcGFnYXRlZCBmcm9tIHRyaWdnZXJpbmdcblx0XHRcdFx0Ly8gdGhlIG5hdGl2ZSBldmVudCBhbmQgcHJldmVudCB0aGF0IGZyb20gaGFwcGVuaW5nIGFnYWluIGhlcmUuXG5cdFx0XHRcdC8vIFRoaXMgdGVjaG5pY2FsbHkgZ2V0cyB0aGUgb3JkZXJpbmcgd3Jvbmcgdy5yLnQuIHRvIGAudHJpZ2dlcigpYCAoaW4gd2hpY2ggdGhlXG5cdFx0XHRcdC8vIGJ1YmJsaW5nIHN1cnJvZ2F0ZSBwcm9wYWdhdGVzICphZnRlciogdGhlIG5vbi1idWJibGluZyBiYXNlKSwgYnV0IHRoYXQgc2VlbXNcblx0XHRcdFx0Ly8gbGVzcyBiYWQgdGhhbiBkdXBsaWNhdGlvbi5cblx0XHRcdFx0fSBlbHNlIGlmICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9ICkuZGVsZWdhdGVUeXBlICkge1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBuYXRpdmUgZXZlbnQgdHJpZ2dlcmVkIGFib3ZlLCBldmVyeXRoaW5nIGlzIG5vdyBpbiBvcmRlclxuXHRcdFx0Ly8gRmlyZSBhbiBpbm5lciBzeW50aGV0aWMgZXZlbnQgd2l0aCB0aGUgb3JpZ2luYWwgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBzYXZlZCApIHtcblxuXHRcdFx0XHQvLyAuLi5hbmQgY2FwdHVyZSB0aGUgcmVzdWx0XG5cdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoXG5cdFx0XHRcdFx0c2F2ZWRbIDAgXSxcblx0XHRcdFx0XHRzYXZlZC5zbGljZSggMSApLFxuXHRcdFx0XHRcdHRoaXNcblx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdC8vIEFib3J0IGhhbmRsaW5nIG9mIHRoZSBuYXRpdmUgZXZlbnQgYnkgYWxsIGpRdWVyeSBoYW5kbGVycyB3aGlsZSBhbGxvd2luZ1xuXHRcdFx0XHQvLyBuYXRpdmUgaGFuZGxlcnMgb24gdGhlIHNhbWUgZWxlbWVudCB0byBydW4uIE9uIHRhcmdldCwgdGhpcyBpcyBhY2hpZXZlZFxuXHRcdFx0XHQvLyBieSBzdG9wcGluZyBpbW1lZGlhdGUgcHJvcGFnYXRpb24ganVzdCBvbiB0aGUgalF1ZXJ5IGV2ZW50LiBIb3dldmVyLFxuXHRcdFx0XHQvLyB0aGUgbmF0aXZlIGV2ZW50IGlzIHJlLXdyYXBwZWQgYnkgYSBqUXVlcnkgb25lIG9uIGVhY2ggbGV2ZWwgb2YgdGhlXG5cdFx0XHRcdC8vIHByb3BhZ2F0aW9uIHNvIHRoZSBvbmx5IHdheSB0byBzdG9wIGl0IGZvciBqUXVlcnkgaXMgdG8gc3RvcCBpdCBmb3Jcblx0XHRcdFx0Ly8gZXZlcnlvbmUgdmlhIG5hdGl2ZSBgc3RvcFByb3BhZ2F0aW9uKClgLiBUaGlzIGlzIG5vdCBhIHByb2JsZW0gZm9yXG5cdFx0XHRcdC8vIGZvY3VzL2JsdXIgd2hpY2ggZG9uJ3QgYnViYmxlLCBidXQgaXQgZG9lcyBhbHNvIHN0b3AgY2xpY2sgb24gY2hlY2tib3hlc1xuXHRcdFx0XHQvLyBhbmQgcmFkaW9zLiBXZSBhY2NlcHQgdGhpcyBsaW1pdGF0aW9uLlxuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0ZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xufVxuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcblx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblxuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50ICkgKSB7XG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIEV2ZW50IG9iamVjdFxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcblx0XHR0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7XG5cdFx0dGhpcy50eXBlID0gc3JjLnR5cGU7XG5cblx0XHQvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuXHRcdC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHxcblx0XHRcdFx0c3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD0yLjMgb25seVxuXHRcdFx0XHRzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlID9cblx0XHRcdHJldHVyblRydWUgOlxuXHRcdFx0cmV0dXJuRmFsc2U7XG5cblx0XHQvLyBDcmVhdGUgdGFyZ2V0IHByb3BlcnRpZXNcblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgPD02IC0gNyBvbmx5XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKHRyYWMtNTA0LCB0cmFjLTEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y29kZTogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cdHdoaWNoOiB0cnVlXG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG5qUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggdHlwZSwgZGVsZWdhdGVUeXBlICkge1xuXG5cdGZ1bmN0aW9uIGZvY3VzTWFwcGVkSGFuZGxlciggbmF0aXZlRXZlbnQgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExK1xuXHRcdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGZvY3VzaW4vZm9jdXNvdXQgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50c1xuXHRcdFx0Ly8gZm9jdXMvYmx1ci4gVGhpcyBpcyBiZWNhdXNlIHRoZSBmb3JtZXIgYXJlIHN5bmNocm9ub3VzIGluIElFIHdoaWxlIHRoZSBsYXR0ZXJcblx0XHRcdC8vIGFyZSBhc3luYy4gSW4gb3RoZXIgYnJvd3NlcnMsIGFsbCB0aG9zZSBoYW5kbGVycyBhcmUgaW52b2tlZCBzeW5jaHJvbm91c2x5LlxuXG5cdFx0XHQvLyBgaGFuZGxlYCBmcm9tIHByaXZhdGUgZGF0YSB3b3VsZCBhbHJlYWR5IHdyYXAgdGhlIGV2ZW50LCBidXQgd2UgbmVlZFxuXHRcdFx0Ly8gdG8gY2hhbmdlIHRoZSBgdHlwZWAgaGVyZS5cblx0XHRcdHZhciBoYW5kbGUgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiaGFuZGxlXCIgKSxcblx0XHRcdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApO1xuXHRcdFx0ZXZlbnQudHlwZSA9IG5hdGl2ZUV2ZW50LnR5cGUgPT09IFwiZm9jdXNpblwiID8gXCJmb2N1c1wiIDogXCJibHVyXCI7XG5cdFx0XHRldmVudC5pc1NpbXVsYXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIEZpcnN0LCBoYW5kbGUgZm9jdXNpbi9mb2N1c291dFxuXHRcdFx0aGFuZGxlKCBuYXRpdmVFdmVudCApO1xuXG5cdFx0XHQvLyAuLi50aGVuLCBoYW5kbGUgZm9jdXMvYmx1clxuXHRcdFx0Ly9cblx0XHRcdC8vIGZvY3VzL2JsdXIgZG9uJ3QgYnViYmxlIHdoaWxlIGZvY3VzaW4vZm9jdXNvdXQgZG87IHNpbXVsYXRlIHRoZSBmb3JtZXIgYnkgb25seVxuXHRcdFx0Ly8gaW52b2tpbmcgdGhlIGhhbmRsZXIgYXQgdGhlIGxvd2VyIGxldmVsLlxuXHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIHNldHVwIHBhcnQgY2FsbHMgYGxldmVyYWdlTmF0aXZlYCwgd2hpY2gsIGluIHR1cm4sIGNhbGxzXG5cdFx0XHRcdC8vIGBqUXVlcnkuZXZlbnQuYWRkYCwgc28gZXZlbnQgaGFuZGxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gc2V0XG5cdFx0XHRcdC8vIGJ5IHRoaXMgcG9pbnQuXG5cdFx0XHRcdGhhbmRsZSggZXZlbnQgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3Igbm9uLUlFIGJyb3dzZXJzLCBhdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50XG5cdFx0XHQvLyB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQuXG5cdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGRlbGVnYXRlVHlwZSwgbmF0aXZlRXZlbnQudGFyZ2V0LFxuXHRcdFx0XHRqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApICk7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSA9IHtcblxuXHRcdC8vIFV0aWxpemUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0dmFyIGF0dGFjaGVzO1xuXG5cdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImZvY3VzXCIsIC4uLiApXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiYmx1clwiLCAuLi4gKVxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUsIHRydWUgKTtcblxuXHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExK1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIHNhbWUgbmF0aXZlIGhhbmRsZXIgZm9yIGZvY3VzaW4gJiBmb2N1cyAoYW5kIGZvY3Vzb3V0ICYgYmx1cilcblx0XHRcdFx0Ly8gc28gd2UgbmVlZCB0byBjb29yZGluYXRlIHNldHVwICYgdGVhcmRvd24gcGFydHMgYmV0d2VlbiB0aG9zZSBldmVudHMuXG5cdFx0XHRcdC8vIFVzZSBgZGVsZWdhdGVUeXBlYCBhcyB0aGUga2V5IGFzIGB0eXBlYCBpcyBhbHJlYWR5IHVzZWQgYnkgYGxldmVyYWdlTmF0aXZlYC5cblx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIGRlbGVnYXRlVHlwZSApO1xuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIGRlbGVnYXRlVHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBkZWxlZ2F0ZVR5cGUsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gYWxsb3cgbm9ybWFsIHByb2Nlc3NpbmcgaW4gdGhlIGNhbGxlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJcblx0XHRcdGxldmVyYWdlTmF0aXZlKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdC8vIFJldHVybiBub24tZmFsc2UgdG8gYWxsb3cgbm9ybWFsIGV2ZW50LXBhdGggcHJvcGFnYXRpb25cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgYXR0YWNoZXM7XG5cblx0XHRcdGlmICggZG9jdW1lbnQuZG9jdW1lbnRNb2RlICkge1xuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggdGhpcywgZGVsZWdhdGVUeXBlICkgLSAxO1xuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIGRlbGVnYXRlVHlwZSwgZm9jdXNNYXBwZWRIYW5kbGVyICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCB0aGlzLCBkZWxlZ2F0ZVR5cGUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIHRoaXMsIGRlbGVnYXRlVHlwZSwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgc3RhbmRhcmQgdGVhcmRvd24gc2hvdWxkIGJlIGFwcGxpZWRcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBTdXBwcmVzcyBuYXRpdmUgZm9jdXMgb3IgYmx1ciBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlXG5cdFx0Ly8gYSBsZXZlcmFnZWQgbmF0aXZlLWV2ZW50IHN0YWNrXG5cdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGV2ZW50LnRhcmdldCwgdHlwZSApO1xuXHRcdH0sXG5cblx0XHRkZWxlZ2F0ZVR5cGU6IGRlbGVnYXRlVHlwZVxuXHR9O1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuXHQvLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG5cdC8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njg3Nzg3XG5cdC8vXG5cdC8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuXHQvLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcblx0Ly8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG5cdC8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5cdC8vXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0Ly8gVG8gcHJlc2VydmUgcmVsYXRpdmUgZm9jdXNpbi9mb2N1cyAmIGZvY3Vzb3V0L2JsdXIgZXZlbnQgb3JkZXIgZ3VhcmFudGVlZCBvbiB0aGUgMy54IGJyYW5jaCxcblx0Ly8gYXR0YWNoIGEgc2luZ2xlIGhhbmRsZXIgZm9yIGJvdGggZXZlbnRzIGluIElFLlxuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZGVsZWdhdGVUeXBlIF0gPSB7XG5cdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBIYW5kbGU6IHJlZ3VsYXIgbm9kZXMgKHZpYSBgdGhpcy5vd25lckRvY3VtZW50YCksIHdpbmRvd1xuXHRcdFx0Ly8gKHZpYSBgdGhpcy5kb2N1bWVudGApICYgZG9jdW1lbnQgKHZpYSBgdGhpc2ApLlxuXHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdGRhdGFIb2xkZXIgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyB0aGlzIDogZG9jLFxuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMStcblx0XHRcdC8vIFdlIHVzZSB0aGUgc2FtZSBuYXRpdmUgaGFuZGxlciBmb3IgZm9jdXNpbiAmIGZvY3VzIChhbmQgZm9jdXNvdXQgJiBibHVyKVxuXHRcdFx0Ly8gc28gd2UgbmVlZCB0byBjb29yZGluYXRlIHNldHVwICYgdGVhcmRvd24gcGFydHMgYmV0d2VlbiB0aG9zZSBldmVudHMuXG5cdFx0XHQvLyBVc2UgYGRlbGVnYXRlVHlwZWAgYXMgdGhlIGtleSBhcyBgdHlwZWAgaXMgYWxyZWFkeSB1c2VkIGJ5IGBsZXZlcmFnZU5hdGl2ZWAuXG5cdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5hZGRFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRvYy5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBmb2N1c01hcHBlZEhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YVByaXYuc2V0KCBkYXRhSG9sZGVyLCBkZWxlZ2F0ZVR5cGUsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdH0sXG5cdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdGRhdGFIb2xkZXIgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyB0aGlzIDogZG9jLFxuXHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmdldCggZGF0YUhvbGRlciwgZGVsZWdhdGVUeXBlICkgLSAxO1xuXG5cdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0aWYgKCBkb2N1bWVudC5kb2N1bWVudE1vZGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCBkZWxlZ2F0ZVR5cGUsIGZvY3VzTWFwcGVkSGFuZGxlciApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBmb2N1c01hcHBlZEhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRhdGFIb2xkZXIsIGRlbGVnYXRlVHlwZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCBkYXRhSG9sZGVyLCBkZWxlZ2F0ZVR5cGUsIGF0dGFjaGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufSApO1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7XG5cdH0sXG5cdG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7XG5cdFx0dmFyIGhhbmRsZU9iaiwgdHlwZTtcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcblxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDpcblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUsXG5cdFx0XHRcdGhhbmRsZU9iai5zZWxlY3Rvcixcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbnZhclxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHlcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8IVxcW0NEQVRBXFxbfFxcXVxcXT5cXHMqJC9nO1xuXG4vLyBQcmVmZXIgYSB0Ym9keSBvdmVyIGl0cyBwYXJlbnQgdGFibGUgZm9yIGNvbnRhaW5pbmcgbmV3IHJvd3NcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSApIHtcblxuXHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggXCJ0Ym9keVwiIClbIDAgXSB8fCBlbGVtO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdGlmICggKCBlbGVtLnR5cGUgfHwgXCJcIiApLnNsaWNlKCAwLCA1ICkgPT09IFwidHJ1ZS9cIiApIHtcblx0XHRlbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuZ2V0KCBzcmMgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZGVzdCwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGZsYXQoIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAodHJhYy04MDcwKS5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHQvLyBSZS1lbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCBcIlwiICkudG9Mb3dlckNhc2UoKSAgIT09IFwibW9kdWxlXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgJiYgIW5vZGUubm9Nb2R1bGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYywge1xuXHRcdFx0XHRcdFx0XHRcdFx0bm9uY2U6IG5vZGUubm9uY2UgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoIFwibm9uY2VcIiApXG5cdFx0XHRcdFx0XHRcdFx0fSwgZG9jICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVW53cmFwIGEgQ0RBVEEgc2VjdGlvbiBjb250YWluaW5nIHNjcmlwdCBjb250ZW50cy4gVGhpcyBzaG91bGRuJ3QgYmVcblx0XHRcdFx0XHRcdFx0Ly8gbmVlZGVkIGFzIGluIFhNTCBkb2N1bWVudHMgdGhleSdyZSBhbHJlYWR5IG5vdCB2aXNpYmxlIHdoZW5cblx0XHRcdFx0XHRcdFx0Ly8gaW5zcGVjdGluZyBlbGVtZW50IGNvbnRlbnRzIGFuZCBpbiBIVE1MIGRvY3VtZW50cyB0aGV5IGhhdmUgbm9cblx0XHRcdFx0XHRcdFx0Ly8gbWVhbmluZyBidXQgd2UncmUgcHJlc2VydmluZyB0aGF0IGxvZ2ljIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyB3aWxsIGJlIHJlbW92ZWQgY29tcGxldGVseSBpbiA0LjAuIFNlZSBnaC00OTA0LlxuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBub2RlLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGlzQXR0YWNoZWQoIG5vZGUgKSApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdH1cblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHJldHVybiBodG1sO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBpc0F0dGFjaGVkKCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IGpRdWVyeSNmaW5kIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6XG5cdFx0XHQvLyBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciByY3VzdG9tUHJvcCA9IC9eLS0vO1xuXG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICh0cmFjLTE1MDk4LCB0cmFjLTE0MTUwKVxuXHRcdC8vIElFIHRocm93cyBvbiBlbGVtZW50cyBjcmVhdGVkIGluIHBvcHVwc1xuXHRcdC8vIEZGIG1lYW53aGlsZSB0aHJvd3Mgb24gZnJhbWUgZWxlbWVudHMgdGhyb3VnaCBcImRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGVcIlxuXHRcdHZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXG5cdFx0aWYgKCAhdmlldyB8fCAhdmlldy5vcGVuZXIgKSB7XG5cdFx0XHR2aWV3ID0gd2luZG93O1xuXHRcdH1cblxuXHRcdHJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTtcblx0fTtcblxudmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7XG5cdHZhciByZXQsIG5hbWUsXG5cdFx0b2xkID0ge307XG5cblx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XG5cdH1cblxuXHRyZXQgPSBjYWxsYmFjay5jYWxsKCBlbGVtICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD02NFxuXHRcdC8vIERvbid0IGdldCB0cmlja2VkIHdoZW4gem9vbSBhZmZlY3RzIG9mZnNldFdpZHRoIChnaC00MDI5KVxuXHRcdGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRzY3JvbGxib3hTaXplVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXYub2Zmc2V0V2lkdGggLyAzICkgPT09IDEyO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsLCByZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBTdHlsZSBvZiBjbG9uZWQgZWxlbWVudCBhZmZlY3RzIHNvdXJjZSBlbGVtZW50IGNsb25lZCAodHJhYy04OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7XG5cdFx0fSxcblx0XHRwaXhlbEJveFN0eWxlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRzY3JvbGxib3hTaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDtcblx0XHR9LFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gQmVoYXZpb3IgaW4gSUUgOSBpcyBtb3JlIHN1YnRsZSB0aGFuIGluIG5ld2VyIHZlcnNpb25zICYgaXQgcGFzc2VzXG5cdFx0Ly8gc29tZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3Q7IG1ha2Ugc3VyZSBub3QgdG8gbWFrZSBpdCBwYXNzIHRoZXJlIVxuXHRcdC8vXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA3MCtcblx0XHQvLyBPbmx5IEZpcmVmb3ggaW5jbHVkZXMgYm9yZGVyIHdpZHRoc1xuXHRcdC8vIGluIGNvbXB1dGVkIGRpbWVuc2lvbnMuIChnaC00NTI5KVxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0YWJsZSwgdHIsIHRyQ2hpbGQsIHRyU3R5bGU7XG5cdFx0XHRpZiAoIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0YWJsZVwiICk7XG5cdFx0XHRcdHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0clwiICk7XG5cdFx0XHRcdHRyQ2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0XHRcdFx0dGFibGUuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGVcIjtcblx0XHRcdFx0dHIuc3R5bGUuY3NzVGV4dCA9IFwiYm94LXNpemluZzpjb250ZW50LWJveDtib3JkZXI6MXB4IHNvbGlkXCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDg2K1xuXHRcdFx0XHQvLyBIZWlnaHQgc2V0IHRocm91Z2ggY3NzVGV4dCBkb2VzIG5vdCBnZXQgYXBwbGllZC5cblx0XHRcdFx0Ly8gQ29tcHV0ZWQgaGVpZ2h0IHRoZW4gY29tZXMgYmFjayBhcyAwLlxuXHRcdFx0XHR0ci5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuXHRcdFx0XHR0ckNoaWxkLnN0eWxlLmhlaWdodCA9IFwiOXB4XCI7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA4IENocm9tZSA4Nitcblx0XHRcdFx0Ly8gSW4gb3VyIGJvZHlCYWNrZ3JvdW5kLmh0bWwgaWZyYW1lLFxuXHRcdFx0XHQvLyBkaXNwbGF5IGZvciBhbGwgZGl2IGVsZW1lbnRzIGlzIHNldCB0byBcImlubGluZVwiLFxuXHRcdFx0XHQvLyB3aGljaCBjYXVzZXMgYSBwcm9ibGVtIG9ubHkgaW4gQW5kcm9pZCA4IENocm9tZSA4Ni5cblx0XHRcdFx0Ly8gRW5zdXJpbmcgdGhlIGRpdiBpcyBgZGlzcGxheTogYmxvY2tgXG5cdFx0XHRcdC8vIGdldHMgYXJvdW5kIHRoaXMgaXNzdWUuXG5cdFx0XHRcdHRyQ2hpbGQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuXHRcdFx0XHRkb2N1bWVudEVsZW1lbnRcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRhYmxlIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyIClcblx0XHRcdFx0XHQuYXBwZW5kQ2hpbGQoIHRyQ2hpbGQgKTtcblxuXHRcdFx0XHR0clN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIHRyICk7XG5cdFx0XHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID0gKCBwYXJzZUludCggdHJTdHlsZS5oZWlnaHQsIDEwICkgK1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0clN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCApICtcblx0XHRcdFx0XHRwYXJzZUludCggdHJTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTAgKSApID09PSB0ci5vZmZzZXRIZWlnaHQ7XG5cblx0XHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCB0YWJsZSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDUxK1xuXHRcdC8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3dcblx0XHQvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzXG5cdFx0Ly8gb24gZGV0YWNoZWQgZWxlbWVudHNcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblxuXHQvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6XG5cdC8vICAgLmNzcygnZmlsdGVyJykgKElFIDkgb25seSwgdHJhYy0xMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoZ2gtMzE0NClcblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExK1xuXHRcdC8vIElFIG9ubHkgc3VwcG9ydHMgYFwiZmxvYXRcImAgaW4gYGdldFByb3BlcnR5VmFsdWVgOyBpbiBjb21wdXRlZCBzdHlsZXNcblx0XHQvLyBpdCdzIG9ubHkgYXZhaWxhYmxlIGFzIGBcImNzc0Zsb2F0XCJgLiBXZSBubyBsb25nZXIgbW9kaWZ5IHByb3BlcnRpZXNcblx0XHQvLyBzZW50IHRvIGAuY3NzKClgIGFwYXJ0IGZyb20gY2FtZWxDYXNpbmcsIHNvIHdlIG5lZWQgdG8gY2hlY2sgYm90aC5cblx0XHQvLyBOb3JtYWxseSwgdGhpcyB3b3VsZCBjcmVhdGUgZGlmZmVyZW5jZSBpbiBiZWhhdmlvcjogaWZcblx0XHQvLyBgZ2V0UHJvcGVydHlWYWx1ZWAgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHRoZSB2YWx1ZSByZXR1cm5lZFxuXHRcdC8vIGJ5IGAuY3NzKClgIHdvdWxkIGJlIGB1bmRlZmluZWRgLiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2UgZm9yXG5cdFx0Ly8gZGlzY29ubmVjdGVkIGVsZW1lbnRzLiBIb3dldmVyLCBpbiBJRSBldmVuIGRpc2Nvbm5lY3RlZCBlbGVtZW50c1xuXHRcdC8vIHdpdGggbm8gc3R5bGVzIHJldHVybiBgXCJub25lXCJgIGZvciBgZ2V0UHJvcGVydHlWYWx1ZSggXCJmbG9hdFwiIClgXG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cblx0XHRpZiAoIGlzQ3VzdG9tUHJvcCAmJiByZXQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMTA1KywgQ2hyb21lIDw9MTA1K1xuXHRcdFx0Ly8gU3BlYyByZXF1aXJlcyB0cmltbWluZyB3aGl0ZXNwYWNlIGZvciBjdXN0b20gcHJvcGVydGllcyAoZ2gtNDkyNikuXG5cdFx0XHQvLyBGaXJlZm94IG9ubHkgdHJpbXMgbGVhZGluZyB3aGl0ZXNwYWNlLiBDaHJvbWUganVzdCBjb2xsYXBzZXNcblx0XHRcdC8vIGJvdGggbGVhZGluZyAmIHRyYWlsaW5nIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UuXG5cdFx0XHQvL1xuXHRcdFx0Ly8gRmFsbCBiYWNrIHRvIGB1bmRlZmluZWRgIGlmIGVtcHR5IHN0cmluZyByZXR1cm5lZC5cblx0XHRcdC8vIFRoaXMgY29sbGFwc2VzIGEgbWlzc2luZyBkZWZpbml0aW9uIHdpdGggcHJvcGVydHkgZGVmaW5lZFxuXHRcdFx0Ly8gYW5kIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgYnV0IHRoZXJlJ3Mgbm8gc3RhbmRhcmQgQVBJXG5cdFx0XHQvLyBhbGxvd2luZyB1cyB0byBkaWZmZXJlbnRpYXRlIHRoZW0gd2l0aG91dCBhIHBlcmZvcm1hbmNlIHBlbmFsdHlcblx0XHRcdC8vIGFuZCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgYWxpZ25zIHdpdGggb2xkZXIgalF1ZXJ5LlxuXHRcdFx0Ly9cblx0XHRcdC8vIHJ0cmltQ1NTIHRyZWF0cyBVKzAwMEQgQ0FSUklBR0UgUkVUVVJOIGFuZCBVKzAwMEMgRk9STSBGRUVEXG5cdFx0XHQvLyBhcyB3aGl0ZXNwYWNlIHdoaWxlIENTUyBkb2VzIG5vdCwgYnV0IHRoaXMgaXMgbm90IGEgcHJvYmxlbVxuXHRcdFx0Ly8gYmVjYXVzZSBDU1MgcHJlcHJvY2Vzc2luZyByZXBsYWNlcyB0aGVtIHdpdGggVSswMDBBIExJTkUgRkVFRFxuXHRcdFx0Ly8gKHdoaWNoICppcyogQ1NTIHdoaXRlc3BhY2UpXG5cdFx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNpbnB1dC1wcmVwcm9jZXNzaW5nXG5cdFx0XHRyZXQgPSByZXQucmVwbGFjZSggcnRyaW1DU1MsIFwiJDFcIiApIHx8IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhaXNBdHRhY2hlZCggZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIHNvbWUgdmFsdWVzLFxuXHRcdC8vIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMuXG5cdFx0Ly8gVGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOlxuXHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbEJveFN0eWxlcygpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiByYm94U3R5bGUudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXIgY3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlLFxuXHR2ZW5kb3JQcm9wcyA9IHt9O1xuXG4vLyBSZXR1cm4gYSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgb3IgdW5kZWZpbmVkXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcG90ZW50aWFsbHktbWFwcGVkIGpRdWVyeS5jc3NQcm9wcyBvciB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciBmaW5hbCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IHZlbmRvclByb3BzWyBuYW1lIF07XG5cblx0aWYgKCBmaW5hbCApIHtcblx0XHRyZXR1cm4gZmluYWw7XG5cdH1cblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblx0cmV0dXJuIHZlbmRvclByb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH07XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBfZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgYm94LCBpc0JvcmRlckJveCwgc3R5bGVzLCBjb21wdXRlZFZhbCApIHtcblx0dmFyIGkgPSBkaW1lbnNpb24gPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXHRcdGV4dHJhID0gMCxcblx0XHRkZWx0YSA9IDAsXG5cdFx0bWFyZ2luRGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdC8vIENvdW50IG1hcmdpbiBkZWx0YSBzZXBhcmF0ZWx5IHRvIG9ubHkgYWRkIGl0IGFmdGVyIHNjcm9sbCBndXR0ZXIgYWRqdXN0bWVudC5cblx0XHQvLyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIG5lZ2F0aXZlIG1hcmdpbnMgd29yayB3aXRoIGBvdXRlckhlaWdodCggdHJ1ZSApYCAoZ2gtMzk4MikuXG5cdFx0aWYgKCBib3ggPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRtYXJnaW5EZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGNvbnRlbnQtYm94LCB3ZSdyZSBzZWVraW5nIFwicGFkZGluZ1wiIG9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIlxuXHRcdGlmICggIWlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBBZGQgcGFkZGluZ1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEZvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCIsIGFkZCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQnV0IHN0aWxsIGtlZXAgdHJhY2sgb2YgaXQgb3RoZXJ3aXNlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRyYSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGJvcmRlci1ib3ggKGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyKSwgd2UncmUgc2Vla2luZyBcImNvbnRlbnRcIiBvclxuXHRcdC8vIFwicGFkZGluZ1wiIG9yIFwibWFyZ2luXCJcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIsIHN1YnRyYWN0IHBhZGRpbmdcblx0XHRcdGlmICggYm94ID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiBvciBcInBhZGRpbmdcIiwgc3VidHJhY3QgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBY2NvdW50IGZvciBwb3NpdGl2ZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyIHdoZW4gcmVxdWVzdGVkIGJ5IHByb3ZpZGluZyBjb21wdXRlZFZhbFxuXHRpZiAoICFpc0JvcmRlckJveCAmJiBjb21wdXRlZFZhbCA+PSAwICkge1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIGEgcm91bmRlZCBzdW0gb2YgY29udGVudCwgcGFkZGluZywgc2Nyb2xsIGd1dHRlciwgYW5kIGJvcmRlclxuXHRcdC8vIEFzc3VtaW5nIGludGVnZXIgc2Nyb2xsIGd1dHRlciwgc3VidHJhY3QgdGhlIHJlc3QgYW5kIHJvdW5kIGRvd25cblx0XHRkZWx0YSArPSBNYXRoLm1heCggMCwgTWF0aC5jZWlsKFxuXHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdGNvbXB1dGVkVmFsIC1cblx0XHRcdGRlbHRhIC1cblx0XHRcdGV4dHJhIC1cblx0XHRcdDAuNVxuXG5cdFx0Ly8gSWYgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIHVua25vd24sIHRoZW4gd2UgY2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXJcblx0XHQvLyBVc2UgYW4gZXhwbGljaXQgemVybyB0byBhdm9pZCBOYU4gKGdoLTM5NjQpXG5cdFx0KSApIHx8IDA7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGEgKyBtYXJnaW5EZWx0YTtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApIHtcblxuXHQvLyBTdGFydCB3aXRoIGNvbXB1dGVkIHN0eWxlXG5cdHZhciBzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTQzMjIpLlxuXHRcdC8vIEZha2UgY29udGVudC1ib3ggdW50aWwgd2Uga25vdyBpdCdzIG5lZWRlZCB0byBrbm93IHRoZSB0cnVlIHZhbHVlLlxuXHRcdGJveFNpemluZ05lZWRlZCA9ICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgZXh0cmEsXG5cdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94LFxuXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdG9mZnNldFByb3AgPSBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApO1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHQvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS5cblx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0aWYgKCAhZXh0cmEgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblx0XHR2YWwgPSBcImF1dG9cIjtcblx0fVxuXG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gVXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3Igd2hlbiBib3ggc2l6aW5nIGlzIHVucmVsaWFibGUuXG5cdC8vIEluIHRob3NlIGNhc2VzLCB0aGUgY29tcHV0ZWQgdmFsdWUgY2FuIGJlIHRydXN0ZWQgdG8gYmUgYm9yZGVyLWJveC5cblx0aWYgKCAoICFzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgJiYgaXNCb3JkZXJCb3ggfHxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDEwIC0gMTErLCBFZGdlIDE1IC0gMTgrXG5cdFx0Ly8gSUUvRWRnZSBtaXNyZXBvcnQgYGdldENvbXB1dGVkU3R5bGVgIG9mIHRhYmxlIHJvd3Mgd2l0aCB3aWR0aC9oZWlnaHRcblx0XHQvLyBzZXQgaW4gQ1NTIHdoaWxlIGBvZmZzZXQqYCBwcm9wZXJ0aWVzIHJlcG9ydCBjb3JyZWN0IHZhbHVlcy5cblx0XHQvLyBJbnRlcmVzdGluZ2x5LCBpbiBzb21lIGNhc2VzIElFIDkgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGlzIGlzc3VlLlxuXHRcdCFzdXBwb3J0LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkgJiYgbm9kZU5hbWUoIGVsZW0sIFwidHJcIiApIHx8XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0XHQvLyBUaGlzIGhhcHBlbnMgZm9yIGlubGluZSBlbGVtZW50cyB3aXRoIG5vIGV4cGxpY2l0IHNldHRpbmcgKGdoLTM1NzEpXG5cdFx0dmFsID09PSBcImF1dG9cIiB8fFxuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSAtIDQuMyBvbmx5XG5cdFx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0XHQhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJpbmxpbmVcIiApICYmXG5cblx0XHQvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSAmIGNvbm5lY3RlZFxuXHRcdGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0XHQvLyBXaGVyZSBhdmFpbGFibGUsIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBhcHByb3hpbWF0ZSBib3JkZXIgYm94IGRpbWVuc2lvbnMuXG5cdFx0Ly8gV2hlcmUgbm90IGF2YWlsYWJsZSAoZS5nLiwgU1ZHKSwgYXNzdW1lIHVucmVsaWFibGUgYm94LXNpemluZyBhbmQgaW50ZXJwcmV0IHRoZVxuXHRcdC8vIHJldHJpZXZlZCB2YWx1ZSBhcyBhIGNvbnRlbnQgYm94IGRpbWVuc2lvbi5cblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gb2Zmc2V0UHJvcCBpbiBlbGVtO1xuXHRcdGlmICggdmFsdWVJc0JvcmRlckJveCApIHtcblx0XHRcdHZhbCA9IGVsZW1bIG9mZnNldFByb3AgXTtcblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgXCJcIiBhbmQgYXV0b1xuXHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXG5cdC8vIEFkanVzdCBmb3IgdGhlIGVsZW1lbnQncyBib3ggbW9kZWxcblx0cmV0dXJuICggdmFsICtcblx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRlbGVtLFxuXHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlcyxcblxuXHRcdFx0Ly8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSlcblx0XHRcdHZhbFxuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIEFkZCBpbiBzdHlsZSBwcm9wZXJ0eSBob29rcyBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdFxuXHQvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHlcblx0Y3NzSG9va3M6IHtcblx0XHRvcGFjaXR5OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XG5cdFx0XHRcdFx0dmFyIHJldCA9IGN1ckNTUyggZWxlbSwgXCJvcGFjaXR5XCIgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmV0ID09PSBcIlwiID8gXCIxXCIgOiByZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgXCJweFwiIHRvIHRoZXNlIHBvc3NpYmx5LXVuaXRsZXNzIHByb3BlcnRpZXNcblx0Y3NzTnVtYmVyOiB7XG5cdFx0YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG5cdFx0YXNwZWN0UmF0aW86IHRydWUsXG5cdFx0Ym9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcblx0XHRjb2x1bW5Db3VudDogdHJ1ZSxcblx0XHRmbGV4R3JvdzogdHJ1ZSxcblx0XHRmbGV4U2hyaW5rOiB0cnVlLFxuXHRcdGZvbnRXZWlnaHQ6IHRydWUsXG5cdFx0Z3JpZEFyZWE6IHRydWUsXG5cdFx0Z3JpZENvbHVtbjogdHJ1ZSxcblx0XHRncmlkQ29sdW1uRW5kOiB0cnVlLFxuXHRcdGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcblx0XHRncmlkUm93OiB0cnVlLFxuXHRcdGdyaWRSb3dFbmQ6IHRydWUsXG5cdFx0Z3JpZFJvd1N0YXJ0OiB0cnVlLFxuXHRcdGxpbmVIZWlnaHQ6IHRydWUsXG5cdFx0b3BhY2l0eTogdHJ1ZSxcblx0XHRvcmRlcjogdHJ1ZSxcblx0XHRvcnBoYW5zOiB0cnVlLFxuXHRcdHNjYWxlOiB0cnVlLFxuXHRcdHdpZG93czogdHJ1ZSxcblx0XHR6SW5kZXg6IHRydWUsXG5cdFx0em9vbTogdHJ1ZSxcblxuXHRcdC8vIFNWRy1yZWxhdGVkXG5cdFx0ZmlsbE9wYWNpdHk6IHRydWUsXG5cdFx0Zmxvb2RPcGFjaXR5OiB0cnVlLFxuXHRcdHN0b3BPcGFjaXR5OiB0cnVlLFxuXHRcdHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG5cdFx0c3Ryb2tlT3BhY2l0eTogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge30sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBxdWVyeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAodHJhYy03MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgdHJhYy05MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKHRyYWMtNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHQvLyBUaGUgaXNDdXN0b21Qcm9wIGNoZWNrIGNhbiBiZSByZW1vdmVkIGluIGpRdWVyeSA0LjAgd2hlbiB3ZSBvbmx5IGF1dG8tYXBwZW5kXG5cdFx0XHQvLyBcInB4XCIgdG8gYSBmZXcgaGFyZGNvZGVkIHZhbHVlcy5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiAmJiAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0XHRcdHN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdFxuXHRcdFx0cmV0dXJuIHN0eWxlWyBuYW1lIF07XG5cdFx0fVxuXHR9LFxuXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhLCBzdHlsZXMgKSB7XG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBtb2RpZnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBfaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXG5cdFx0XHRcdC8vIE9ubHkgcmVhZCBzdHlsZXMucG9zaXRpb24gaWYgdGhlIHRlc3QgaGFzIGEgY2hhbmNlIHRvIGZhaWxcblx0XHRcdFx0Ly8gdG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdy5cblx0XHRcdFx0c2Nyb2xsYm94U2l6ZUJ1Z2d5ID0gIXN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpICYmXG5cdFx0XHRcdFx0c3R5bGVzLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIsXG5cblx0XHRcdFx0Ly8gVG8gYXZvaWQgZm9yY2luZyBhIHJlZmxvdywgb25seSBmZXRjaCBib3hTaXppbmcgaWYgd2UgbmVlZCBpdCAoZ2gtMzk5MSlcblx0XHRcdFx0Ym94U2l6aW5nTmVlZGVkID0gc2Nyb2xsYm94U2l6ZUJ1Z2d5IHx8IGV4dHJhLFxuXHRcdFx0XHRpc0JvcmRlckJveCA9IGJveFNpemluZ05lZWRlZCAmJlxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdHN1YnRyYWN0ID0gZXh0cmEgP1xuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudChcblx0XHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0XHRleHRyYSxcblx0XHRcdFx0XHRcdGlzQm9yZGVyQm94LFxuXHRcdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdFx0KSA6XG5cdFx0XHRcdFx0MDtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdW5yZWxpYWJsZSBib3JkZXItYm94IGRpbWVuc2lvbnMgYnkgY29tcGFyaW5nIG9mZnNldCogdG8gY29tcHV0ZWQgYW5kXG5cdFx0XHQvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KVxuXHRcdFx0aWYgKCBpc0JvcmRlckJveCAmJiBzY3JvbGxib3hTaXplQnVnZ3kgKSB7XG5cdFx0XHRcdHN1YnRyYWN0IC09IE1hdGguY2VpbChcblx0XHRcdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0XHRcdHBhcnNlRmxvYXQoIHN0eWxlc1sgZGltZW5zaW9uIF0gKSAtXG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIFwiYm9yZGVyXCIsIGZhbHNlLCBzdHlsZXMgKSAtXG5cdFx0XHRcdFx0MC41XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1lbnQgaXMgbmVlZGVkXG5cdFx0XHRpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmXG5cdFx0XHRcdCggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApICE9PSBcInB4XCIgKSB7XG5cblx0XHRcdFx0ZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBkaW1lbnNpb24gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCBwcmVmaXggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9XG59ICk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHQ7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpO1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdH0sXG5cdGN1cjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdHJldHVybiBob29rcyAmJiBob29rcy5nZXQgP1xuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyApO1xuXHR9LFxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xuXHRcdHZhciBlYXNlZCxcblx0XHRcdGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdbIHRoaXMuZWFzaW5nIF0oXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XG5cdFx0fVxuXHRcdHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7XG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlO1xuXG5Ud2Vlbi5wcm9wSG9va3MgPSB7XG5cdF9kZWZhdWx0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0XHQvLyBVc2UgYSBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSB3aGVuIGl0IGlzIG5vdCBhIERPTSBlbGVtZW50LFxuXHRcdFx0Ly8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy5cblx0XHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAhPT0gMSB8fFxuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cblx0XHRcdC8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LlxuXHRcdFx0Ly8gVXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlLlxuXHRcdFx0Ly8gVXNlIC5zdHlsZSBpZiBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZS5cblx0XHRcdGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHtcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcblx0XHRcdH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSB8fFxuXHRcdFx0XHRcdHR3ZWVuLmVsZW0uc3R5bGVbIGZpbmFsUHJvcE5hbWUoIHR3ZWVuLnByb3AgKSBdICE9IG51bGwgKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZhbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi9cblxuXHRcdFx0XHQvLyBUaGUgZmluYWwgc3RlcCBvZiBhIFwiaGlkZVwiIGFuaW1hdGlvbiBpcyBhY3R1YWxseSBoaWRpbmcgdGhlIGVsZW1lbnRcblx0XHRcdFx0aWYgKCAhaGlkZGVuICkge1xuXHRcdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJmeHNob3dcIiApO1xuXHRcdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdC8vIFBlci1wcm9wZXJ0eSBzZXR1cFxuXHRcdHByb3BUd2VlbiA9IGNyZWF0ZVR3ZWVuKCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCwgcHJvcCwgYW5pbSApO1xuXHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0ZGF0YVNob3dbIHByb3AgXSA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRwcm9wVHdlZW4uZW5kID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRwcm9wVHdlZW4uc3RhcnQgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGNhbWVsQ2FzZSggaW5kZXggKTtcblx0XHRlYXNpbmcgPSBzcGVjaWFsRWFzaW5nWyBuYW1lIF07XG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjMgb25seVxuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICh0cmFjLTEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRyZXN1bHQuc3RvcC5iaW5kKCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7XG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XG5cdH1cblxuXHQvLyBBdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRhbmltYXRpb25cblx0XHQucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcblxuXHRqUXVlcnkuZngudGltZXIoXG5cdFx0alF1ZXJ5LmV4dGVuZCggdGljaywge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcblx0XHRcdHF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZVxuXHRcdH0gKVxuXHQpO1xuXG5cdHJldHVybiBhbmltYXRpb247XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0aXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFpc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHQvLyBHbyB0byB0aGUgZW5kIHN0YXRlIGlmIGZ4IGFyZSBvZmZcblx0aWYgKCBqUXVlcnkuZngub2ZmICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLlxuXHRcdFx0Ly8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaFxuXHRcdFx0Ly8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLlxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBEYXRlLm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gUnVuIHRoZSB0aW1lciBhbmQgc2FmZWx5IHJlbW92ZSBpdCB3aGVuIGRvbmUgKGFsbG93aW5nIGZvciBleHRlcm5hbCByZW1vdmFsKVxuXHRcdGlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkge1xuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhdGltZXJzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZnguc3RvcCgpO1xuXHR9XG5cdGZ4Tm93ID0gdW5kZWZpbmVkO1xufTtcblxualF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkge1xuXHRqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7XG5cdGpRdWVyeS5meC5zdGFydCgpO1xufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCBpblByb2dyZXNzICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluUHJvZ3Jlc3MgPSB0cnVlO1xuXHRzY2hlZHVsZSgpO1xufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aW5Qcm9ncmVzcyA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjMgb25seVxuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE11c3QgYWNjZXNzIHNlbGVjdGVkSW5kZXggdG8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgc2VsZWN0XG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnZhbHVlID0gXCJ0XCI7XG5cdGlucHV0LnR5cGUgPSBcInJhZGlvXCI7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTtcblx0XHR9XG5cblx0XHQvLyBBdHRyaWJ1dGUgaG9va3MgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uXG5cdFx0Ly8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlLFxuXHRcdFx0bG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdGxvd2VyY2FzZU5hbWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gaGFuZGxlO1xuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xufSApO1xuXG5cblxuXG52YXIgcmZvY3VzYWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5wcm9wLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRlbGV0ZSB0aGlzWyBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUgXTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rc1xuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblx0XHRcdGhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcblx0fSxcblxuXHRwcm9wSG9va3M6IHtcblx0XHR0YWJJbmRleDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0XHRcdC8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZVxuXHRcdFx0XHQvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXRcblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsICh0cmFjLTEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY3VyLCBjdXJWYWx1ZSwgY2xhc3NOYW1lLCBpLCBmaW5hbFZhbHVlO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzTmFtZXMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0Y3VyID0gdGhpcy5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXNzTmFtZSArIFwiIFwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY3VyLCBjdXJWYWx1ZSwgY2xhc3NOYW1lLCBpLCBmaW5hbFZhbHVlO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXR0ciggXCJjbGFzc1wiLCBcIlwiICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NOYW1lcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc05hbWVzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCB0aGlzICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gdGhpcy5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXNzTmFtZSArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhc3NOYW1lICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gc3RyaXBBbmRDb2xsYXBzZSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgY2xhc3NOYW1lcywgY2xhc3NOYW1lLCBpLCBzZWxmLFxuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZSxcblx0XHRcdGlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBpc1ZhbGlkVmFsdWUgKSB7XG5cblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpIF07XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIHZhbHVlSXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdGlmICggdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHQvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZ1xuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHlcblx0XHRcdFx0XHQvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAodHJhYy0xNDY4NiwgdHJhYy0xNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0c3RyaXBBbmRDb2xsYXBzZSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbiwgaSxcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCAwICkge1xuXHRcdFx0XHRcdGkgPSBtYXg7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdC8vIElFOC05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKHRyYWMtMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCFvcHRpb24uZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXG5cdFx0XHRcdFx0aWYgKCBvcHRpb24uc2VsZWN0ZWQgPVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbmQtYXNzaWduICovXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXJcbmpRdWVyeS5lYWNoKCBbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSB7IGd1aWQ6IERhdGUubm93KCkgfTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sLCBwYXJzZXJFcnJvckVsZW07XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC5cblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHt9XG5cblx0cGFyc2VyRXJyb3JFbGVtID0geG1sICYmIHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiIClbIDAgXTtcblx0aWYgKCAheG1sIHx8IHBhcnNlckVycm9yRWxlbSApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgKFxuXHRcdFx0cGFyc2VyRXJyb3JFbGVtID9cblx0XHRcdFx0alF1ZXJ5Lm1hcCggcGFyc2VyRXJyb3JFbGVtLmNoaWxkTm9kZXMsIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWwudGV4dENvbnRlbnQ7XG5cdFx0XHRcdH0gKS5qb2luKCBcIlxcblwiICkgOlxuXHRcdFx0XHRkYXRhXG5cdFx0KSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0c3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZXZlbnQsIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsIGxhc3RFbGVtZW50LFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPiAtMSApIHtcblxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIFwiLlwiICk7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgJiYgXCJvblwiICsgdHlwZTtcblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xuXHRcdGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0ZXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSBcIm9iamVjdFwiICYmIGV2ZW50ICk7XG5cblx0XHQvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpXG5cdFx0ZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7XG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xuXHRcdGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgP1xuXHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICh0cmFjLTk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICh0cmFjLTk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0bGFzdEVsZW1lbnQgPSBjdXI7XG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKSApWyBldmVudC50eXBlIF0gJiZcblx0XHRcdFx0ZGF0YVByaXYuZ2V0KCBjdXIsIFwiaGFuZGxlXCIgKTtcblx0XHRcdGlmICggaGFuZGxlICkge1xuXHRcdFx0XHRoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBOYXRpdmUgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gb250eXBlICYmIGN1clsgb250eXBlIF07XG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBoYW5kbGUuYXBwbHkgJiYgYWNjZXB0RGF0YSggY3VyICkgKSB7XG5cdFx0XHRcdGV2ZW50LnJlc3VsdCA9IGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGV2ZW50LnR5cGUgPSB0eXBlO1xuXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7XG5cblx0XHRcdGlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fFxuXHRcdFx0XHRzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBldmVudFBhdGgucG9wKCksIGRhdGEgKSA9PT0gZmFsc2UgKSAmJlxuXHRcdFx0XHRhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cblx0XHRcdFx0Ly8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKHRyYWMtNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxudmFyXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiB0b1R5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlT3JGdW5jdGlvbiApIHtcblxuXHRcdFx0Ly8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCB1c2UgaXRzIHJldHVybiB2YWx1ZVxuXHRcdFx0dmFyIHZhbHVlID0gaXNGdW5jdGlvbiggdmFsdWVPckZ1bmN0aW9uICkgP1xuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb24oKSA6XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbjtcblxuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArXG5cdFx0XHRcdGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSApO1xuXHRcdH07XG5cblx0aWYgKCBhID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKS5tYXAoIGZ1bmN0aW9uKCBfaSwgZWxlbSApIHtcblx0XHRcdHZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTtcblxuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbnZhclxuXHRyMjAgPSAvJTIwL2csXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRyYW50aUNhY2hlID0gLyhbPyZdKV89W14mXSovLFxuXHRyaGVhZGVycyA9IC9eKC4qPyk6WyBcXHRdKihbXlxcclxcbl0qKSQvbWcsXG5cblx0Ly8gdHJhYy03NjUzLCB0cmFjLTgxMjUsIHRyYWMtODE1MjogbG9jYWwgcHJvdG9jb2wgZGV0ZWN0aW9uXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxuXHRycHJvdG9jb2wgPSAvXlxcL1xcLy8sXG5cblx0LyogUHJlZmlsdGVyc1xuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxuXHQgKiAyKSBUaGVzZSBhcmUgY2FsbGVkOlxuXHQgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0XG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcblx0ICogMykga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHRwcmVmaWx0ZXJzID0ge30sXG5cblx0LyogVHJhbnNwb3J0cyBiaW5kaW5nc1xuXHQgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gXCIqXCIgaWYgbmVlZGVkXG5cdCAqL1xuXHR0cmFuc3BvcnRzID0ge30sXG5cblx0Ly8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAodHJhYy0xMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cbm9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyB0cmFjLTk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdID1cblx0XHRcdFx0XHRcdFx0XHRcdCggcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdIHx8IFtdIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNvbmNhdCggbWF0Y2hbIDIgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaC5qb2luKCBcIiwgXCIgKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICh0cmFjLTEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0IHRyYWMtMTIwMDRcblx0XHRzLnR5cGUgPSBvcHRpb25zLm1ldGhvZCB8fCBvcHRpb25zLnR5cGUgfHwgcy5tZXRob2QgfHwgcy50eXBlO1xuXG5cdFx0Ly8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdFxuXHRcdHMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIG9uIGFjY2Vzc2luZyB0aGUgaHJlZiBwcm9wZXJ0eSBpZiB1cmwgaXMgbWFsZm9ybWVkLFxuXHRcdFx0Ly8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5XG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICh0cmFjLTE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gdHJhYy05NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnlcblx0XHRcdFx0ZGVsZXRlIHMuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9yIHVwZGF0ZSBhbnRpLWNhY2hlIHBhcmFtIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSBjYWNoZVVSTC5yZXBsYWNlKCByYW50aUNhY2hlLCBcIiQxXCIgKTtcblx0XHRcdFx0dW5jYWNoZWQgPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgKCBub25jZS5ndWlkKysgKSArXG5cdFx0XHRcdFx0dW5jYWNoZWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMilcblx0XHRcdHMudXJsID0gY2FjaGVVUkwgKyB1bmNhY2hlZDtcblxuXHRcdC8vIENoYW5nZSAnJTIwJyB0byAnKycgaWYgdGhpcyBpcyBlbmNvZGVkIGZvcm0gYm9keSBjb250ZW50IChnaC0yNjU4KVxuXHRcdH0gZWxzZSBpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmXG5cdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApLmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCApIHtcblx0XHRcdHMuZGF0YSA9IHMuZGF0YS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcblx0XHRcdGlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU5vbmUtTWF0Y2hcIiwgalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcblx0XHRpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIsIHMuY29udGVudFR5cGUgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlXG5cdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlcihcblx0XHRcdFwiQWNjZXB0XCIsXG5cdFx0XHRzLmRhdGFUeXBlc1sgMCBdICYmIHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdID9cblx0XHRcdFx0cy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gK1xuXHRcdFx0XHRcdCggcy5kYXRhVHlwZXNbIDAgXSAhPT0gXCIqXCIgPyBcIiwgXCIgKyBhbGxUeXBlcyArIFwiOyBxPTAuMDFcIiA6IFwiXCIgKSA6XG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxuXHRcdCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cblx0XHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydFxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmXG5cdFx0XHQoIHMuYmVmb3JlU2VuZC5jYWxsKCBjYWxsYmFja0NvbnRleHQsIGpxWEhSLCBzICkgPT09IGZhbHNlIHx8IGNvbXBsZXRlZCApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Y29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTtcblx0XHRqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTtcblx0XHRqcVhIUi5mYWlsKCBzLmVycm9yICk7XG5cblx0XHQvLyBHZXQgdHJhbnNwb3J0XG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnRcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XG5cdFx0XHRkb25lKCAtMSwgXCJObyBUcmFuc3BvcnRcIiApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcblxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBcImFqYXhTZW5kXCIsIFsganFYSFIsIHMgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhamF4U2VuZCwgc3RvcCB0aGVyZVxuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbXBsZXRlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIFJldGhyb3cgcG9zdC1jb21wbGV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFByb3BhZ2F0ZSBvdGhlcnMgYXMgcmVzdWx0c1xuXHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIElnbm9yZSByZXBlYXQgaW52b2NhdGlvbnNcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbXBsZXRlZCA9IHRydWU7XG5cblx0XHRcdC8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcblx0XHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dFRpbWVyICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIERlcmVmZXJlbmNlIHRyYW5zcG9ydCBmb3IgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxuXHRcdFx0dHJhbnNwb3J0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8IFwiXCI7XG5cblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwO1xuXG5cdFx0XHQvLyBEZXRlcm1pbmUgaWYgc3VjY2Vzc2Z1bFxuXHRcdFx0aXNTdWNjZXNzID0gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQ7XG5cblx0XHRcdC8vIEdldCByZXNwb25zZSBkYXRhXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcblx0XHRcdFx0cmVzcG9uc2UgPSBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZSBhIG5vb3AgY29udmVydGVyIGZvciBtaXNzaW5nIHNjcmlwdCBidXQgbm90IGlmIGpzb25wXG5cdFx0XHRpZiAoICFpc1N1Y2Nlc3MgJiZcblx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIFwic2NyaXB0XCIsIHMuZGF0YVR5cGVzICkgPiAtMSAmJlxuXHRcdFx0XHRqUXVlcnkuaW5BcnJheSggXCJqc29uXCIsIHMuZGF0YVR5cGVzICkgPCAwICkge1xuXHRcdFx0XHRzLmNvbnZlcnRlcnNbIFwidGV4dCBzY3JpcHRcIiBdID0gZnVuY3Rpb24oKSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggX2ksIG1ldGhvZCApIHtcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xuXG5cdFx0Ly8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIGZ1bmN0aW9uKCBzICkge1xuXHR2YXIgaTtcblx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0aWYgKCBpLnRvTG93ZXJDYXNlKCkgPT09IFwiY29udGVudC10eXBlXCIgKSB7XG5cdFx0XHRzLmNvbnRlbnRUeXBlID0gcy5oZWFkZXJzWyBpIF0gfHwgXCJcIjtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsLCBvcHRpb25zLCBkb2MgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICh0cmFjLTExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0Y2FjaGU6IHRydWUsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cblx0XHQvLyBPbmx5IGV2YWx1YXRlIHRoZSByZXNwb25zZSBpZiBpdCBpcyBzdWNjZXNzZnVsIChnaC00MTI2KVxuXHRcdC8vIGRhdGFGaWx0ZXIgaXMgbm90IGludm9rZWQgZm9yIGZhaWx1cmUgcmVzcG9uc2VzLCBzbyB1c2luZyBpdCBpbnN0ZWFkXG5cdFx0Ly8gb2YgdGhlIGRlZmF1bHQgY29udmVydGVyIGlzIGtsdWRneSBidXQgaXQgd29ya3MuXG5cdFx0Y29udmVydGVyczoge1xuXHRcdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbigpIHt9XG5cdFx0fSxcblx0XHRkYXRhRmlsdGVyOiBmdW5jdGlvbiggcmVzcG9uc2UgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggcmVzcG9uc2UsIG9wdGlvbnMsIGRvYyApO1xuXHRcdH1cblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyB0cmFjLTE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSB0cmFjLTg2MDUsIHRyYWMtMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vIHRyYWMtMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gb3IgZm9yY2VkLWJ5LWF0dHJzIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiB8fCBzLnNjcmlwdEF0dHJzICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiIClcblx0XHRcdFx0XHQuYXR0ciggcy5zY3JpcHRBdHRycyB8fCB7fSApXG5cdFx0XHRcdFx0LnByb3AoIHsgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LCBzcmM6IHMudXJsIH0gKVxuXHRcdFx0XHRcdC5vbiggXCJsb2FkIGVycm9yXCIsIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZS5ndWlkKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBpc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBTdXBwb3J0OiBTYWZhcmkgOCBvbmx5XG4vLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50XG4vLyBjb2xsYXBzZSBzaWJsaW5nIGZvcm1zOiB0aGUgc2Vjb25kIG9uZSBiZWNvbWVzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IG9uZS5cbi8vIEJlY2F1c2Ugb2YgdGhhdCwgdGhpcyBzZWN1cml0eSBtZWFzdXJlIGhhcyB0byBiZSBkaXNhYmxlZCBpbiBTYWZhcmkgOC5cbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzdcbnN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ID0gKCBmdW5jdGlvbigpIHtcblx0dmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKS5ib2R5O1xuXHRib2R5LmlubmVySFRNTCA9IFwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIjtcblx0cmV0dXJuIGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPT09IDI7XG59ICkoKTtcblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoIHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cblx0dmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0cztcblxuXHRpZiAoICFjb250ZXh0ICkge1xuXG5cdFx0Ly8gU3RvcCBzY3JpcHRzIG9yIGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGltbWVkaWF0ZWx5XG5cdFx0Ly8gYnkgdXNpbmcgZG9jdW1lbnQuaW1wbGVtZW50YXRpb25cblx0XHRpZiAoIHN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ICkge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApO1xuXG5cdFx0XHQvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHNvIGFueSBwYXJzZWQgZWxlbWVudHMgd2l0aCBVUkxzXG5cdFx0XHQvLyBhcmUgYmFzZWQgb24gdGhlIGRvY3VtZW50J3MgVVJMIChnaC0yOTY1KVxuXHRcdFx0YmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJiYXNlXCIgKTtcblx0XHRcdGJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHRjb250ZXh0LmhlYWQuYXBwZW5kQ2hpbGQoIGJhc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50O1xuXHRcdH1cblx0fVxuXG5cdHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApO1xuXHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbIDEgXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBidWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApO1xuXG5cdGlmICggc2NyaXB0cyAmJiBzY3JpcHRzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApO1xufTtcblxuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdG9mZiA9IHVybC5pbmRleE9mKCBcIiBcIiApO1xuXG5cdGlmICggb2ZmID4gLTEgKSB7XG5cdFx0c2VsZWN0b3IgPSBzdHJpcEFuZENvbGxhcHNlKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHQvLyBvZmZzZXQoKSByZWxhdGVzIGFuIGVsZW1lbnQncyBib3JkZXIgYm94IHRvIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHRcdC8vIFByZXNlcnZlIGNoYWluaW5nIGZvciBzZXR0ZXJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciByZWN0LCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gemVyb3MgZm9yIGRpc2Nvbm5lY3RlZCBhbmQgaGlkZGVuIChkaXNwbGF5OiBub25lKSBlbGVtZW50cyAoZ2gtMjMxMClcblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdC8vIEdldCBkb2N1bWVudC1yZWxhdGl2ZSBwb3NpdGlvbiBieSBhZGRpbmcgdmlld3BvcnQgc2Nyb2xsIHRvIHZpZXdwb3J0LXJlbGF0aXZlIGdCQ1Jcblx0XHRyZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG5cdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcblx0XHR9O1xuXHR9LFxuXG5cdC8vIHBvc2l0aW9uKCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgbWFyZ2luIGJveCB0byBpdHMgb2Zmc2V0IHBhcmVudCdzIHBhZGRpbmcgYm94XG5cdC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGJlaGF2aW9yIG9mIENTUyBhYnNvbHV0ZSBwb3NpdGlvbmluZ1xuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwgZG9jLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBwb3NpdGlvbjpmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gdGhlIHZpZXdwb3J0LCB3aGljaCBpdHNlbGYgYWx3YXlzIGhhcyB6ZXJvIG9mZnNldFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblxuXHRcdFx0Ly8gQXNzdW1lIHBvc2l0aW9uOmZpeGVkIGltcGxpZXMgYXZhaWxhYmlsaXR5IG9mIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB0aGUgKnJlYWwqIG9mZnNldCBwYXJlbnQsIHdoaWNoIGNhbiBiZSB0aGUgZG9jdW1lbnQgb3IgaXRzIHJvb3QgZWxlbWVudFxuXHRcdFx0Ly8gd2hlbiBhIHN0YXRpY2FsbHkgcG9zaXRpb25lZCBlbGVtZW50IGlzIGlkZW50aWZpZWRcblx0XHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHRcdG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJlxuXHRcdFx0XHQoIG9mZnNldFBhcmVudCA9PT0gZG9jLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2MuZG9jdW1lbnRFbGVtZW50ICkgJiZcblx0XHRcdFx0alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luXG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IGpRdWVyeSggb2Zmc2V0UGFyZW50ICkub2Zmc2V0KCk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cblx0XHRcdC8vIENvYWxlc2NlIGRvY3VtZW50cyBhbmQgd2luZG93c1xuXHRcdFx0dmFyIHdpbjtcblx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0d2luID0gZWxlbTtcblx0XHRcdH0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgLSA5LjEsIENocm9tZSA8PTM3IC0gNDlcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTg5MzQ3XG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBfaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCgge1xuXHRcdHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsXG5cdFx0Y29udGVudDogdHlwZSxcblx0XHRcIlwiOiBcIm91dGVyXCIgKyBuYW1lXG5cdH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIF9pLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5vbiggXCJtb3VzZWVudGVyXCIsIGZuT3ZlciApXG5cdFx0XHQub24oIFwibW91c2VsZWF2ZVwiLCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaChcblx0KCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblxuXHRcdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdFx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7XG5cdFx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XG5cdFx0fTtcblx0fVxuKTtcblxuXG5cblxuLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG4vLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1Bcbi8vIFJlcXVpcmUgdGhhdCB0aGUgXCJ3aGl0ZXNwYWNlIHJ1blwiIHN0YXJ0cyBmcm9tIGEgbm9uLXdoaXRlc3BhY2Vcbi8vIHRvIGF2b2lkIE8oTl4yKSBiZWhhdmlvciB3aGVuIHRoZSBlbmdpbmUgd291bGQgdHJ5IG1hdGNoaW5nIFwiXFxzKyRcIiBhdCBlYWNoIHNwYWNlIHBvc2l0aW9uLlxudmFyIHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8KFteXFxzXFx1RkVGRlxceEEwXSlbXFxzXFx1RkVGRlxceEEwXSskL2c7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cbmpRdWVyeS50cmltID0gZnVuY3Rpb24oIHRleHQgKSB7XG5cdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFwiXCIgOlxuXHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICk7XG59O1xuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG5cbnZhclxuXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSxcblxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuXHRfJCA9IHdpbmRvdy4kO1xuXG5qUXVlcnkubm9Db25mbGljdCA9IGZ1bmN0aW9uKCBkZWVwICkge1xuXHRpZiAoIHdpbmRvdy4kID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LiQgPSBfJDtcblx0fVxuXG5cdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XG5cdFx0d2luZG93LmpRdWVyeSA9IF9qUXVlcnk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5O1xufTtcblxuLy8gRXhwb3NlIGpRdWVyeSBhbmQgJCBpZGVudGlmaWVycywgZXZlbiBpbiBBTURcbi8vICh0cmFjLTcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICh0cmFjLTEzNTY2KVxuaWYgKCB0eXBlb2Ygbm9HbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxuXG5cblxucmV0dXJuIGpRdWVyeTtcbn0gKTtcbiIsImltcG9ydCB7IElBY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCAnLi9ib290c3RyYXAuc2NzcydcbmV4cG9ydCBjb25zdCBhY3Rpb25BZGRpbnMgOlJlY29yZDxzdHJpbmcsSUFjdGlvbj49e307XG4iLCJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5cbmludGVyZmFjZSBJTXVzdElucHV0UHJvcHN7XG4gICAgZmllbGQ6SUZpZWxkO1xuICAgIG1lc3NhZ2U6c3RyaW5nOyBcbn1cblxuZXhwb3J0IGNsYXNzIE11c3RJbnB1dEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb257XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcbiAgICBwcm9wczpJTXVzdElucHV0UHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5b+F6aCI44OB44Kn44OD44KvXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBtZXNzYWdlOicnXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnbWVzc2FnZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJTXVzdElucHV0UHJvcHM7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODiVske3RoaXMucHJvcHMuZmllbGQuY29kZX1d44GM6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CCYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgICAgICAgaWYodmFsdWU9PT11bmRlZmluZWQgfHwgdmFsdWU9PT0nJyl7XG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3I9dGhpcy5wcm9wcy5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbiAgICBcbn1cbm5ldyBNdXN0SW5wdXRBY3Rpb24oKTsiLCJleHBvcnQgY2xhc3MgRm9ybWF0dGVye1xuICAgIHN0YXRpYyBudW1iZXJGb3JtYXQobnVtOm51bWJlcixmb3JtYXQ6c3RyaW5nKTpzdHJpbmd7XG4gICAgICAgIGxldCBpbnRlZ2VyUGFydCA9IE1hdGguZmxvb3IoTWF0aC5hYnMobnVtKSkudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IGZyYWN0aW9uUGFydCA9IE1hdGguYWJzKG51bSkudG9TdHJpbmcoKS5zcGxpdCgnLicpWzFdIHx8ICcnO1xuICAgICAgICBsZXQgaXNOZWdhdGl2ZSA9IG51bSA8IDA7XG4gICAgICAgIGxldCBpc1BlcmNlbnQgPSBmb3JtYXQuaW5jbHVkZXMoJyUnKTsgICAgICAgXG4gICAgICAgIC8vICVcbiAgICAgICAgaWYgKGlzUGVyY2VudCkge1xuICAgICAgICAgICAgbnVtICo9IDEwMDtcbiAgICAgICAgICAgIGludGVnZXJQYXJ0ID0gTWF0aC5mbG9vcihNYXRoLmFicyhudW0pKS50b1N0cmluZygpO1xuICAgICAgICAgICAgZnJhY3Rpb25QYXJ0ID0gTWF0aC5hYnMobnVtKS50b1N0cmluZygpLnNwbGl0KCcuJylbMV0gfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIOWwj+aVsOOBqOaVtOaVsOmDqOWIhuOBruWHpueQhlxuICAgICAgICBsZXQgW2ludGVnZXJGb3JtYXQsIGZyYWN0aW9uRm9ybWF0XSA9IGZvcm1hdC5zcGxpdCgnLicpO1xuICAgICAgICBpbnRlZ2VyUGFydCA9IGludGVnZXJGb3JtYXQgPyBpbnRlZ2VyUGFydC5wYWRTdGFydChpbnRlZ2VyRm9ybWF0LnJlcGxhY2UoL1teMF0vZywgJycpLmxlbmd0aCwgJzAnKSA6IGludGVnZXJQYXJ0O1xuICAgICAgICBmcmFjdGlvblBhcnQgPSBmcmFjdGlvblBhcnQucGFkRW5kKGZyYWN0aW9uRm9ybWF0ID8gZnJhY3Rpb25Gb3JtYXQubGVuZ3RoIDogMCwgJzAnKTtcblxuICAgICAgICAvLyDjgqvjg57ljLrliIdcbiAgICAgICAgaWYgKC8sLy50ZXN0KGludGVnZXJGb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGludGVnZXJQYXJ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcGFydHMudW5zaGlmdChpbnRlZ2VyUGFydC5zbGljZSgtMykpO1xuICAgICAgICAgICAgaW50ZWdlclBhcnQgPSBpbnRlZ2VyUGFydC5zbGljZSgwLCAtMyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnRlZ2VyUGFydCA9IHBhcnRzLmpvaW4oJywnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOOBmeOBueOBpue1hOWQiOOCj+OBm1xuICAgICAgICBsZXQgcmVzdWx0ID0gZnJhY3Rpb25Gb3JtYXQgPyBgJHtpbnRlZ2VyUGFydH0uJHtmcmFjdGlvblBhcnR9YCA6IGludGVnZXJQYXJ0O1xuICAgICAgICByZXN1bHQgPSBpc05lZ2F0aXZlID8gYC0ke3Jlc3VsdH1gIDogcmVzdWx0O1xuICAgICAgICByZXR1cm4gaXNQZXJjZW50ID8gYCR7cmVzdWx0fSVgIDogcmVzdWx0O1xuICAgIH1cbiAgICAgIFxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgY29uc3QgaG91ciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgY29uc3QgbWludXRlID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIGNvbnN0IHNlY29uZCA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICBjb25zdCBtaWxsaXNlY29uZCA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgICAgIGNvbnN0IHRpbWVab25lT2Zmc2V0ID0gLWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwO1xuICAgICAgXG4gICAgICAgIGNvbnN0IHJlcGxhY2VtZW50cyA9IHtcbiAgICAgICAgICAneXl5eSc6IHllYXIudG9TdHJpbmcoKSxcbiAgICAgICAgICAneXknOiB5ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLFxuICAgICAgICAgICdNTSc6IG1vbnRoLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgICAnTSc6IG1vbnRoLnRvU3RyaW5nKCksXG4gICAgICAgICAgJ2RkJzogZGF5LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgICAnZCc6IGRheS50b1N0cmluZygpLFxuICAgICAgICAgICdISCc6IGhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxuICAgICAgICAgICdIJzogaG91ci50b1N0cmluZygpLFxuICAgICAgICAgICdoaCc6IChob3VyID4gMTIgPyBob3VyIC0gMTIgOiBob3VyKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXG4gICAgICAgICAgJ2gnOiAoaG91ciA+IDEyID8gaG91ciAtIDEyIDogaG91cikudG9TdHJpbmcoKSxcbiAgICAgICAgICAnbW0nOiBtaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxuICAgICAgICAgICdtJzogbWludXRlLnRvU3RyaW5nKCksXG4gICAgICAgICAgJ3NzJzogc2Vjb25kLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgICAncyc6IHNlY29uZC50b1N0cmluZygpLFxuICAgICAgICAgICdmZmYnOiBtaWxsaXNlY29uZC50b1N0cmluZygpLnBhZFN0YXJ0KDMsICcwJyksXG4gICAgICAgICAgJ3p6eic6ICh0aW1lWm9uZU9mZnNldCA+PSAwID8gJysnIDogJy0nKSArIE1hdGguYWJzKHRpbWVab25lT2Zmc2V0KS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnOjAwJ1xuICAgICAgICB9O1xuICAgICAgXG4gICAgICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgveXl5eXx5eXxNTXxNfGRkfGR8SEh8SHxoaHxofG1tfG18c3N8c3xmZmZ8enp6L2csIChtYXRjaCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudHNbbWF0Y2ggYXMga2V5b2YgdHlwZW9mIHJlcGxhY2VtZW50c10gfHwgbWF0Y2g7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICBcblxufSIsIlxuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IElGaWVsZCwgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJQ29udGV4dCwgSVZhck5hbWUgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IEZvcm1hdHRlciB9IGZyb20gXCIuLi91dGlsL2Zvcm1hdFwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7ICRmb3JtYXQ6IGFueTsgfSAgXG59XG5cbmludGVyZmFjZSBJQXV0b051bWJlcmluZ1Byb3Bze1xuICAgIC8v5paH5pu455Wq5Y+344KS5qC857SN44GZ44KLXG4gICAgZmllbGQ6SUZpZWxkO1xuICAgIGZvcm1hdDpzdHJpbmc7XG4gICAgcHJlZml4OnN0cmluZztcbiAgICBzdWZmaXg6c3RyaW5nO1xuICAgIHZlck5hbWU6SVZhck5hbWU7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRvTnVtYmVyaW5nIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklBdXRvTnVtYmVyaW5nUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi6Ieq5YuV5o6h55Wq44GZ44KLXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBmb3JtYXQ6JycsXG4gICAgICAgICAgICBwcmVmaXg6JycsXG4gICAgICAgICAgICBzdWZmaXg6JycsXG4gICAgICAgICAgICB2ZXJOYW1lOntuYW1lOicnfVxuICAgICAgICB9XG4gICAgICAgIGdsb2JhbFRoaXMud2luZG93LiRmb3JtYXQ9dGhpcy5mb3JtYXQ7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWHpueQhuOCkuWun+ijheOBmeOCi1xuICogQHBhcmFtIGFjdGlvbk5vZGUg44Ki44Kv44K344On44Oz44OO44O844OJXG4gKiBAcGFyYW0gZXZlbnQgS2ludG9uZeOBruOCpOODmeODs+ODiFxuICogQHBhcmFtIGNvbnRleHQg44Kz44Oz44OG44Kt44K544OI77yI44Os44Kz44O844OJ44CB5aSJ5pWw5oOF5aCx44KS5oyB44Gj44Gm44GE44KL77yJXG4gKiBAcmV0dXJucyBcbiAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDpmYWxzZSxcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2Zvcm1hdCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQXV0b051bWJlcmluZ1Byb3BzO1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgICAgICAgICAgY29uc3QgZG9jTnVtID0gYXdhaXQgdGhpcy5jcmVhdGVOdW1iZXIodGhpcy5wcm9wcyk7XG4gICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS52YWx1ZT1kb2NOdW07XG4gICAgICAgICAgICAvL+WkieaVsOioreWumlxuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lICYmIHRoaXMucHJvcHMudmVyTmFtZS5uYW1lIT09Jycpe1xuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT1kb2NOdW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjYW5OZXh0OmZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY1RlbXBsYXRlKHRlbXBsYXRlOnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBpZih0ZW1wbGF0ZT09PXVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCByZWdleCA9IC9cXCRcXHsoW159XSspXFx9L2c7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHJlZ2V4LChtYXRjaCxleHByKT0+e1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhlY0V2YWwobWF0Y2gsZXhwcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGV4ZWNFdmFsKG1hdGNoOnN0cmluZyxleHByOnN0cmluZyk6c3RyaW5ne1xuICAgICAgICBjb25zb2xlLmxvZyhtYXRjaCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGV2YWwoZXhwcik7XG4gICAgfVxuXG4gICAgZm9ybWF0KHBhdHRlcm46c3RyaW5nKTpzdHJpbmd7XG4gICAgICAgIGNvbnN0IG5vdz1uZXcgRGF0ZSgpO1xuICAgICAgICByZXR1cm4gRm9ybWF0dGVyLmRhdGVGb3JtYXQobm93LCBwYXR0ZXJuKTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVOdW1iZXIocHJvcHM6SUF1dG9OdW1iZXJpbmdQcm9wcyl7XG4gICAgICAgIGxldCBudW1iZXIgOnN0cmluZz0nJztcbiAgICAgICAgbGV0IHByZWZpeDpzdHJpbmc9Jyc7XG4gICAgICAgIGxldCBzdWZmaXg6c3RyaW5nPScnO1xuICAgICAgICBsZXQgbm89MTsgICAgIFxuICAgICAgICB0cnl7XG4gICAgICAgICAgICBubyA9IGF3YWl0IHRoaXMuZmV0Y2hObygpO1xuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHByb3BzLmZvcm1hdCE9PXVuZGVmaW5lZCAmJiBwcm9wcy5mb3JtYXQhPT0nJyl7XG4gICAgICAgICAgICBudW1iZXI9Rm9ybWF0dGVyLm51bWJlckZvcm1hdChubywgcHJvcHMuZm9ybWF0KTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBudW1iZXI9bm8udG9TdHJpbmcoMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocHJvcHMucHJlZml4IT09dW5kZWZpbmVkICYmIHByb3BzLnByZWZpeCE9PScnKXtcbiAgICAgICAgICAgIHByZWZpeD10aGlzLmV4ZWNUZW1wbGF0ZShwcm9wcy5wcmVmaXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocHJvcHMuc3VmZml4IT09dW5kZWZpbmVkICYmIHByb3BzLnN1ZmZpeCE9PScnKXtcbiAgICAgICAgICAgIHN1ZmZpeD10aGlzLmV4ZWNUZW1wbGF0ZShwcm9wcy5zdWZmaXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtudW1iZXJ9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaE5vKCk6UHJvbWlzZTxudW1iZXI+e1xuICAgICAgICBsZXQgcmVjTm89MTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IGtpbnRvbmUuUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLHJlamVjdCk9PntcbiAgICAgICAgICAgIGNvbnN0IGFwcHVybCA9IGtpbnRvbmUuYXBpLnVybCgnL2svdjEvcmVjb3JkcycsdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbXM9e1xuICAgICAgICAgICAgICAgIGFwcDpraW50b25lLmFwcC5nZXRJZCgpLFxuICAgICAgICAgICAgICAgIGZpZWxkczpbJyRpZCddLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OidsaW1pdCAxJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBraW50b25lLmFwaShhcHB1cmwsJ0dFVCcscGFyYW1zKS50aGVuKChyZXNwKT0+e1xuICAgICAgICAgICAgICAgIGlmKHJlc3AucmVjb3Jkc1swXSE9PW51bGwpe1xuICAgICAgICAgICAgICAgICAgICByZWNObyA9IHBhcnNlSW50KHJlc3AucmVjb3Jkc1swXS4kaWQudmFsdWUsMTApKzE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVjTm8pO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKT0+e1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxuICAgIFxufVxubmV3IEF1dG9OdW1iZXJpbmcoKTsiLCJpbXBvcnQgeyBJQ29udGV4dCxJQ29kZVZhbHVlIH0gZnJvbSBcIi4vQWN0aW9uVHlwZXNcIjtcblxuLy/jg47jg7zjg4nnqK7liKVcbmV4cG9ydCBlbnVtIE5vZGVUeXBle1xuICBSb290ID0gJ3Jvb3QnLFxuICBMb2dpY0dyb3VwID0nbG9naWNncm91cCcsXG4gIENvbmRpdGlvbiA9J2NvbmRpdGlvbidcbn1cblxuLy/jg63jgrjjg4Pjgq/jgqrjg5rjg6zjg7zjgr/jg7xcbmV4cG9ydCBlbnVtIExvZ2ljYWxPcGVyYXRvcntcbiAgQU5EID0gJ0FORCcsXG4gIE9SID0gJ09SJ1xufVxuXG4vL+adoeS7tuOCquODmuODrOODvOOCv+ODvFxuZXhwb3J0IGVudW0gT3BlcmF0b3J7XG4gIEVxdWFsID0gJz0nLFxuICBOb3RFcXVhbD0nIT0nLFxuICBHcmVhdGVyID0gJz4nLFxuICBHcmVhdGVyT3JFcXVhbCA9ICc+PScsXG4gIExlc3MgPSAnPCcsXG4gIExlc3NPckVxdWFsID0gJzw9JyxcbiAgQ29udGFpbnMgPSAnY29udGFpbnMnLFxuICBOb3RDb250YWlucyA9ICdub3QgY29udGFpbnMnLFxuICBTdGFydFdpdGggPSAnc3RhcnQgV2l0aCcsXG4gIEVuZFdpdGggPSAnZW5kIHdpdGgnLFxuICBOb3RTdGFydFdpdGggPSAnbm90IHN0YXJ0IHdpdGgnLFxuICBOb3RFbmRXaXRoID0gJ25vdCBlbmQgd2l0aCdcbn1cblxuXG4vLyBJTm9kZVxuZXhwb3J0IGludGVyZmFjZSBJTm9kZSB7XG4gIGluZGV4Om51bWJlcjtcbiAgdHlwZTogTm9kZVR5cGU7XG4gIGhlYWRlcjpzdHJpbmc7XG4gIHBhcmVudDogSU5vZGUgfCBudWxsO1xuICBsb2dpY2FsT3BlcmF0b3I6TG9naWNhbE9wZXJhdG9yXG59XG5cbi8vIOODreOCuOODg+OCr+ODjuODvOODiVxuZXhwb3J0IGNsYXNzIEdyb3VwTm9kZSBpbXBsZW1lbnRzIElOb2RlIHtcbiAgaW5kZXg6bnVtYmVyO1xuICB0eXBlOiBOb2RlVHlwZTtcbiAgY2hpbGRyZW46IElOb2RlW107XG4gIHBhcmVudDogSU5vZGUgfCBudWxsO1xuICBsb2dpY2FsT3BlcmF0b3I6IExvZ2ljYWxPcGVyYXRvcjtcbiAgZ2V0IGxhYmVsKCk6c3RyaW5ne1xuICAgIHJldHVybiB0aGlzLmxvZ2ljYWxPcGVyYXRvcjtcbiAgfVxuICBnZXQgaGVhZGVyKCk6c3RyaW5ne1xuICAgIHJldHVybiB0aGlzLnR5cGU9PT1Ob2RlVHlwZS5Sb290Pydyb290JzonZ2VuZXJpYyc7XG4gIH1cbiAgZ2V0IGV4cGFuZGVkKCk6Ym9vbGVhbntcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg+MDtcbiAgfVxuICBjb25zdHJ1Y3Rvcihsb2dpY09wOkxvZ2ljYWxPcGVyYXRvciwgcGFyZW50OiBJTm9kZSB8IG51bGwpIHtcbiAgICB0aGlzLmluZGV4PTA7XG4gICAgdGhpcy50eXBlID0gcGFyZW50PT1udWxsP05vZGVUeXBlLlJvb3Q6IE5vZGVUeXBlLkxvZ2ljR3JvdXA7XG4gICAgdGhpcy5sb2dpY2FsT3BlcmF0b3IgPSBsb2dpY09wO1xuICAgIHRoaXMucGFyZW50PXBhcmVudDtcbiAgICB0aGlzLmNoaWxkcmVuPVtdO1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb246IGFueSwgcGFyZW50OiBJTm9kZSB8IG51bGwgPSBudWxsKTogR3JvdXBOb2RlIHtcbiAgICBjb25zdCBub2RlID0gbmV3IEdyb3VwTm9kZShqc29uLmxvZ2ljYWxPcGVyYXRvciwgcGFyZW50KTtcbiAgICBub2RlLmluZGV4PWpzb24uaW5kZXg7XG4gICAgbm9kZS5jaGlsZHJlbiA9IGpzb24uY2hpbGRyZW4ubWFwKChjaGlsZEpzb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGNoaWxkSnNvbi50eXBlID09PSBOb2RlVHlwZS5Mb2dpY0dyb3VwXG4gICAgICAgID8gR3JvdXBOb2RlLmZyb21KU09OKGNoaWxkSnNvbiwgbm9kZSlcbiAgICAgICAgOiBDb25kaXRpb25Ob2RlLmZyb21KU09OKGNoaWxkSnNvbiwgbm9kZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxufVxuXG4vLyDmnaHku7blvI/jg47jg7zjg4lcbmV4cG9ydCBjbGFzcyBDb25kaXRpb25Ob2RlIGltcGxlbWVudHMgSU5vZGUge1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBOb2RlVHlwZTtcbiAgcGFyZW50OklOb2RlO1xuICBnZXQgbG9naWNhbE9wZXJhdG9yKCk6IExvZ2ljYWxPcGVyYXRvcntcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQubG9naWNhbE9wZXJhdG9yO1xuICB9O1xuICBvYmplY3Q6IGFueTsgLy8g5q+U6LyD5YWDXG4gIG9wZXJhdG9yOiBPcGVyYXRvcjsgLy8g5q+U6LyD5a2QXG4gIHZhbHVlOiBhbnk7XG4gIGdldCBoZWFkZXIoKTpzdHJpbmd7XG4gICAgcmV0dXJuICdnZW5lcmljJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG9iamVjdDogYW55LCBvcGVyYXRvcjogT3BlcmF0b3IsIHZhbHVlOiBhbnksIHBhcmVudDogR3JvdXBOb2RlKSB7XG4gICAgdGhpcy5pbmRleD0wO1xuICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkNvbmRpdGlvbjtcbiAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMucGFyZW50PXBhcmVudDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBhbnksIHBhcmVudDogR3JvdXBOb2RlKTogQ29uZGl0aW9uTm9kZSB7XG4gICAgY29uc3Qgbm9kZT0gbmV3IENvbmRpdGlvbk5vZGUoXG4gICAgICBqc29uLm9iamVjdCxcbiAgICAgIGpzb24ub3BlcmF0b3IsXG4gICAgICBqc29uLnZhbHVlLFxuICAgICAgcGFyZW50XG4gICAgKTtcbiAgICBub2RlLmluZGV4PWpzb24uaW5kZXg7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiDmnaHku7blvI/jga7nrqHnkIbjgq/jg6njgrlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbmRpdGlvblRyZWUge1xuICByb290OiBHcm91cE5vZGU7XG4gIG1heEluZGV4Om51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1heEluZGV4PTA7XG4gICAgdGhpcy5yb290ID0gbmV3IEdyb3VwTm9kZShMb2dpY2FsT3BlcmF0b3IuQU5ELCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg47jg7zjg4nov73liqBcbiAgICogQHBhcmFtIHBhcmVudCBcbiAgICogQHBhcmFtIG5vZGUgXG4gICAqL1xuICBhZGROb2RlKHBhcmVudDogR3JvdXBOb2RlLCBub2RlOiBJTm9kZSk6IHZvaWQge1xuICAgIHRoaXMubWF4SW5kZXgrKztcbiAgICBub2RlLmluZGV4PXRoaXMubWF4SW5kZXg7XG4gICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gIH1cblxuICAvKipcbiAgICogIOODjuODvOODieWJiumZpFxuICAgKiBAcGFyYW0gbm9kZSBcbiAgICovXG4gIHJlbW92ZU5vZGUobm9kZTogSU5vZGUpOiB2b2lkIHtcbiAgICBpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcign44Or44O844OI44OO44O844OJ5YmK6Zmk44Gn44GN44G+44Gb44KTJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50IGFzIEdyb3VwTm9kZTtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZSk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuLyoqXG4gKiDmnaHku7bjg4Tjg6rjg7zjgYvjgonjgqTjg7Pjg4fjgqPjgq/jgrnlgKTjgafmnaHku7bjg47jg7zjg4njgpLmpJzntKLjgZnjgotcbiAqIEBwYXJhbSBpbmRleCBcbiAqIEByZXR1cm5zIFxuICovXG4gIGZpbmRCeUluZGV4KGluZGV4Om51bWJlcik6SU5vZGV8dW5kZWZpbmVke1xuICAgIHJldHVybiB0aGlzLmZpbmRDaGlsZHJlbih0aGlzLnJvb3QsaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaMh+WumuOBruODjuODvOODieOCsOODq+ODvOODl+OBi+OCieOCpOODs+ODh+OCo+OCr+OCueWApOOBp+adoeS7tuODjuODvOODieOCkuaknOe0ouOBmeOCi1xuICAgKiBAcGFyYW0gcGFyZW50IFxuICAgKiBAcGFyYW0gaW5kZXggXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZmluZENoaWxkcmVuKHBhcmVudDogR3JvdXBOb2RlLCBpbmRleDogbnVtYmVyKTogSU5vZGUgfCB1bmRlZmluZWQge1xuICAgIGlmIChwYXJlbnQuaW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgcGFyZW50LmNoaWxkcmVuKSB7XG4gICAgICBpZiAobm9kZS5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS50eXBlICE9PSBOb2RlVHlwZS5Db25kaXRpb24pIHtcbiAgICAgICAgY29uc3QgZm91bmROb2RlID0gdGhpcy5maW5kQ2hpbGRyZW4obm9kZSBhcyBHcm91cE5vZGUsIGluZGV4KTtcbiAgICAgICAgaWYgKGZvdW5kTm9kZSkge1xuICAgICAgICAgIHJldHVybiBmb3VuZE5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIG5vZGUg5pyA5aSn44Gu44Kk44Oz44OH44Kj44Kv44K55YCk44KS5Y+W5b6X44GZ44KLXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZ2V0TWF4SW5kZXgobm9kZTpJTm9kZSk6bnVtYmVye1xuICAgIGxldCBtYXhJbmRleDpudW1iZXI9bm9kZS5pbmRleDtcbiAgICBpZihub2RlLnR5cGUhPT1Ob2RlVHlwZS5Db25kaXRpb24pe1xuICAgICAgY29uc3QgZ3JvdXBOb2RlID0gbm9kZSBhcyBHcm91cE5vZGU7XG4gICAgICBncm91cE5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpPT57XG4gICAgICAgICAgY29uc3QgY2hpbGRNYXggPSB0aGlzLmdldE1heEluZGV4KGNoaWxkKTtcbiAgICAgICAgICBpZihjaGlsZE1heD5tYXhJbmRleCl7XG4gICAgICAgICAgICBtYXhJbmRleD1jaGlsZE1heDtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1heEluZGV4O1xufVxuXG4gIC8qKlxuICAgKiDmnaHku7blvI/jgpLooajnpLrjgZnjgotcbiAgICogQHBhcmFtIG5vZGUg5p2h5Lu244OO44O844OJXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgYnVpbGRDb25kaXRpb25TdHJpbmcobm9kZTpJTm9kZSl7XG4gICAgaWYgKG5vZGUudHlwZSAhPT0gTm9kZVR5cGUuQ29uZGl0aW9uKSB7XG4gICAgICBsZXQgY29uZGl0aW9uU3RyaW5nID0gJygnO1xuICAgICAgY29uc3QgZ3JvdXBOb2RlID0gbm9kZSBhcyBHcm91cE5vZGU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwTm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZENvbmRpdGlvblN0cmluZyA9IHRoaXMuYnVpbGRDb25kaXRpb25TdHJpbmcoZ3JvdXBOb2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgaWYgKGNoaWxkQ29uZGl0aW9uU3RyaW5nICE9PSAnJykge1xuICAgICAgICAgIGNvbmRpdGlvblN0cmluZyArPSBjaGlsZENvbmRpdGlvblN0cmluZztcbiAgICAgICAgICBpZiAoaSA8IGdyb3VwTm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBjb25kaXRpb25TdHJpbmcgKz0gYCAke2dyb3VwTm9kZS5sb2dpY2FsT3BlcmF0b3J9IGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25kaXRpb25TdHJpbmcgKz0gJyknO1xuICAgICAgcmV0dXJuIGNvbmRpdGlvblN0cmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29uZE5vZGU9bm9kZSBhcyBDb25kaXRpb25Ob2RlO1xuICAgICAgaWYgKGNvbmROb2RlLm9iamVjdCAmJiBjb25kTm9kZS5vcGVyYXRvciApIHtcbiAgICAgICAgbGV0IHZhbHVlPWNvbmROb2RlLnZhbHVlO1xuICAgICAgICBpZih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09J29iamVjdCcgJiYgKCdsYWJlbCcgaW4gdmFsdWUpKXtcbiAgICAgICAgICAgIHZhbHVlID1jb25kTm9kZS52YWx1ZS5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Y29uZE5vZGUub2JqZWN0Lm5hbWV9ICR7Y29uZE5vZGUub3BlcmF0b3J9ICcke3ZhbHVlfSdgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICog44GZ44G544Gm5p2h5Lu25byP44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBnZXRDb25kaXRpb25zKHBhcmVudDpHcm91cE5vZGUpOkNvbmRpdGlvbk5vZGVbXXtcbiAgICBjb25zdCBjb25kaU5vZGVzOkNvbmRpdGlvbk5vZGVbXT1bXTtcbiAgICBwYXJlbnQuY2hpbGRyZW4uZm9yRWFjaCgobm9kZSk9PntcbiAgICAgIGlmKG5vZGUudHlwZT09PU5vZGVUeXBlLkNvbmRpdGlvbil7XG4gICAgICAgIGNvbmRpTm9kZXMucHVzaChub2RlIGFzIENvbmRpdGlvbk5vZGUpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGNvbmRpTm9kZXMucHVzaCguLi50aGlzLmdldENvbmRpdGlvbnMobm9kZSBhcyBHcm91cE5vZGUpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29uZGlOb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHBhcmVudCDjgZnjgbnjgabmnaHku7bjgrDjg6vjg7zjg5fjgpLlj5blvpfjgZnjgotcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBnZXRHcm91cHMocGFyZW50Okdyb3VwTm9kZSk6bnVtYmVyW117XG4gICAgY29uc3QgZ3JvdXBzOm51bWJlcltdPVtdO1xuICAgIGdyb3Vwcy5wdXNoKHBhcmVudC5pbmRleCk7XG4gICAgcGFyZW50LmNoaWxkcmVuLmZvckVhY2goKG5vZGUpPT57XG4gICAgICBpZihub2RlLnR5cGUhPT1Ob2RlVHlwZS5Db25kaXRpb24pe1xuICAgICAgICBncm91cHMucHVzaCguLi50aGlzLmdldEdyb3Vwcyhub2RlIGFzIEdyb3VwTm9kZSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICAvKipcbiAgICogSnNvbuOBi+OCieW+qeWFg1xuICAgKiBAcGFyYW0ganNvblN0cmluZyBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBmcm9tSnNvbihqc29uU3RyaW5nOiBzdHJpbmcpOiBJTm9kZSB7XG4gICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XG4gICAgdGhpcy5yb290ID0gR3JvdXBOb2RlLmZyb21KU09OKGpzb24pIGFzIEdyb3VwTm9kZTtcbiAgICB0aGlzLm1heEluZGV4PXRoaXMuZ2V0TWF4SW5kZXgodGhpcy5yb290KTtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG4gIC8qKlxuICAgKiBKU09O5paH5a2X5YiX44Gr5aSJ5o+b44GZ44KLXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgdG9Kc29uKCk6c3RyaW5ne1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3QsIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAncGFyZW50Jykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPyB2YWx1ZS50eXBlIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnaHku7blvI/jgpLoqIjnrpfjgZnjgotcbiAgICogQHBhcmFtIG5vZGUgXG4gICAqIEBwYXJhbSBjb250ZXh0IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIGV2YWx1YXRlKG5vZGU6IElOb2RlLCBjb250ZXh0OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZS5Db25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKG5vZGUgYXMgQ29uZGl0aW9uTm9kZSwgY29udGV4dCk7XG4gICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlLkxvZ2ljR3JvdXAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZS5Sb290KSB7XG4gICAgICBjb25zdCBncm91cE5vZGUgPSBub2RlIGFzIEdyb3VwTm9kZTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBncm91cE5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHRoaXMuZXZhbHVhdGUoY2hpbGQsIGNvbnRleHQpKTtcbiAgXG4gICAgICBpZiAoZ3JvdXBOb2RlLmxvZ2ljYWxPcGVyYXRvciA9PT0gTG9naWNhbE9wZXJhdG9yLkFORCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeShyZXN1bHQgPT4gcmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXBOb2RlLmxvZ2ljYWxPcGVyYXRvciA9PT0gTG9naWNhbE9wZXJhdG9yLk9SKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzLnNvbWUocmVzdWx0ID0+IHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGxvZ2ljYWwgb3BlcmF0b3InKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBub2RlIHR5cGUnKTtcbiAgICB9XG4gIH1cblxuXG4gIGdldENvZGVWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnY29kZScgaW4gdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5jb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElDb2RlVmFsdWXlnovjga5jb2Rl44Gr5aSJ5o+b44GZ44KLXG4gICAqIEBwYXJhbSB2YWx1ZSBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBjb252ZXJ0Q29kZVZhbHVlKHZhbHVlOmFueSk6YW55e1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHRoaXMuZ2V0Q29kZVZhbHVlKHYpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29kZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0gdmFycyDlpInmlbDlgKTjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIHBhdGggXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZ2V0Q29udGV4dFZhckJ5UGF0aCAodmFyczoge1trZXk6c3RyaW5nXTphbnl9LCBwYXRoOiBzdHJpbmcpe1xuICAgIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgdmFycyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbmRpdGlvbiBvYmplY3Tjga7lgKTjgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIG9iamVjdCBcbiAgICogQHBhcmFtIGNvbnRleHQgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgZ2V0T2JqZWN0VmFsdWUob2JqZWN0OmFueSxjb250ZXh0OklDb250ZXh0KXtcbiAgICBpZighb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QhPT1cIm9iamVjdFwiIHx8ICEoXCJvYmplY3RUeXBlXCIgaW4gb2JqZWN0KSl7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmKG9iamVjdC5vYmplY3RUeXBlPT09J2ZpZWxkJyl7XG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gY29udGV4dC5yZWNvcmRbb2JqZWN0LmNvZGVdO1xuICAgICAgaWYoZmllbGRWYWx1ZS50eXBlPT09J05VTUJFUicgJiYgZmllbGRWYWx1ZS52YWx1ZSE9PXVuZGVmaW5lZCl7XG4gICAgICAgIHJldHVybiBOdW1iZXIoZmllbGRWYWx1ZS52YWx1ZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydENvZGVWYWx1ZShmaWVsZFZhbHVlLnZhbHVlKTtcbiAgICAgIH0gICAgICBcbiAgICB9ZWxzZSBpZihvYmplY3Qub2JqZWN0VHlwZT09PSd2YXJpYWJsZScpe1xuICAgICAgY29uc3QgdmFyVmFsdWUgPSB0aGlzLmdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMsb2JqZWN0Lm5hbWUubmFtZSk7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Q29kZVZhbHVlKHZhclZhbHVlKTtcbiAgICB9ZWxzZSBpZihvYmplY3Qub2JqZWN0VHlwZT09PSd0ZXh0Jyl7XG4gICAgICByZXR1cm4gb2JqZWN0LnNoYXJlZFRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOavlOi8g+OCquODluOCuOOCp+OCr+ODiOOBruWApOOCkuWPluW+l1xuICAgKiBAcGFyYW0gb2JqZWN0IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIGdldENvbmRpdGlvblZhbHVlKG9iamVjdDphbnksY29udGV4dDpJQ29udGV4dCl7XG4gICAgaWYoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0IT09XCJvYmplY3RcIil7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cbiAgICBpZihcIm9iamVjdFR5cGVcIiBpbiBvYmplY3Qpe1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0VmFsdWUob2JqZWN0LGNvbnRleHQpO1xuICAgIH1cbiAgICBpZihcInNoYXJlZFRleHRcIiBpbiBvYmplY3Qpe1xuICAgICAgcmV0dXJuIG9iamVjdC5zaGFyZWRUZXh0O1xuICAgIH1cbiAgICBpZihcImxhYmVsXCIgaW4gb2JqZWN0KXtcbiAgICAgIHJldHVybiBvYmplY3QubGFiZWw7XG4gICAgfVxuICAgIGlmKFwidmFsdWVcIiBpbiBvYmplY3Qpe1xuICAgICAgcmV0dXJuIG9iamVjdC52YWx1ZTtcbiAgICB9XG4gICAgaWYoXCJuYW1lXCIgaW4gb2JqZWN0KXtcbiAgICAgIHJldHVybiBvYmplY3QubmFtZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5p2h5Lu25byP44KS6KiI566X44GZ44KLXG4gICAqIEBwYXJhbSBjb25kaXRpb24gXG4gICAqIEBwYXJhbSBjb250ZXh0IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIGV2YWx1YXRlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uTm9kZSwgY29udGV4dDogSUNvbnRleHQpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IG9iamVjdCwgb3BlcmF0b3IsIHZhbHVlIH0gPSBjb25kaXRpb247XG4gICAgY29uc3QgdGFyZ2V0T2JqZWN0ID0gdGhpcy5nZXRPYmplY3RWYWx1ZShvYmplY3QsY29udGV4dCk7XG4gICAgY29uc3QgY29uZGl0aW9uT2JqZWN0ID0gdGhpcy5nZXRDb25kaXRpb25WYWx1ZSh2YWx1ZSxjb250ZXh0KTtcbiAgICBjb25zdCBpc0FycmF5VGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh0YXJnZXRPYmplY3QpO1xuICAgIGNvbnN0IGlzQXJyYXlWYWx1ZSA9IEFycmF5LmlzQXJyYXkoY29uZGl0aW9uT2JqZWN0KTtcbiAgICAvL+mFjeWIl+OBruavlOi8g1xuICAgIGlmKChpc0FycmF5VGFyZ2V0ICYmIHRhcmdldE9iamVjdC5sZW5ndGggPiAxKXx8KGlzQXJyYXlWYWx1ZSAmJiBjb25kaXRpb25PYmplY3QubGVuZ3RoPjEpKXtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVBcnJheShvcGVyYXRvcix0YXJnZXRPYmplY3QsY29uZGl0aW9uT2JqZWN0KVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IGlzQXJyYXlUYXJnZXQ/dGFyZ2V0T2JqZWN0WzBdOnRhcmdldE9iamVjdDtcbiAgICBjb25zdCBjb25kaXRpb25WYWx1ZSA9IGlzQXJyYXlWYWx1ZT9jb25kaXRpb25PYmplY3RbMF06Y29uZGl0aW9uT2JqZWN0O1xuICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgIGNhc2UgT3BlcmF0b3IuRXF1YWw6XG4gICAgICBjYXNlIE9wZXJhdG9yLk5vdEVxdWFsOlxuICAgICAgY2FzZSBPcGVyYXRvci5HcmVhdGVyOlxuICAgICAgY2FzZSBPcGVyYXRvci5HcmVhdGVyT3JFcXVhbDpcbiAgICAgIGNhc2UgT3BlcmF0b3IuTGVzczpcbiAgICAgIGNhc2UgT3BlcmF0b3IuTGVzc09yRXF1YWw6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUob3BlcmF0b3IsdGFyZ2V0VmFsdWUsIGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuQ29udGFpbnM6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zKHRhcmdldFZhbHVlLGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuTm90Q29udGFpbnM6XG4gICAgICAgIHJldHVybiAhdGhpcy5jb250YWlucyh0YXJnZXRWYWx1ZSxjb25kaXRpb25WYWx1ZSk7XG4gICAgICBjYXNlIE9wZXJhdG9yLlN0YXJ0V2l0aDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRXaXRoKHRhcmdldFZhbHVlLGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuTm90U3RhcnRXaXRoOlxuICAgICAgICByZXR1cm4gIXRoaXMuc3RhcnRXaXRoKHRhcmdldFZhbHVlLGNvbmRpdGlvblZhbHVlKTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuRW5kV2l0aDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kc1dpdGgodGFyZ2V0VmFsdWUsY29uZGl0aW9uVmFsdWUpO1xuICAgICAgY2FzZSBPcGVyYXRvci5Ob3RFbmRXaXRoOlxuICAgICAgICByZXR1cm4gdGhpcy5lbmRzV2l0aCh0YXJnZXRWYWx1ZSxjb25kaXRpb25WYWx1ZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdG9yJyk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICog5q+U6LyD44KS5a6f6KGM44GZ44KLXG4gICAqIEBwYXJhbSBvcGVyYXRvciBcbiAgICogQHBhcmFtIHRhcmdldFZhbHVlIFxuICAgKiBAcGFyYW0gdmFsdWUgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgY29tcGFyZShvcGVyYXRvcjogT3BlcmF0b3IsIHRhcmdldFZhbHVlOiBhbnksIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyB0YXJnZXRWYWx1ZSDjga/ml6XmnJ/ml7bvvIx2YWx1ZSDjgoLml6XmnJ/jgavlpInmj5vjgZfjgabmr5TovIPjgZnjgotcbiAgICBpZih0YXJnZXRWYWx1ZT09PXVuZGVmaW5lZCB8fCB0YXJnZXRWYWx1ZT09PW51bGx8fHRhcmdldFZhbHVlPT09Jycpe1xuICAgICAgaWYodmFsdWU9PT11bmRlZmluZWQgfHwgdmFsdWU9PT1udWxsfHx2YWx1ZT09PScnKXtcbiAgICAgICAgdGFyZ2V0VmFsdWU9Jyc7XG4gICAgICAgIHZhbHVlPScnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBjb25zdCBkYXRlVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKGRhdGVWYWx1ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHZhbHVlID0gZGF0ZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvL3RhcmdldFZhbHVl44Gv5pWw5YCk5pmC77yMdmFsdWUg44KS5pWw5YCk44Gr5aSJ5o+b44GZ44KLXG4gICAgZWxzZSBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgbnVtYmVyVmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKCFpc05hTihudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBudW1iZXJWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICBjYXNlIE9wZXJhdG9yLkVxdWFsOlxuICAgICAgICByZXR1cm4gdGFyZ2V0VmFsdWUgPT09IHZhbHVlO1xuICAgICAgY2FzZSBPcGVyYXRvci5Ob3RFcXVhbDpcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlICE9PSB2YWx1ZTtcbiAgICAgIGNhc2UgT3BlcmF0b3IuR3JlYXRlcjpcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlID4gdmFsdWU7XG4gICAgICBjYXNlIE9wZXJhdG9yLkdyZWF0ZXJPckVxdWFsOlxuICAgICAgICByZXR1cm4gdGFyZ2V0VmFsdWUgPj0gdmFsdWU7XG4gICAgICBjYXNlIE9wZXJhdG9yLkxlc3M6XG4gICAgICAgIHJldHVybiB0YXJnZXRWYWx1ZSA8IHZhbHVlO1xuICAgICAgY2FzZSBPcGVyYXRvci5MZXNzT3JFcXVhbDpcbiAgICAgICAgcmV0dXJuIHRhcmdldFZhbHVlIDw9IHZhbHVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBvcGVyYXRvciBmb3IgY29tcGFyaXNvbicpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIOmFjeWIl+WApOOBruavlOi8g1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgXG4gICAqIEBwYXJhbSB0YXJnZXRWYWx1ZSBcbiAgICogQHBhcmFtIHZhbHVlIFxuICAgKi9cbiAvKipcbiAqIOmFjeWIl+WApOOBruavlOi8g1xuICogQHBhcmFtIG9wZXJhdG9yIFxuICogQHBhcmFtIHRhcmdldFZhbHVlIFxuICogQHBhcmFtIHZhbHVlIFxuICovXG4gY29tcGFyZUFycmF5KG9wZXJhdG9yOiBPcGVyYXRvciwgdGFyZ2V0VmFsdWU6IGFueSwgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCBpc0FycmF5VGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh0YXJnZXRWYWx1ZSk7XG4gIGNvbnN0IGlzQXJyYXlWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICBjb25zdCBzb3J0QXJyYXkgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLnNsaWNlKCkuc29ydCgpO1xuICB0YXJnZXRWYWx1ZSA9IGlzQXJyYXlUYXJnZXQ/dGFyZ2V0VmFsdWU6W3RhcmdldFZhbHVlXTtcbiAgdmFsdWU9IGlzQXJyYXlWYWx1ZT92YWx1ZTpbdmFsdWVdO1xuICBjb25zdCB0YXJnZXRBcnJheT1zb3J0QXJyYXkodGFyZ2V0VmFsdWUpO1xuICBjb25zdCB2YWx1ZUFycmF5PXNvcnRBcnJheSh2YWx1ZSk7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlIE9wZXJhdG9yLkVxdWFsOlxuICAgICAgcmV0dXJuICB0YXJnZXRBcnJheS5sZW5ndGg9PT12YWx1ZUFycmF5Lmxlbmd0aCAmJiB0YXJnZXRBcnJheS5ldmVyeSgodiwgaSkgPT4gdiA9PT0gdmFsdWVBcnJheVtpXSk7XG4gICAgY2FzZSBPcGVyYXRvci5Ob3RFcXVhbDpcbiAgICAgIHJldHVybiB0YXJnZXRBcnJheS5sZW5ndGghPT12YWx1ZUFycmF5Lmxlbmd0aCB8fCAhdGFyZ2V0QXJyYXkuZXZlcnkoKHYsIGkpID0+IHYgPT09IHZhbHVlQXJyYXlbaV0pO1xuICAgIGNhc2UgT3BlcmF0b3IuQ29udGFpbnM6XG4gICAgICByZXR1cm4gdmFsdWVBcnJheS5sZW5ndGg+MCAmJiB2YWx1ZUFycmF5LmV2ZXJ5KHYgPT4gdGFyZ2V0QXJyYXkuaW5jbHVkZXModikpO1xuICAgIGNhc2UgT3BlcmF0b3IuTm90Q29udGFpbnM6XG4gICAgICByZXR1cm4gdmFsdWVBcnJheS5sZW5ndGg9PT0wIHx8ICF2YWx1ZUFycmF5LmV2ZXJ5KHYgPT4gdGFyZ2V0QXJyYXkuaW5jbHVkZXModikpO1xuICAgIGRlZmF1bHQ6XG4gICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4gIC8qKlxuICAgKiDlkKvjgoDoqIjnrpdcbiAgICogQHBhcmFtIHRhcmdldFZhbHVlIFxuICAgKiBAcGFyYW0gdmFsdWUgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgY29udGFpbnModGFyZ2V0VmFsdWU6IGFueSwgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0YXJnZXRWYWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAgLyoqXG4gICAqIFN0YXJ0V2l0aOioiOeul1xuICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgXG4gICAqIEBwYXJhbSB2YWx1ZSBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdGFydFdpdGgodGFyZ2V0VmFsdWU6IGFueSwgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0YXJnZXRWYWx1ZS5zdGFydHNXaXRoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBFbmRzV2l0aOioiOeul1xuICAgKiBAcGFyYW0gdGFyZ2V0VmFsdWUgXG4gICAqIEBwYXJhbSB2YWx1ZSBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBlbmRzV2l0aCh0YXJnZXRWYWx1ZTogYW55LCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRWYWx1ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRhcmdldFZhbHVlLmVuZHNXaXRoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSVNob3duUHJvcHN7XG4gICAgZmllbGQ6SUZpZWxkO1xuICAgIHNob3c6c3RyaW5nOyBcbiAgICBjb25kaXRpb246c3RyaW5nO1xufVxuLyoqXG4gKiDooajnpLrvvI/pnZ7ooajnpLrjgqLjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIEZpZWxkU2hvd25BY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gICAgcHJvcHM6SVNob3duUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi6KGo56S677yP6Z2e6KGo56S6XCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBzaG93OicnLFxuICAgICAgICAgICAgY29uZGl0aW9uOicnXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnc2hvdycgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJU2hvd25Qcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLmdldENvbmRpdGlvblJlc3VsdChjb250ZXh0KTtcbiAgICAgICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5zaG93PT09J+ihqOekuicpe1xuICAgICAgICAgICAgICAgICAgICBraW50b25lLmFwcC5yZWNvcmQuc2V0RmllbGRTaG93bih0aGlzLnByb3BzLmZpZWxkLmNvZGUsdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYgKHRoaXMucHJvcHMuc2hvdz09PSfpnZ7ooajnpLonKXtcbiAgICAgICAgICAgICAgICAgICAga2ludG9uZS5hcHAucmVjb3JkLnNldEZpZWxkU2hvd24odGhpcy5wcm9wcy5maWVsZC5jb2RlLGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH1cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IOadoeS7tuW8j+OCkuWun+ihjOOBmeOCi1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQ6YW55KTpib29sZWFue1xuICAgICAgICBjb25zdCB0cmVlID10aGlzLmdldENvbmRpdGlvbih0aGlzLnByb3BzLmNvbmRpdGlvbik7XG4gICAgICAgIGlmKCF0cmVlKXtcbiAgICAgICAgICAgIC8v5p2h5Lu244KS6Kit5a6a44GV44KM44Gm44GE44G+44Gb44KTXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZSh0cmVlLnJvb3QsY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiDmnaHku7blvI/jg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldENvbmRpdGlvbihjb25kaXRpb246c3RyaW5nKTpDb25kaXRpb25UcmVlfG51bGx7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgQ29uZGl0aW9uVHJlZSgpO1xuICAgICAgICAgICAgdHJlZS5mcm9tSnNvbihjb25kaXRpb24pO1xuICAgICAgICAgICAgaWYodHJlZS5nZXRDb25kaXRpb25zKHRyZWUucm9vdCkubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbn1cbm5ldyBGaWVsZFNob3duQWN0aW9uKCk7IiwiXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgSUFjdGlvbiwgSUFjdGlvblByb3BlcnR5LCBJQWN0aW9uTm9kZSwgSUNvbnRleHQsIElBY3Rpb25SZXN1bHQgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IENvbmRpdGlvblRyZWUgfSBmcm9tICcuLi90eXBlcy9Db25kaXRpb25zJztcbi8qKlxuICog44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXG4gKi9cbmludGVyZmFjZSBJRXJyb3JTaG93UHJvcHMge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBjb25kaXRpb246IHN0cmluZztcbn0gICBcblxuZXhwb3J0IGNsYXNzIEVycm9yU2hvd0FjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xuICAgIG5hbWU6IHN0cmluZzsgXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdOyAvL+iwg+eUqOS7jmltcG9ydOWvvOWFpeWFs+S6juaYvuekuuexu+eahOWumuS5iVxuICAgIHByb3BzOiBJRXJyb3JTaG93UHJvcHM7Ly/ku47kuIrmlrnnmoRpbnRlcmZhY2Ug5a6a5LmJ6L+Z5LiqcHJvcHPmiYDpnIDopoHmjqXlj5fnmoTlsZ7mgKdcbiAgICBjb25zdHJ1Y3RvcigpIHsgLy/op6PmnoTlh73mlbDlrprkuYnpnIDopoHnmoTnsbvlkI1cbiAgICAgICAgdGhpcy5uYW1lID0gXCLjgqjjg6njg7zooajnpLpcIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xuICAgICAgICB0aGlzLnByb3BzID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgICAgICBjb25kaXRpb246ICcnXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcigpOyAvL+mHjee9ruS7peS4iuazqOWGjOihqFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxuICAgICAqIEBwYXJhbSBldmVudCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LCBjb250ZXh0OiBJQ29udGV4dCk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4geyBcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgXG4gICAgICAgICAgICBjYW5OZXh0OiB0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnkgeyBcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2NvbmRpdGlvbicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHsgLy/lpoLmnpxtZXNzYWdl5Lul5Y+KY29uZGl0aW9u5Lik6ICF6YO95LiN5a2Y5Zyo55qE5oOF5Ya15LiLcmV0dXJuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUVycm9yU2hvd1Byb3BzOyBcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQpOyBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5p2h5Lu257WQ5p6c77yaXCIsY29uZGl0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25SZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBldmVudC5lcnJvciA9IHRoaXMucHJvcHMubWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICB9XG4gICAgLyoqXG4gICAgKiBcbiAgICAqIEBwYXJhbSBjb250ZXh0IOadoeS7tuW8j+OCkuWun+ihjOOBmeOCi1xuICAgICogQHJldHVybnMgXG4gICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLmdldENvbmRpdGlvbih0aGlzLnByb3BzLmNvbmRpdGlvbik7XG4gICAgICAgIGlmICghdHJlZSkge1xuICAgICAgICAgICAgLy/mnaHku7bjgpLoqK3lrprjgZXjgozjgabjgYTjgb7jgZvjgpNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmVlLmV2YWx1YXRlKHRyZWUucm9vdCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiDmnaHku7blvI/jg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb24oY29uZGl0aW9uOiBzdHJpbmcpOiBDb25kaXRpb25UcmVlIHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0cmVlID0gbmV3IENvbmRpdGlvblRyZWUoKTtcbiAgICAgICAgICAgIHRyZWUuZnJvbUpzb24oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIGlmICh0cmVlLmdldENvbmRpdGlvbnModHJlZS5yb290KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xuICAgIH1cblxufVxubmV3IEVycm9yU2hvd0FjdGlvbigpOyIsIlxuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBJQWN0aW9uLCBJQWN0aW9uUHJvcGVydHksIElBY3Rpb25Ob2RlLCBJQWN0aW9uUmVzdWx0LCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IFwiLi9idXR0b24tYWRkLmNzc1wiO1xuXG4vKipcbiAqIOODnOOCv+ODs+mFjee9ruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSUJ1dHRvbkFkZFByb3BzIHtcbiAgICAvL+ODnOOCv+ODs+ihqOekuuWQjVxuICAgIGJ1dHRvbk5hbWU6IHN0cmluZztcbiAgICBzcGFjZT86SVNwYWNlO1xuICAgIC8v6YWN572u5L2N572uXG4gICAgcG9zaXRpb246IHN0cmluZztcbiAgICAvL+OCpOODmeODs+ODiOWQjVxuICAgIGV2ZW50TmFtZTpzdHJpbmdcbn0gICBcblxuaW50ZXJmYWNlIElTcGFjZXtcbiAgICB0eXBlOnN0cmluZyxcbiAgICBlbGVtZW50SWQ6c3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBCdXR0b25BZGRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcbiAgICBuYW1lOiBzdHJpbmc7IFxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTsgXG4gICAgcHJvcHM6IElCdXR0b25BZGRQcm9wcztcbiAgICBjb25zdHJ1Y3RvcigpIHsgXG4gICAgICAgIHRoaXMubmFtZSA9IFwi44Oc44K/44Oz44Gu6YWN572uXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcbiAgICAgICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgICAgICAgIGJ1dHRvbk5hbWU6ICcnLFxuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxuICAgICAgICAgICAgZXZlbnROYW1lOicnXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxuICAgICAqIEBwYXJhbSBldmVudCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LGNvbnRleHQ6SUNvbnRleHQpOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHsgXG4gICAgICAgIGxldCByZXN1bHQgPSB7IFxuICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHsgXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzID0gYWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdidXR0b25OYW1lJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSAmJiAhKCdwb3NpdGlvbicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHsgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUJ1dHRvbkFkZFByb3BzOyBcbiAgICAgICAgICAgIC8v44Oc44K/44Oz44KS6YWN572u44GZ44KLXG4gICAgICAgICAgICBsZXQgYnV0dG9uU3BhY2U7XG4gICAgICAgICAgICBpZih0aGlzLnByb3BzLnNwYWNlICYmIHRoaXMucHJvcHMuc3BhY2UuZWxlbWVudElkKXtcbiAgICAgICAgICAgICAgICBidXR0b25TcGFjZSA9IGtpbnRvbmUuYXBwLnJlY29yZC5nZXRTcGFjZUVsZW1lbnQodGhpcy5wcm9wcy5zcGFjZS5lbGVtZW50SWQpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgYnV0dG9uU3BhY2UgPSBraW50b25lLmFwcC5yZWNvcmQuZ2V0SGVhZGVyTWVudVNwYWNlRWxlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIWJ1dHRvblNwYWNlKSByZXR1cm4gcmVzdWx0O1xuICBcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9JChgPGJ1dHRvbiBpZD0nJHt0aGlzLnByb3BzLmV2ZW50TmFtZX0nIGNsYXNzPSdhbGMtYnV0dG9uLW5vcm1hbCcgPiR7dGhpcy5wcm9wcy5idXR0b25OYW1lfTwvYnV0dG9uPmApO1xuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy5wb3NpdGlvbj09PVwi5LiA55Wq5bem44Gr6L+95Yqg44GZ44KLXCIpe1xuICAgICAgICAgICAgICAgICQoYnV0dG9uU3BhY2UpLnByZXBlbmQoYnV0dG9uKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICQoYnV0dG9uU3BhY2UpLmFwcGVuZChidXR0b24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2xpY2tFdmVudE5hbWUgPSBgJHtldmVudC50eXBlfS5jdXN0b21CdXR0b25DbGljay4ke3RoaXMucHJvcHMuZXZlbnROYW1lfWA7XG4gICAgICAgICAgICBidXR0b24ub24oXCJjbGlja1wiLCgpPT57XG4gICAgICAgICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcihjbGlja0V2ZW50TmFtZSxldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICBcblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgfVxuXG59XG5uZXcgQnV0dG9uQWRkQWN0aW9uKCk7IiwiXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUNvbnRleHQsIElWYXJOYW1lIH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSUNvbmRpdGlvbntcbiAgICBjb25kaXRpb246c3RyaW5nO1xuICAgIHZlck5hbWU6SVZhck5hbWU7XG59XG4vKipcbiAqIOadoeS7tuWIhuWykOOCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklDb25kaXRpb247XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5p2h5Lu25byPXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgY29uZGl0aW9uOicnLFxuICAgICAgICAgICAgdmVyTmFtZTp7bmFtZTonJ31cbiAgICAgICAgfVxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxuICAgICAqIEBwYXJhbSBldmVudCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0PXtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDonJ1xuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2NvbmRpdGlvbicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQ29uZGl0aW9uO1xuICAgICAgICAgICAgLy/mnaHku7blvI/jga7oqIjnrpfntZDmnpzjgpLlj5blvpdcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnaHku7boqIjnrpfntZDmnpw6XCIsY29uZGl0aW9uUmVzdWx0KTtcbiAgICAgICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCl7XG4gICAgICAgICAgICAgICAgcmVzdWx0PSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Oifjga/jgYQnXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6J+OBhOOBhOOBiCdcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV09cmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY29udGV4dCDmnaHku7blvI/jgpLlrp/ooYzjgZnjgotcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDphbnkpOmJvb2xlYW57XG4gICAgICAgIGNvbnN0IHRyZWUgPXRoaXMuZ2V0Q29uZGl0aW9uKHRoaXMucHJvcHMuY29uZGl0aW9uKTtcbiAgICAgICAgaWYoIXRyZWUpe1xuICAgICAgICAgICAgLy/mnaHku7bjgpLoqK3lrprjgZXjgozjgabjgYTjgb7jgZvjgpNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmVlLmV2YWx1YXRlKHRyZWUucm9vdCxjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uIOadoeS7tuW8j+ODhOODquODvOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldENvbmRpdGlvbihjb25kaXRpb246c3RyaW5nKTpDb25kaXRpb25UcmVlfG51bGx7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgQ29uZGl0aW9uVHJlZSgpO1xuICAgICAgICAgICAgdHJlZS5mcm9tSnNvbihjb25kaXRpb24pO1xuICAgICAgICAgICAgaWYodHJlZS5nZXRDb25kaXRpb25zKHRyZWUucm9vdCkubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG4gICAgXG59XG5uZXcgQ29uZGl0aW9uQWN0aW9uKCk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmluamVjdFBsYXRmb3JtRGVwcyA9IGV4cG9ydHMucGxhdGZvcm1EZXBzID0gdm9pZCAwO1xuZXhwb3J0cy5wbGF0Zm9ybURlcHMgPSB7XG4gICAgcmVhZEZpbGVGcm9tUGF0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBnZXRSZXF1ZXN0VG9rZW46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG4gICAgZ2V0RGVmYXVsdEF1dGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG4gICAgYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBidWlsZEhlYWRlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG4gICAgYnVpbGRGb3JtRGF0YVZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxuICAgIGJ1aWxkQmFzZVVybDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfSxcbiAgICBnZXRWZXJzaW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxufTtcbnZhciBpbmplY3RQbGF0Zm9ybURlcHMgPSBmdW5jdGlvbiAoZGVwcykge1xuICAgIGlmIChkZXBzLnJlYWRGaWxlRnJvbVBhdGgpIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMucmVhZEZpbGVGcm9tUGF0aCA9IGRlcHMucmVhZEZpbGVGcm9tUGF0aDtcbiAgICB9XG4gICAgaWYgKGRlcHMuZ2V0UmVxdWVzdFRva2VuKSB7XG4gICAgICAgIGV4cG9ydHMucGxhdGZvcm1EZXBzLmdldFJlcXVlc3RUb2tlbiA9IGRlcHMuZ2V0UmVxdWVzdFRva2VuO1xuICAgIH1cbiAgICBpZiAoZGVwcy5nZXREZWZhdWx0QXV0aCkge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5nZXREZWZhdWx0QXV0aCA9IGRlcHMuZ2V0RGVmYXVsdEF1dGg7XG4gICAgfVxuICAgIGlmIChkZXBzLmJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWcpIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyA9XG4gICAgICAgICAgICBkZXBzLmJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWc7XG4gICAgfVxuICAgIGlmIChkZXBzLmJ1aWxkSGVhZGVycykge1xuICAgICAgICBleHBvcnRzLnBsYXRmb3JtRGVwcy5idWlsZEhlYWRlcnMgPSBkZXBzLmJ1aWxkSGVhZGVycztcbiAgICB9XG4gICAgaWYgKGRlcHMuYnVpbGRGb3JtRGF0YVZhbHVlKSB7XG4gICAgICAgIGV4cG9ydHMucGxhdGZvcm1EZXBzLmJ1aWxkRm9ybURhdGFWYWx1ZSA9IGRlcHMuYnVpbGRGb3JtRGF0YVZhbHVlO1xuICAgIH1cbiAgICBpZiAoZGVwcy5idWlsZEJhc2VVcmwpIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuYnVpbGRCYXNlVXJsID0gZGVwcy5idWlsZEJhc2VVcmw7XG4gICAgfVxuICAgIGlmIChkZXBzLmdldFZlcnNpb24pIHtcbiAgICAgICAgZXhwb3J0cy5wbGF0Zm9ybURlcHMuZ2V0VmVyc2lvbiA9IGRlcHMuZ2V0VmVyc2lvbjtcbiAgICB9XG59O1xuZXhwb3J0cy5pbmplY3RQbGF0Zm9ybURlcHMgPSBpbmplY3RQbGF0Zm9ybURlcHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvciA9IHZvaWQgMDtcbnZhciBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3IocGxhdGZvcm0pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIlRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBcIi5jb25jYXQocGxhdGZvcm0sIFwiIGVudmlyb25tZW50XCIpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UpIHx8IHRoaXM7XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0N1c3RvbV9FcnJvcl9UeXBlc1xuICAgICAgICAvLyBNYWludGFpbnMgcHJvcGVyIHN0YWNrIHRyYWNlIGZvciB3aGVyZSBvdXIgZXJyb3Igd2FzIHRocm93biAob25seSBhdmFpbGFibGUgb24gVjgpXG4gICAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoX3RoaXMsIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMubmFtZSA9IFwiVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXCI7XG4gICAgICAgIF90aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC93aWtpL0JyZWFraW5nLUNoYW5nZXMjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydHMuVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yID0gVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0gdHlwZU1hcCBbT2JqZWN0XSBNYXAgb2YgTUlNRSB0eXBlIC0+IEFycmF5W2V4dGVuc2lvbnNdXG4gKiBAcGFyYW0gLi4uXG4gKi9cbmZ1bmN0aW9uIE1pbWUoKSB7XG4gIHRoaXMuX3R5cGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fZXh0ZW5zaW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLmRlZmluZShhcmd1bWVudHNbaV0pO1xuICB9XG5cbiAgdGhpcy5kZWZpbmUgPSB0aGlzLmRlZmluZS5iaW5kKHRoaXMpO1xuICB0aGlzLmdldFR5cGUgPSB0aGlzLmdldFR5cGUuYmluZCh0aGlzKTtcbiAgdGhpcy5nZXRFeHRlbnNpb24gPSB0aGlzLmdldEV4dGVuc2lvbi5iaW5kKHRoaXMpO1xufVxuXG4vKipcbiAqIERlZmluZSBtaW1ldHlwZSAtPiBleHRlbnNpb24gbWFwcGluZ3MuICBFYWNoIGtleSBpcyBhIG1pbWUtdHlwZSB0aGF0IG1hcHNcbiAqIHRvIGFuIGFycmF5IG9mIGV4dGVuc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlLiAgVGhlIGZpcnN0IGV4dGVuc2lvbiBpc1xuICogdXNlZCBhcyB0aGUgZGVmYXVsdCBleHRlbnNpb24gZm9yIHRoZSB0eXBlLlxuICpcbiAqIGUuZy4gbWltZS5kZWZpbmUoeydhdWRpby9vZ2cnLCBbJ29nYScsICdvZ2cnLCAnc3B4J119KTtcbiAqXG4gKiBJZiBhIHR5cGUgZGVjbGFyZXMgYW4gZXh0ZW5zaW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLCBhbiBlcnJvciB3aWxsXG4gKiBiZSB0aHJvd24uICBUbyBzdXBwcmVzcyB0aGlzIGVycm9yIGFuZCBmb3JjZSB0aGUgZXh0ZW5zaW9uIHRvIGJlIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhlIG5ldyB0eXBlLCBwYXNzIGBmb3JjZWA9dHJ1ZS4gIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgcHJlZml4IHRoZVxuICogZXh0ZW5zaW9uIHdpdGggXCIqXCIgdG8gbWFwIHRoZSB0eXBlIHRvIGV4dGVuc2lvbiwgd2l0aG91dCBtYXBwaW5nIHRoZVxuICogZXh0ZW5zaW9uIHRvIHRoZSB0eXBlLlxuICpcbiAqIGUuZy4gbWltZS5kZWZpbmUoeydhdWRpby93YXYnLCBbJ3dhdiddfSwgeydhdWRpby94LXdhdicsIFsnKndhdiddfSk7XG4gKlxuICpcbiAqIEBwYXJhbSBtYXAgKE9iamVjdCkgdHlwZSBkZWZpbml0aW9uc1xuICogQHBhcmFtIGZvcmNlIChCb29sZWFuKSBpZiB0cnVlLCBmb3JjZSBvdmVycmlkaW5nIG9mIGV4aXN0aW5nIGRlZmluaXRpb25zXG4gKi9cbk1pbWUucHJvdG90eXBlLmRlZmluZSA9IGZ1bmN0aW9uKHR5cGVNYXAsIGZvcmNlKSB7XG4gIGZvciAobGV0IHR5cGUgaW4gdHlwZU1hcCkge1xuICAgIGxldCBleHRlbnNpb25zID0gdHlwZU1hcFt0eXBlXS5tYXAoZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcbiAgICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldO1xuXG4gICAgICAvLyAnKicgcHJlZml4ID0gbm90IHRoZSBwcmVmZXJyZWQgdHlwZSBmb3IgdGhpcyBleHRlbnNpb24uICBTbyBmaXh1cCB0aGVcbiAgICAgIC8vIGV4dGVuc2lvbiwgYW5kIHNraXAgaXQuXG4gICAgICBpZiAoZXh0WzBdID09PSAnKicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZm9yY2UgJiYgKGV4dCBpbiB0aGlzLl90eXBlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdBdHRlbXB0IHRvIGNoYW5nZSBtYXBwaW5nIGZvciBcIicgKyBleHQgK1xuICAgICAgICAgICdcIiBleHRlbnNpb24gZnJvbSBcIicgKyB0aGlzLl90eXBlc1tleHRdICsgJ1wiIHRvIFwiJyArIHR5cGUgK1xuICAgICAgICAgICdcIi4gUGFzcyBgZm9yY2U9dHJ1ZWAgdG8gYWxsb3cgdGhpcywgb3RoZXJ3aXNlIHJlbW92ZSBcIicgKyBleHQgK1xuICAgICAgICAgICdcIiBmcm9tIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgZm9yIFwiJyArIHR5cGUgKyAnXCIuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90eXBlc1tleHRdID0gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBVc2UgZmlyc3QgZXh0ZW5zaW9uIGFzIGRlZmF1bHRcbiAgICBpZiAoZm9yY2UgfHwgIXRoaXMuX2V4dGVuc2lvbnNbdHlwZV0pIHtcbiAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbMF07XG4gICAgICB0aGlzLl9leHRlbnNpb25zW3R5cGVdID0gKGV4dFswXSAhPT0gJyonKSA/IGV4dCA6IGV4dC5zdWJzdHIoMSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIExvb2t1cCBhIG1pbWUgdHlwZSBiYXNlZCBvbiBleHRlbnNpb25cbiAqL1xuTWltZS5wcm90b3R5cGUuZ2V0VHlwZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcGF0aCA9IFN0cmluZyhwYXRoKTtcbiAgbGV0IGxhc3QgPSBwYXRoLnJlcGxhY2UoL14uKlsvXFxcXF0vLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgbGV0IGV4dCA9IGxhc3QucmVwbGFjZSgvXi4qXFwuLywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgbGV0IGhhc1BhdGggPSBsYXN0Lmxlbmd0aCA8IHBhdGgubGVuZ3RoO1xuICBsZXQgaGFzRG90ID0gZXh0Lmxlbmd0aCA8IGxhc3QubGVuZ3RoIC0gMTtcblxuICByZXR1cm4gKGhhc0RvdCB8fCAhaGFzUGF0aCkgJiYgdGhpcy5fdHlwZXNbZXh0XSB8fCBudWxsO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gZmlsZSBleHRlbnNpb24gYXNzb2NpYXRlZCB3aXRoIGEgbWltZSB0eXBlXG4gKi9cbk1pbWUucHJvdG90eXBlLmdldEV4dGVuc2lvbiA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdHlwZSA9IC9eXFxzKihbXjtcXHNdKikvLnRlc3QodHlwZSkgJiYgUmVnRXhwLiQxO1xuICByZXR1cm4gdHlwZSAmJiB0aGlzLl9leHRlbnNpb25zW3R5cGUudG9Mb3dlckNhc2UoKV0gfHwgbnVsbDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTWltZTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1wiYXBwbGljYXRpb24vYW5kcmV3LWluc2V0XCI6W1wiZXpcIl0sXCJhcHBsaWNhdGlvbi9hcHBsaXh3YXJlXCI6W1wiYXdcIl0sXCJhcHBsaWNhdGlvbi9hdG9tK3htbFwiOltcImF0b21cIl0sXCJhcHBsaWNhdGlvbi9hdG9tY2F0K3htbFwiOltcImF0b21jYXRcIl0sXCJhcHBsaWNhdGlvbi9hdG9tZGVsZXRlZCt4bWxcIjpbXCJhdG9tZGVsZXRlZFwiXSxcImFwcGxpY2F0aW9uL2F0b21zdmMreG1sXCI6W1wiYXRvbXN2Y1wiXSxcImFwcGxpY2F0aW9uL2F0c2MtZHdkK3htbFwiOltcImR3ZFwiXSxcImFwcGxpY2F0aW9uL2F0c2MtaGVsZCt4bWxcIjpbXCJoZWxkXCJdLFwiYXBwbGljYXRpb24vYXRzYy1yc2F0K3htbFwiOltcInJzYXRcIl0sXCJhcHBsaWNhdGlvbi9iZG9jXCI6W1wiYmRvY1wiXSxcImFwcGxpY2F0aW9uL2NhbGVuZGFyK3htbFwiOltcInhjc1wiXSxcImFwcGxpY2F0aW9uL2NjeG1sK3htbFwiOltcImNjeG1sXCJdLFwiYXBwbGljYXRpb24vY2RmeCt4bWxcIjpbXCJjZGZ4XCJdLFwiYXBwbGljYXRpb24vY2RtaS1jYXBhYmlsaXR5XCI6W1wiY2RtaWFcIl0sXCJhcHBsaWNhdGlvbi9jZG1pLWNvbnRhaW5lclwiOltcImNkbWljXCJdLFwiYXBwbGljYXRpb24vY2RtaS1kb21haW5cIjpbXCJjZG1pZFwiXSxcImFwcGxpY2F0aW9uL2NkbWktb2JqZWN0XCI6W1wiY2RtaW9cIl0sXCJhcHBsaWNhdGlvbi9jZG1pLXF1ZXVlXCI6W1wiY2RtaXFcIl0sXCJhcHBsaWNhdGlvbi9jdS1zZWVtZVwiOltcImN1XCJdLFwiYXBwbGljYXRpb24vZGFzaCt4bWxcIjpbXCJtcGRcIl0sXCJhcHBsaWNhdGlvbi9kYXZtb3VudCt4bWxcIjpbXCJkYXZtb3VudFwiXSxcImFwcGxpY2F0aW9uL2RvY2Jvb2sreG1sXCI6W1wiZGJrXCJdLFwiYXBwbGljYXRpb24vZHNzYytkZXJcIjpbXCJkc3NjXCJdLFwiYXBwbGljYXRpb24vZHNzYyt4bWxcIjpbXCJ4ZHNzY1wiXSxcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHRcIjpbXCJlc1wiLFwiZWNtYVwiXSxcImFwcGxpY2F0aW9uL2VtbWEreG1sXCI6W1wiZW1tYVwiXSxcImFwcGxpY2F0aW9uL2Vtb3Rpb25tbCt4bWxcIjpbXCJlbW90aW9ubWxcIl0sXCJhcHBsaWNhdGlvbi9lcHViK3ppcFwiOltcImVwdWJcIl0sXCJhcHBsaWNhdGlvbi9leGlcIjpbXCJleGlcIl0sXCJhcHBsaWNhdGlvbi9leHByZXNzXCI6W1wiZXhwXCJdLFwiYXBwbGljYXRpb24vZmR0K3htbFwiOltcImZkdFwiXSxcImFwcGxpY2F0aW9uL2ZvbnQtdGRwZnJcIjpbXCJwZnJcIl0sXCJhcHBsaWNhdGlvbi9nZW8ranNvblwiOltcImdlb2pzb25cIl0sXCJhcHBsaWNhdGlvbi9nbWwreG1sXCI6W1wiZ21sXCJdLFwiYXBwbGljYXRpb24vZ3B4K3htbFwiOltcImdweFwiXSxcImFwcGxpY2F0aW9uL2d4ZlwiOltcImd4ZlwiXSxcImFwcGxpY2F0aW9uL2d6aXBcIjpbXCJnelwiXSxcImFwcGxpY2F0aW9uL2hqc29uXCI6W1wiaGpzb25cIl0sXCJhcHBsaWNhdGlvbi9oeXBlcnN0dWRpb1wiOltcInN0a1wiXSxcImFwcGxpY2F0aW9uL2lua21sK3htbFwiOltcImlua1wiLFwiaW5rbWxcIl0sXCJhcHBsaWNhdGlvbi9pcGZpeFwiOltcImlwZml4XCJdLFwiYXBwbGljYXRpb24vaXRzK3htbFwiOltcIml0c1wiXSxcImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZVwiOltcImphclwiLFwid2FyXCIsXCJlYXJcIl0sXCJhcHBsaWNhdGlvbi9qYXZhLXNlcmlhbGl6ZWQtb2JqZWN0XCI6W1wic2VyXCJdLFwiYXBwbGljYXRpb24vamF2YS12bVwiOltcImNsYXNzXCJdLFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiOltcImpzXCIsXCJtanNcIl0sXCJhcHBsaWNhdGlvbi9qc29uXCI6W1wianNvblwiLFwibWFwXCJdLFwiYXBwbGljYXRpb24vanNvbjVcIjpbXCJqc29uNVwiXSxcImFwcGxpY2F0aW9uL2pzb25tbCtqc29uXCI6W1wianNvbm1sXCJdLFwiYXBwbGljYXRpb24vbGQranNvblwiOltcImpzb25sZFwiXSxcImFwcGxpY2F0aW9uL2xncit4bWxcIjpbXCJsZ3JcIl0sXCJhcHBsaWNhdGlvbi9sb3N0K3htbFwiOltcImxvc3R4bWxcIl0sXCJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDBcIjpbXCJocXhcIl0sXCJhcHBsaWNhdGlvbi9tYWMtY29tcGFjdHByb1wiOltcImNwdFwiXSxcImFwcGxpY2F0aW9uL21hZHMreG1sXCI6W1wibWFkc1wiXSxcImFwcGxpY2F0aW9uL21hbmlmZXN0K2pzb25cIjpbXCJ3ZWJtYW5pZmVzdFwiXSxcImFwcGxpY2F0aW9uL21hcmNcIjpbXCJtcmNcIl0sXCJhcHBsaWNhdGlvbi9tYXJjeG1sK3htbFwiOltcIm1yY3hcIl0sXCJhcHBsaWNhdGlvbi9tYXRoZW1hdGljYVwiOltcIm1hXCIsXCJuYlwiLFwibWJcIl0sXCJhcHBsaWNhdGlvbi9tYXRobWwreG1sXCI6W1wibWF0aG1sXCJdLFwiYXBwbGljYXRpb24vbWJveFwiOltcIm1ib3hcIl0sXCJhcHBsaWNhdGlvbi9tZWRpYXNlcnZlcmNvbnRyb2wreG1sXCI6W1wibXNjbWxcIl0sXCJhcHBsaWNhdGlvbi9tZXRhbGluayt4bWxcIjpbXCJtZXRhbGlua1wiXSxcImFwcGxpY2F0aW9uL21ldGFsaW5rNCt4bWxcIjpbXCJtZXRhNFwiXSxcImFwcGxpY2F0aW9uL21ldHMreG1sXCI6W1wibWV0c1wiXSxcImFwcGxpY2F0aW9uL21tdC1hZWkreG1sXCI6W1wibWFlaVwiXSxcImFwcGxpY2F0aW9uL21tdC11c2QreG1sXCI6W1wibXVzZFwiXSxcImFwcGxpY2F0aW9uL21vZHMreG1sXCI6W1wibW9kc1wiXSxcImFwcGxpY2F0aW9uL21wMjFcIjpbXCJtMjFcIixcIm1wMjFcIl0sXCJhcHBsaWNhdGlvbi9tcDRcIjpbXCJtcDRzXCIsXCJtNHBcIl0sXCJhcHBsaWNhdGlvbi9tc3dvcmRcIjpbXCJkb2NcIixcImRvdFwiXSxcImFwcGxpY2F0aW9uL214ZlwiOltcIm14ZlwiXSxcImFwcGxpY2F0aW9uL24tcXVhZHNcIjpbXCJucVwiXSxcImFwcGxpY2F0aW9uL24tdHJpcGxlc1wiOltcIm50XCJdLFwiYXBwbGljYXRpb24vbm9kZVwiOltcImNqc1wiXSxcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiOltcImJpblwiLFwiZG1zXCIsXCJscmZcIixcIm1hclwiLFwic29cIixcImRpc3RcIixcImRpc3R6XCIsXCJwa2dcIixcImJwa1wiLFwiZHVtcFwiLFwiZWxjXCIsXCJkZXBsb3lcIixcImV4ZVwiLFwiZGxsXCIsXCJkZWJcIixcImRtZ1wiLFwiaXNvXCIsXCJpbWdcIixcIm1zaVwiLFwibXNwXCIsXCJtc21cIixcImJ1ZmZlclwiXSxcImFwcGxpY2F0aW9uL29kYVwiOltcIm9kYVwiXSxcImFwcGxpY2F0aW9uL29lYnBzLXBhY2thZ2UreG1sXCI6W1wib3BmXCJdLFwiYXBwbGljYXRpb24vb2dnXCI6W1wib2d4XCJdLFwiYXBwbGljYXRpb24vb21kb2MreG1sXCI6W1wib21kb2NcIl0sXCJhcHBsaWNhdGlvbi9vbmVub3RlXCI6W1wib25ldG9jXCIsXCJvbmV0b2MyXCIsXCJvbmV0bXBcIixcIm9uZXBrZ1wiXSxcImFwcGxpY2F0aW9uL294cHNcIjpbXCJveHBzXCJdLFwiYXBwbGljYXRpb24vcDJwLW92ZXJsYXkreG1sXCI6W1wicmVsb1wiXSxcImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWxcIjpbXCJ4ZXJcIl0sXCJhcHBsaWNhdGlvbi9wZGZcIjpbXCJwZGZcIl0sXCJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkXCI6W1wicGdwXCJdLFwiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZVwiOltcImFzY1wiLFwic2lnXCJdLFwiYXBwbGljYXRpb24vcGljcy1ydWxlc1wiOltcInByZlwiXSxcImFwcGxpY2F0aW9uL3BrY3MxMFwiOltcInAxMFwiXSxcImFwcGxpY2F0aW9uL3BrY3M3LW1pbWVcIjpbXCJwN21cIixcInA3Y1wiXSxcImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZVwiOltcInA3c1wiXSxcImFwcGxpY2F0aW9uL3BrY3M4XCI6W1wicDhcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LWF0dHItY2VydFwiOltcImFjXCJdLFwiYXBwbGljYXRpb24vcGtpeC1jZXJ0XCI6W1wiY2VyXCJdLFwiYXBwbGljYXRpb24vcGtpeC1jcmxcIjpbXCJjcmxcIl0sXCJhcHBsaWNhdGlvbi9wa2l4LXBraXBhdGhcIjpbXCJwa2lwYXRoXCJdLFwiYXBwbGljYXRpb24vcGtpeGNtcFwiOltcInBraVwiXSxcImFwcGxpY2F0aW9uL3Bscyt4bWxcIjpbXCJwbHNcIl0sXCJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0XCI6W1wiYWlcIixcImVwc1wiLFwicHNcIl0sXCJhcHBsaWNhdGlvbi9wcm92ZW5hbmNlK3htbFwiOltcInByb3Z4XCJdLFwiYXBwbGljYXRpb24vcHNrYyt4bWxcIjpbXCJwc2tjeG1sXCJdLFwiYXBwbGljYXRpb24vcmFtbCt5YW1sXCI6W1wicmFtbFwiXSxcImFwcGxpY2F0aW9uL3JkZit4bWxcIjpbXCJyZGZcIixcIm93bFwiXSxcImFwcGxpY2F0aW9uL3JlZ2luZm8reG1sXCI6W1wicmlmXCJdLFwiYXBwbGljYXRpb24vcmVsYXgtbmctY29tcGFjdC1zeW50YXhcIjpbXCJybmNcIl0sXCJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cyt4bWxcIjpbXCJybFwiXSxcImFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzLWRpZmYreG1sXCI6W1wicmxkXCJdLFwiYXBwbGljYXRpb24vcmxzLXNlcnZpY2VzK3htbFwiOltcInJzXCJdLFwiYXBwbGljYXRpb24vcm91dGUtYXBkK3htbFwiOltcInJhcGRcIl0sXCJhcHBsaWNhdGlvbi9yb3V0ZS1zLXRzaWQreG1sXCI6W1wic2xzXCJdLFwiYXBwbGljYXRpb24vcm91dGUtdXNkK3htbFwiOltcInJ1c2RcIl0sXCJhcHBsaWNhdGlvbi9ycGtpLWdob3N0YnVzdGVyc1wiOltcImdiclwiXSxcImFwcGxpY2F0aW9uL3Jwa2ktbWFuaWZlc3RcIjpbXCJtZnRcIl0sXCJhcHBsaWNhdGlvbi9ycGtpLXJvYVwiOltcInJvYVwiXSxcImFwcGxpY2F0aW9uL3JzZCt4bWxcIjpbXCJyc2RcIl0sXCJhcHBsaWNhdGlvbi9yc3MreG1sXCI6W1wicnNzXCJdLFwiYXBwbGljYXRpb24vcnRmXCI6W1wicnRmXCJdLFwiYXBwbGljYXRpb24vc2JtbCt4bWxcIjpbXCJzYm1sXCJdLFwiYXBwbGljYXRpb24vc2N2cC1jdi1yZXF1ZXN0XCI6W1wic2NxXCJdLFwiYXBwbGljYXRpb24vc2N2cC1jdi1yZXNwb25zZVwiOltcInNjc1wiXSxcImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVxdWVzdFwiOltcInNwcVwiXSxcImFwcGxpY2F0aW9uL3NjdnAtdnAtcmVzcG9uc2VcIjpbXCJzcHBcIl0sXCJhcHBsaWNhdGlvbi9zZHBcIjpbXCJzZHBcIl0sXCJhcHBsaWNhdGlvbi9zZW5tbCt4bWxcIjpbXCJzZW5tbHhcIl0sXCJhcHBsaWNhdGlvbi9zZW5zbWwreG1sXCI6W1wic2Vuc21seFwiXSxcImFwcGxpY2F0aW9uL3NldC1wYXltZW50LWluaXRpYXRpb25cIjpbXCJzZXRwYXlcIl0sXCJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb25cIjpbXCJzZXRyZWdcIl0sXCJhcHBsaWNhdGlvbi9zaGYreG1sXCI6W1wic2hmXCJdLFwiYXBwbGljYXRpb24vc2lldmVcIjpbXCJzaXZcIixcInNpZXZlXCJdLFwiYXBwbGljYXRpb24vc21pbCt4bWxcIjpbXCJzbWlcIixcInNtaWxcIl0sXCJhcHBsaWNhdGlvbi9zcGFycWwtcXVlcnlcIjpbXCJycVwiXSxcImFwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbFwiOltcInNyeFwiXSxcImFwcGxpY2F0aW9uL3NyZ3NcIjpbXCJncmFtXCJdLFwiYXBwbGljYXRpb24vc3Jncyt4bWxcIjpbXCJncnhtbFwiXSxcImFwcGxpY2F0aW9uL3NydSt4bWxcIjpbXCJzcnVcIl0sXCJhcHBsaWNhdGlvbi9zc2RsK3htbFwiOltcInNzZGxcIl0sXCJhcHBsaWNhdGlvbi9zc21sK3htbFwiOltcInNzbWxcIl0sXCJhcHBsaWNhdGlvbi9zd2lkK3htbFwiOltcInN3aWR0YWdcIl0sXCJhcHBsaWNhdGlvbi90ZWkreG1sXCI6W1widGVpXCIsXCJ0ZWljb3JwdXNcIl0sXCJhcHBsaWNhdGlvbi90aHJhdWQreG1sXCI6W1widGZpXCJdLFwiYXBwbGljYXRpb24vdGltZXN0YW1wZWQtZGF0YVwiOltcInRzZFwiXSxcImFwcGxpY2F0aW9uL3RvbWxcIjpbXCJ0b21sXCJdLFwiYXBwbGljYXRpb24vdHJpZ1wiOltcInRyaWdcIl0sXCJhcHBsaWNhdGlvbi90dG1sK3htbFwiOltcInR0bWxcIl0sXCJhcHBsaWNhdGlvbi91Ympzb25cIjpbXCJ1YmpcIl0sXCJhcHBsaWNhdGlvbi91cmMtcmVzc2hlZXQreG1sXCI6W1wicnNoZWV0XCJdLFwiYXBwbGljYXRpb24vdXJjLXRhcmdldGRlc2MreG1sXCI6W1widGRcIl0sXCJhcHBsaWNhdGlvbi92b2ljZXhtbCt4bWxcIjpbXCJ2eG1sXCJdLFwiYXBwbGljYXRpb24vd2FzbVwiOltcIndhc21cIl0sXCJhcHBsaWNhdGlvbi93aWRnZXRcIjpbXCJ3Z3RcIl0sXCJhcHBsaWNhdGlvbi93aW5obHBcIjpbXCJobHBcIl0sXCJhcHBsaWNhdGlvbi93c2RsK3htbFwiOltcIndzZGxcIl0sXCJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWxcIjpbXCJ3c3BvbGljeVwiXSxcImFwcGxpY2F0aW9uL3hhbWwreG1sXCI6W1wieGFtbFwiXSxcImFwcGxpY2F0aW9uL3hjYXAtYXR0K3htbFwiOltcInhhdlwiXSxcImFwcGxpY2F0aW9uL3hjYXAtY2Fwcyt4bWxcIjpbXCJ4Y2FcIl0sXCJhcHBsaWNhdGlvbi94Y2FwLWRpZmYreG1sXCI6W1wieGRmXCJdLFwiYXBwbGljYXRpb24veGNhcC1lbCt4bWxcIjpbXCJ4ZWxcIl0sXCJhcHBsaWNhdGlvbi94Y2FwLW5zK3htbFwiOltcInhuc1wiXSxcImFwcGxpY2F0aW9uL3hlbmMreG1sXCI6W1wieGVuY1wiXSxcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiOltcInhodG1sXCIsXCJ4aHRcIl0sXCJhcHBsaWNhdGlvbi94bGlmZit4bWxcIjpbXCJ4bGZcIl0sXCJhcHBsaWNhdGlvbi94bWxcIjpbXCJ4bWxcIixcInhzbFwiLFwieHNkXCIsXCJybmdcIl0sXCJhcHBsaWNhdGlvbi94bWwtZHRkXCI6W1wiZHRkXCJdLFwiYXBwbGljYXRpb24veG9wK3htbFwiOltcInhvcFwiXSxcImFwcGxpY2F0aW9uL3hwcm9jK3htbFwiOltcInhwbFwiXSxcImFwcGxpY2F0aW9uL3hzbHQreG1sXCI6W1wiKnhzbFwiLFwieHNsdFwiXSxcImFwcGxpY2F0aW9uL3hzcGYreG1sXCI6W1wieHNwZlwiXSxcImFwcGxpY2F0aW9uL3h2K3htbFwiOltcIm14bWxcIixcInhodm1sXCIsXCJ4dm1sXCIsXCJ4dm1cIl0sXCJhcHBsaWNhdGlvbi95YW5nXCI6W1wieWFuZ1wiXSxcImFwcGxpY2F0aW9uL3lpbit4bWxcIjpbXCJ5aW5cIl0sXCJhcHBsaWNhdGlvbi96aXBcIjpbXCJ6aXBcIl0sXCJhdWRpby8zZ3BwXCI6W1wiKjNncHBcIl0sXCJhdWRpby9hZHBjbVwiOltcImFkcFwiXSxcImF1ZGlvL2FtclwiOltcImFtclwiXSxcImF1ZGlvL2Jhc2ljXCI6W1wiYXVcIixcInNuZFwiXSxcImF1ZGlvL21pZGlcIjpbXCJtaWRcIixcIm1pZGlcIixcImthclwiLFwicm1pXCJdLFwiYXVkaW8vbW9iaWxlLXhtZlwiOltcIm14bWZcIl0sXCJhdWRpby9tcDNcIjpbXCIqbXAzXCJdLFwiYXVkaW8vbXA0XCI6W1wibTRhXCIsXCJtcDRhXCJdLFwiYXVkaW8vbXBlZ1wiOltcIm1wZ2FcIixcIm1wMlwiLFwibXAyYVwiLFwibXAzXCIsXCJtMmFcIixcIm0zYVwiXSxcImF1ZGlvL29nZ1wiOltcIm9nYVwiLFwib2dnXCIsXCJzcHhcIixcIm9wdXNcIl0sXCJhdWRpby9zM21cIjpbXCJzM21cIl0sXCJhdWRpby9zaWxrXCI6W1wic2lsXCJdLFwiYXVkaW8vd2F2XCI6W1wid2F2XCJdLFwiYXVkaW8vd2F2ZVwiOltcIip3YXZcIl0sXCJhdWRpby93ZWJtXCI6W1wid2ViYVwiXSxcImF1ZGlvL3htXCI6W1wieG1cIl0sXCJmb250L2NvbGxlY3Rpb25cIjpbXCJ0dGNcIl0sXCJmb250L290ZlwiOltcIm90ZlwiXSxcImZvbnQvdHRmXCI6W1widHRmXCJdLFwiZm9udC93b2ZmXCI6W1wid29mZlwiXSxcImZvbnQvd29mZjJcIjpbXCJ3b2ZmMlwiXSxcImltYWdlL2FjZXNcIjpbXCJleHJcIl0sXCJpbWFnZS9hcG5nXCI6W1wiYXBuZ1wiXSxcImltYWdlL2F2aWZcIjpbXCJhdmlmXCJdLFwiaW1hZ2UvYm1wXCI6W1wiYm1wXCJdLFwiaW1hZ2UvY2dtXCI6W1wiY2dtXCJdLFwiaW1hZ2UvZGljb20tcmxlXCI6W1wiZHJsZVwiXSxcImltYWdlL2VtZlwiOltcImVtZlwiXSxcImltYWdlL2ZpdHNcIjpbXCJmaXRzXCJdLFwiaW1hZ2UvZzNmYXhcIjpbXCJnM1wiXSxcImltYWdlL2dpZlwiOltcImdpZlwiXSxcImltYWdlL2hlaWNcIjpbXCJoZWljXCJdLFwiaW1hZ2UvaGVpYy1zZXF1ZW5jZVwiOltcImhlaWNzXCJdLFwiaW1hZ2UvaGVpZlwiOltcImhlaWZcIl0sXCJpbWFnZS9oZWlmLXNlcXVlbmNlXCI6W1wiaGVpZnNcIl0sXCJpbWFnZS9oZWoya1wiOltcImhlajJcIl0sXCJpbWFnZS9oc2oyXCI6W1wiaHNqMlwiXSxcImltYWdlL2llZlwiOltcImllZlwiXSxcImltYWdlL2psc1wiOltcImpsc1wiXSxcImltYWdlL2pwMlwiOltcImpwMlwiLFwianBnMlwiXSxcImltYWdlL2pwZWdcIjpbXCJqcGVnXCIsXCJqcGdcIixcImpwZVwiXSxcImltYWdlL2pwaFwiOltcImpwaFwiXSxcImltYWdlL2pwaGNcIjpbXCJqaGNcIl0sXCJpbWFnZS9qcG1cIjpbXCJqcG1cIl0sXCJpbWFnZS9qcHhcIjpbXCJqcHhcIixcImpwZlwiXSxcImltYWdlL2p4clwiOltcImp4clwiXSxcImltYWdlL2p4cmFcIjpbXCJqeHJhXCJdLFwiaW1hZ2Uvanhyc1wiOltcImp4cnNcIl0sXCJpbWFnZS9qeHNcIjpbXCJqeHNcIl0sXCJpbWFnZS9qeHNjXCI6W1wianhzY1wiXSxcImltYWdlL2p4c2lcIjpbXCJqeHNpXCJdLFwiaW1hZ2Uvanhzc1wiOltcImp4c3NcIl0sXCJpbWFnZS9rdHhcIjpbXCJrdHhcIl0sXCJpbWFnZS9rdHgyXCI6W1wia3R4MlwiXSxcImltYWdlL3BuZ1wiOltcInBuZ1wiXSxcImltYWdlL3NnaVwiOltcInNnaVwiXSxcImltYWdlL3N2Zyt4bWxcIjpbXCJzdmdcIixcInN2Z3pcIl0sXCJpbWFnZS90MzhcIjpbXCJ0MzhcIl0sXCJpbWFnZS90aWZmXCI6W1widGlmXCIsXCJ0aWZmXCJdLFwiaW1hZ2UvdGlmZi1meFwiOltcInRmeFwiXSxcImltYWdlL3dlYnBcIjpbXCJ3ZWJwXCJdLFwiaW1hZ2Uvd21mXCI6W1wid21mXCJdLFwibWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIjpbXCJkaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIl0sXCJtZXNzYWdlL2dsb2JhbFwiOltcInU4bXNnXCJdLFwibWVzc2FnZS9nbG9iYWwtZGVsaXZlcnktc3RhdHVzXCI6W1widThkc25cIl0sXCJtZXNzYWdlL2dsb2JhbC1kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIjpbXCJ1OG1kblwiXSxcIm1lc3NhZ2UvZ2xvYmFsLWhlYWRlcnNcIjpbXCJ1OGhkclwiXSxcIm1lc3NhZ2UvcmZjODIyXCI6W1wiZW1sXCIsXCJtaW1lXCJdLFwibW9kZWwvM21mXCI6W1wiM21mXCJdLFwibW9kZWwvZ2x0Zitqc29uXCI6W1wiZ2x0ZlwiXSxcIm1vZGVsL2dsdGYtYmluYXJ5XCI6W1wiZ2xiXCJdLFwibW9kZWwvaWdlc1wiOltcImlnc1wiLFwiaWdlc1wiXSxcIm1vZGVsL21lc2hcIjpbXCJtc2hcIixcIm1lc2hcIixcInNpbG9cIl0sXCJtb2RlbC9tdGxcIjpbXCJtdGxcIl0sXCJtb2RlbC9vYmpcIjpbXCJvYmpcIl0sXCJtb2RlbC9zdGVwK3htbFwiOltcInN0cHhcIl0sXCJtb2RlbC9zdGVwK3ppcFwiOltcInN0cHpcIl0sXCJtb2RlbC9zdGVwLXhtbCt6aXBcIjpbXCJzdHB4elwiXSxcIm1vZGVsL3N0bFwiOltcInN0bFwiXSxcIm1vZGVsL3ZybWxcIjpbXCJ3cmxcIixcInZybWxcIl0sXCJtb2RlbC94M2QrYmluYXJ5XCI6W1wiKngzZGJcIixcIngzZGJ6XCJdLFwibW9kZWwveDNkK2Zhc3RpbmZvc2V0XCI6W1wieDNkYlwiXSxcIm1vZGVsL3gzZCt2cm1sXCI6W1wiKngzZHZcIixcIngzZHZ6XCJdLFwibW9kZWwveDNkK3htbFwiOltcIngzZFwiLFwieDNkelwiXSxcIm1vZGVsL3gzZC12cm1sXCI6W1wieDNkdlwiXSxcInRleHQvY2FjaGUtbWFuaWZlc3RcIjpbXCJhcHBjYWNoZVwiLFwibWFuaWZlc3RcIl0sXCJ0ZXh0L2NhbGVuZGFyXCI6W1wiaWNzXCIsXCJpZmJcIl0sXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiOltcImNvZmZlZVwiLFwibGl0Y29mZmVlXCJdLFwidGV4dC9jc3NcIjpbXCJjc3NcIl0sXCJ0ZXh0L2NzdlwiOltcImNzdlwiXSxcInRleHQvaHRtbFwiOltcImh0bWxcIixcImh0bVwiLFwic2h0bWxcIl0sXCJ0ZXh0L2phZGVcIjpbXCJqYWRlXCJdLFwidGV4dC9qc3hcIjpbXCJqc3hcIl0sXCJ0ZXh0L2xlc3NcIjpbXCJsZXNzXCJdLFwidGV4dC9tYXJrZG93blwiOltcIm1hcmtkb3duXCIsXCJtZFwiXSxcInRleHQvbWF0aG1sXCI6W1wibW1sXCJdLFwidGV4dC9tZHhcIjpbXCJtZHhcIl0sXCJ0ZXh0L24zXCI6W1wibjNcIl0sXCJ0ZXh0L3BsYWluXCI6W1widHh0XCIsXCJ0ZXh0XCIsXCJjb25mXCIsXCJkZWZcIixcImxpc3RcIixcImxvZ1wiLFwiaW5cIixcImluaVwiXSxcInRleHQvcmljaHRleHRcIjpbXCJydHhcIl0sXCJ0ZXh0L3J0ZlwiOltcIipydGZcIl0sXCJ0ZXh0L3NnbWxcIjpbXCJzZ21sXCIsXCJzZ21cIl0sXCJ0ZXh0L3NoZXhcIjpbXCJzaGV4XCJdLFwidGV4dC9zbGltXCI6W1wic2xpbVwiLFwic2xtXCJdLFwidGV4dC9zcGR4XCI6W1wic3BkeFwiXSxcInRleHQvc3R5bHVzXCI6W1wic3R5bHVzXCIsXCJzdHlsXCJdLFwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlc1wiOltcInRzdlwiXSxcInRleHQvdHJvZmZcIjpbXCJ0XCIsXCJ0clwiLFwicm9mZlwiLFwibWFuXCIsXCJtZVwiLFwibXNcIl0sXCJ0ZXh0L3R1cnRsZVwiOltcInR0bFwiXSxcInRleHQvdXJpLWxpc3RcIjpbXCJ1cmlcIixcInVyaXNcIixcInVybHNcIl0sXCJ0ZXh0L3ZjYXJkXCI6W1widmNhcmRcIl0sXCJ0ZXh0L3Z0dFwiOltcInZ0dFwiXSxcInRleHQveG1sXCI6W1wiKnhtbFwiXSxcInRleHQveWFtbFwiOltcInlhbWxcIixcInltbFwiXSxcInZpZGVvLzNncHBcIjpbXCIzZ3BcIixcIjNncHBcIl0sXCJ2aWRlby8zZ3BwMlwiOltcIjNnMlwiXSxcInZpZGVvL2gyNjFcIjpbXCJoMjYxXCJdLFwidmlkZW8vaDI2M1wiOltcImgyNjNcIl0sXCJ2aWRlby9oMjY0XCI6W1wiaDI2NFwiXSxcInZpZGVvL2lzby5zZWdtZW50XCI6W1wibTRzXCJdLFwidmlkZW8vanBlZ1wiOltcImpwZ3ZcIl0sXCJ2aWRlby9qcG1cIjpbXCIqanBtXCIsXCJqcGdtXCJdLFwidmlkZW8vbWoyXCI6W1wibWoyXCIsXCJtanAyXCJdLFwidmlkZW8vbXAydFwiOltcInRzXCJdLFwidmlkZW8vbXA0XCI6W1wibXA0XCIsXCJtcDR2XCIsXCJtcGc0XCJdLFwidmlkZW8vbXBlZ1wiOltcIm1wZWdcIixcIm1wZ1wiLFwibXBlXCIsXCJtMXZcIixcIm0ydlwiXSxcInZpZGVvL29nZ1wiOltcIm9ndlwiXSxcInZpZGVvL3F1aWNrdGltZVwiOltcInF0XCIsXCJtb3ZcIl0sXCJ2aWRlby93ZWJtXCI6W1wid2VibVwiXX07IiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgTWltZSA9IHJlcXVpcmUoJy4vTWltZScpO1xubW9kdWxlLmV4cG9ydHMgPSBuZXcgTWltZShyZXF1aXJlKCcuL3R5cGVzL3N0YW5kYXJkJykpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRWZXJzaW9uID0gZXhwb3J0cy5idWlsZEJhc2VVcmwgPSBleHBvcnRzLmJ1aWxkRm9ybURhdGFWYWx1ZSA9IGV4cG9ydHMuYnVpbGRIZWFkZXJzID0gZXhwb3J0cy5idWlsZFBsYXRmb3JtRGVwZW5kZW50Q29uZmlnID0gZXhwb3J0cy5nZXREZWZhdWx0QXV0aCA9IGV4cG9ydHMuZ2V0UmVxdWVzdFRva2VuID0gZXhwb3J0cy5yZWFkRmlsZUZyb21QYXRoID0gdm9pZCAwO1xudmFyIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xID0gcmVxdWlyZShcIi4vVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXCIpO1xudmFyIGxpdGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibWltZS9saXRlXCIpKTtcbnZhciBwYWNrYWdlX2pzb25fMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vcGFja2FnZS5qc29uXCIpKTtcbnZhciByZWFkRmlsZUZyb21QYXRoID0gZnVuY3Rpb24gKGZpbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcihcIkJyb3dzZXJcIik7XG59O1xuZXhwb3J0cy5yZWFkRmlsZUZyb21QYXRoID0gcmVhZEZpbGVGcm9tUGF0aDtcbnZhciBnZXRSZXF1ZXN0VG9rZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICBpZiAodHlwZW9mIGtpbnRvbmUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGtpbnRvbmUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiBraW50b25lLmdldFJlcXVlc3RUb2tlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywga2ludG9uZS5nZXRSZXF1ZXN0VG9rZW4oKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBnYXJvb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGdhcm9vbiAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdHlwZW9mICgoX2IgPSAoX2EgPSBnYXJvb24uY29ubmVjdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmtpbnRvbmUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5nZXRSZXF1ZXN0VG9rZW4pID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnYXJvb24uY29ubmVjdC5raW50b25lLmdldFJlcXVlc3RUb2tlbigpXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXNzaW9uIGF1dGhlbnRpY2F0aW9uIG11c3Qgc3BlY2lmeSBhIHJlcXVlc3QgdG9rZW5cIik7XG4gICAgfSk7XG59KTsgfTtcbmV4cG9ydHMuZ2V0UmVxdWVzdFRva2VuID0gZ2V0UmVxdWVzdFRva2VuO1xudmFyIGdldERlZmF1bHRBdXRoID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwic2Vzc2lvblwiLFxuICAgIH07XG59O1xuZXhwb3J0cy5nZXREZWZhdWx0QXV0aCA9IGdldERlZmF1bHRBdXRoO1xudmFyIGJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xufTtcbmV4cG9ydHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyA9IGJ1aWxkUGxhdGZvcm1EZXBlbmRlbnRDb25maWc7XG52YXIgYnVpbGRIZWFkZXJzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbn07XG5leHBvcnRzLmJ1aWxkSGVhZGVycyA9IGJ1aWxkSGVhZGVycztcbnZhciBidWlsZEZvcm1EYXRhVmFsdWUgPSBmdW5jdGlvbiAoZGF0YSwgZmlsZU5hbWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChmaWxlTmFtZSkge1xuICAgICAgICBvcHRpb25zLnR5cGUgPSBsaXRlXzEuZGVmYXVsdC5nZXRUeXBlKGZpbGVOYW1lKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0sIG9wdGlvbnMpO1xufTtcbmV4cG9ydHMuYnVpbGRGb3JtRGF0YVZhbHVlID0gYnVpbGRGb3JtRGF0YVZhbHVlO1xudmFyIGJ1aWxkQmFzZVVybCA9IGZ1bmN0aW9uIChiYXNlVXJsKSB7XG4gICAgaWYgKGJhc2VVcmwpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VVcmw7XG4gICAgfVxuICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBiYXNlVXJsIHBhcmFtZXRlciBpcyByZXF1aXJlZCBmb3IgdGhpcyBlbnZpcm9ubWVudFwiKTtcbiAgICB9XG4gICAgdmFyIGhvc3QgPSBsb2NhdGlvbi5ob3N0LCBwcm90b2NvbCA9IGxvY2F0aW9uLnByb3RvY29sO1xuICAgIHJldHVybiBcIlwiLmNvbmNhdChwcm90b2NvbCwgXCIvL1wiKS5jb25jYXQoaG9zdCk7XG59O1xuZXhwb3J0cy5idWlsZEJhc2VVcmwgPSBidWlsZEJhc2VVcmw7XG52YXIgZ2V0VmVyc2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gcGFja2FnZV9qc29uXzEuZGVmYXVsdC52ZXJzaW9uO1xufTtcbmV4cG9ydHMuZ2V0VmVyc2lvbiA9IGdldFZlcnNpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1icm93c2VyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5idWlsZFBhdGggPSB2b2lkIDA7XG52YXIgYnVpbGRQYXRoID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIHZhciBlbmRwb2ludE5hbWUgPSBwYXJhbXMuZW5kcG9pbnROYW1lLCBndWVzdFNwYWNlSWQgPSBwYXJhbXMuZ3Vlc3RTcGFjZUlkLCBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXc7XG4gICAgdmFyIGd1ZXN0UGF0aCA9IGd1ZXN0U3BhY2VJZCAhPT0gdW5kZWZpbmVkID8gXCIvZ3Vlc3QvXCIuY29uY2F0KGd1ZXN0U3BhY2VJZCkgOiBcIlwiO1xuICAgIHZhciBwcmV2aWV3UGF0aCA9IHByZXZpZXcgPyBcIi9wcmV2aWV3XCIgOiBcIlwiO1xuICAgIHJldHVybiBcIi9rXCIuY29uY2F0KGd1ZXN0UGF0aCwgXCIvdjFcIikuY29uY2F0KHByZXZpZXdQYXRoLCBcIi9cIikuY29uY2F0KGVuZHBvaW50TmFtZSwgXCIuanNvblwiKTtcbn07XG5leHBvcnRzLmJ1aWxkUGF0aCA9IGJ1aWxkUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVybC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJhc2VDbGllbnQgPSB2b2lkIDA7XG52YXIgdXJsXzEgPSByZXF1aXJlKFwiLi4vdXJsXCIpO1xudmFyIEJhc2VDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZUNsaWVudChjbGllbnQsIGd1ZXN0U3BhY2VJZCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy5ndWVzdFNwYWNlSWQgPSBndWVzdFNwYWNlSWQ7XG4gICAgfVxuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiAoMCwgdXJsXzEuYnVpbGRQYXRoKShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcGFyYW1zKSwgeyBndWVzdFNwYWNlSWQ6IHRoaXMuZ3Vlc3RTcGFjZUlkIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGVuZHBvaW50IGZvciB0aGUgQVBJIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZ3Vlc3Qgc3BhY2UgVVJMLlxuICAgICAqIE90aGVyd2lzZSwgcGxlYXNlIHVzZSBgYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZGAgaW5zdGVhZC5cbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmJ1aWxkUGF0aCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuICgwLCB1cmxfMS5idWlsZFBhdGgpKHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUNsaWVudDtcbn0oKSk7XG5leHBvcnRzLkJhc2VDbGllbnQgPSBCYXNlQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmFzZUNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CdWxrUmVxdWVzdENsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIEJ1bGtSZXF1ZXN0Q2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCdWxrUmVxdWVzdENsaWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCdWxrUmVxdWVzdENsaWVudChjbGllbnQsIGd1ZXN0U3BhY2VJZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjbGllbnQsIGd1ZXN0U3BhY2VJZCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuUkVRVUVTVFNfTEVOR1RIX0xJTUlUID0gMjA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQnVsa1JlcXVlc3RDbGllbnQucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByZXF1ZXN0c1BhcmFtID0gcGFyYW1zLnJlcXVlc3RzO1xuICAgICAgICB2YXIgcmVxdWVzdHMgPSByZXF1ZXN0c1BhcmFtLm1hcChmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKFwiZW5kcG9pbnROYW1lXCIgaW4gcmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHZhciBlbmRwb2ludE5hbWUgPSByZXF1ZXN0LmVuZHBvaW50TmFtZSwgcmVzdCA9IF9fcmVzdChyZXF1ZXN0LCBbXCJlbmRwb2ludE5hbWVcIl0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbih7IGFwaTogX3RoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7IGVuZHBvaW50TmFtZTogZW5kcG9pbnROYW1lIH0pIH0sIHJlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYnVsa1JlcXVlc3RcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHsgcmVxdWVzdHM6IHJlcXVlc3RzIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEJ1bGtSZXF1ZXN0Q2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5CdWxrUmVxdWVzdENsaWVudCA9IEJ1bGtSZXF1ZXN0Q2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnVsa1JlcXVlc3RDbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFwcENsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIEFwcENsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXBwQ2xpZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFwcENsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2ZpZWxkc1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuYWRkRm9ybUZpZWxkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2ZpZWxkc1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZUZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvZm9ybS9maWVsZHNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmRlbGV0ZUZvcm1GaWVsZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvZm9ybS9maWVsZHNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEZvcm1MYXlvdXQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2xheW91dFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlRm9ybUxheW91dCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9mb3JtL2xheW91dFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0Vmlld3MgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC92aWV3c1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVZpZXdzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL3ZpZXdzXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRBcHAgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHBcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0QXBwcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcHNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuYWRkQXBwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSwgc3BhY2UsIHBhdGgsIHNwYWNlUGF0aCwgZGVmYXVsdFRocmVhZDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJhbXMubmFtZSwgc3BhY2UgPSBwYXJhbXMuc3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGFjZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZVBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5nZXQoc3BhY2VQYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUaHJlYWQgPSAoX2Euc2VudCgpKS5kZWZhdWx0VGhyZWFkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgX19hc3NpZ24oX19hc3NpZ24oe30sIHBhcmFtcyksIHsgdGhyZWFkOiBkZWZhdWx0VGhyZWFkIH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgeyBuYW1lOiBuYW1lIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcFNldHRpbmdzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvc2V0dGluZ3NcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBcHBTZXR0aW5ncyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zZXR0aW5nc1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UHJvY2Vzc01hbmFnZW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zdGF0dXNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVQcm9jZXNzTWFuYWdlbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9zdGF0dXNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldERlcGxveVN0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9kZXBsb3lcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmRlcGxveUFwcCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9kZXBsb3lcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRGaWVsZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiZmllbGQvYWNsXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCBfX2Fzc2lnbih7fSwgcmVzdCkpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVGaWVsZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgLy8gTk9URTogV2hlbiBleGVjdXRpbmcgdGhpcyBBUEkgd2l0aG91dCBgcHJldmlld2AsXG4gICAgICAgIC8vIGFsbCBwcmUtbGl2ZSBhcHAncyBzZXR0aW5ncyB3aWxsIGJlIGRlcGxveWVkIHRvIGxpdmUgYXBwLlxuICAgICAgICAvLyBUaGlzIGJlaGF2aW9yIG1heSBub3QgYmUgd2hhdCB0aGUgdXNlcnMgZXhwZWN0ZWQsXG4gICAgICAgIC8vIHNvIHdlIGRpc2FibGUgaXQgdGVtcG9yYXJpbHkuXG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJmaWVsZC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjbFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQXBwQWNsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAvLyBOT1RFOiBXaGVuIGV4ZWN1dGluZyB0aGlzIEFQSSB3aXRob3V0IGBwcmV2aWV3YCxcbiAgICAgICAgLy8gYWxsIHByZS1saXZlIGFwcCdzIHNldHRpbmdzIHdpbGwgYmUgZGVwbG95ZWQgdG8gbGl2ZSBhcHAuXG4gICAgICAgIC8vIFRoaXMgYmVoYXZpb3IgbWF5IG5vdCBiZSB3aGF0IHRoZSB1c2VycyBleHBlY3RlZCxcbiAgICAgICAgLy8gc28gd2UgZGlzYWJsZSBpdCB0ZW1wb3JhcmlseS5cbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmV2YWx1YXRlUmVjb3Jkc0FjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHMvYWNsL2V2YWx1YXRlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldFJlY29yZEFjbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkL2FjbFwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3JkQWNsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAvLyBOT1RFOiBXaGVuIGV4ZWN1dGluZyB0aGlzIEFQSSB3aXRob3V0IGBwcmV2aWV3YCxcbiAgICAgICAgLy8gYWxsIHByZS1saXZlIGFwcCdzIHNldHRpbmdzIHdpbGwgYmUgZGVwbG95ZWQgdG8gbGl2ZSBhcHAuXG4gICAgICAgIC8vIFRoaXMgYmVoYXZpb3IgbWF5IG5vdCBiZSB3aGF0IHRoZSB1c2VycyBleHBlY3RlZCxcbiAgICAgICAgLy8gc28gd2UgZGlzYWJsZSBpdCB0ZW1wb3JhcmlseS5cbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9hY2xcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFwcEN1c3RvbWl6ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2N1c3RvbWl6ZVwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQXBwQ3VzdG9taXplID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2N1c3RvbWl6ZVwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0R2VuZXJhbE5vdGlmaWNhdGlvbnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL2dlbmVyYWxcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIF9fYXNzaWduKHt9LCByZXN0KSk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZUdlbmVyYWxOb3RpZmljYXRpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL25vdGlmaWNhdGlvbnMvZ2VuZXJhbFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UGVyUmVjb3JkTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL25vdGlmaWNhdGlvbnMvcGVyUmVjb3JkXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCByZXN0KTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlUGVyUmVjb3JkTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL3BlclJlY29yZFwiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UmVtaW5kZXJOb3RpZmljYXRpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvbm90aWZpY2F0aW9ucy9yZW1pbmRlclwiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlbWluZGVyTm90aWZpY2F0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9ub3RpZmljYXRpb25zL3JlbWluZGVyXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5nZXRSZXBvcnRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcHJldmlldyA9IHBhcmFtcy5wcmV2aWV3LCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wicHJldmlld1wiXSk7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvcmVwb3J0c1wiLFxuICAgICAgICAgICAgcHJldmlldzogcHJldmlldyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcmVzdCk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlcG9ydHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvcmVwb3J0c1wiLFxuICAgICAgICAgICAgcHJldmlldzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0QXBwQWN0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjdGlvbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBcHBBY3Rpb25zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL2FjdGlvbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBBcHBDbGllbnQucHJvdG90eXBlLmdldEFkbWluTm90ZXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gcGFyYW1zLnByZXZpZXcsIHJlc3QgPSBfX3Jlc3QocGFyYW1zLCBbXCJwcmV2aWV3XCJdKTtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9hZG1pbk5vdGVzXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiBwcmV2aWV3LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCByZXN0KTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUudXBkYXRlQWRtaW5Ob3RlcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImFwcC9hZG1pbk5vdGVzXCIsXG4gICAgICAgICAgICBwcmV2aWV3OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJhcHAvbW92ZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIEFwcENsaWVudC5wcm90b3R5cGUuZ2V0UGx1Z2lucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHByZXZpZXcgPSBwYXJhbXMucHJldmlldywgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcInByZXZpZXdcIl0pO1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL3BsdWdpbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHByZXZpZXcsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHJlc3QpO1xuICAgIH07XG4gICAgQXBwQ2xpZW50LnByb3RvdHlwZS5hZGRQbHVnaW5zID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwiYXBwL3BsdWdpbnNcIixcbiAgICAgICAgICAgIHByZXZpZXc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEFwcENsaWVudDtcbn0oQmFzZUNsaWVudF8xLkJhc2VDbGllbnQpKTtcbmV4cG9ydHMuQXBwQ2xpZW50ID0gQXBwQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXBwQ2xpZW50LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZUFib3J0U2VhcmNoRXJyb3IgPSB2b2lkIDA7XG52YXIgS2ludG9uZUFib3J0U2VhcmNoRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEtpbnRvbmVBYm9ydFNlYXJjaEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEtpbnRvbmVBYm9ydFNlYXJjaEVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IFwiS2ludG9uZUFib3J0U2VhcmNoRXJyb3JcIjtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC93aWtpL0JyZWFraW5nLUNoYW5nZXMjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgS2ludG9uZUFib3J0U2VhcmNoRXJyb3IucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gS2ludG9uZUFib3J0U2VhcmNoRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnRzLktpbnRvbmVBYm9ydFNlYXJjaEVycm9yID0gS2ludG9uZUFib3J0U2VhcmNoRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LaW50b25lQWJvcnRTZWFyY2hFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLktpbnRvbmVBbGxSZWNvcmRzRXJyb3IgPSB2b2lkIDA7XG52YXIgS2ludG9uZUFsbFJlY29yZHNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoS2ludG9uZUFsbFJlY29yZHNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBLaW50b25lQWxsUmVjb3Jkc0Vycm9yKHByb2Nlc3NlZFJlY29yZHNSZXN1bHQsIHVucHJvY2Vzc2VkUmVjb3JkcywgbnVtT2ZBbGxSZWNvcmRzLCBlcnJvciwgY2h1bmtMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG51bU9mUHJvY2Vzc2VkUmVjb3JkcyA9IG51bU9mQWxsUmVjb3JkcyAtIHVucHJvY2Vzc2VkUmVjb3Jkcy5sZW5ndGg7XG4gICAgICAgIHZhciBlcnJvckluZGV4ID0gS2ludG9uZUFsbFJlY29yZHNFcnJvci5leHRyYWN0RXJyb3JJbmRleChudW1PZlByb2Nlc3NlZFJlY29yZHMsIGVycm9yLCBjaHVua0xlbmd0aCk7XG4gICAgICAgIHZhciBtZXNzYWdlID0gS2ludG9uZUFsbFJlY29yZHNFcnJvci5idWlsZEVycm9yTWVzc2FnZShudW1PZlByb2Nlc3NlZFJlY29yZHMsIG51bU9mQWxsUmVjb3JkcywgZXJyb3JJbmRleCk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IFwiS2ludG9uZUFsbFJlY29yZHNFcnJvclwiO1xuICAgICAgICBfdGhpcy5wcm9jZXNzZWRSZWNvcmRzUmVzdWx0ID0gcHJvY2Vzc2VkUmVjb3Jkc1Jlc3VsdDtcbiAgICAgICAgX3RoaXMudW5wcm9jZXNzZWRSZWNvcmRzID0gdW5wcm9jZXNzZWRSZWNvcmRzO1xuICAgICAgICBfdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICBfdGhpcy5lcnJvckluZGV4ID0gZXJyb3JJbmRleDtcbiAgICAgICAgX3RoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIF90aGlzLm51bU9mUHJvY2Vzc2VkUmVjb3JkcyA9IG51bU9mUHJvY2Vzc2VkUmVjb3JkcztcbiAgICAgICAgX3RoaXMubnVtT2ZBbGxSZWNvcmRzID0gbnVtT2ZBbGxSZWNvcmRzO1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgICAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IucHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBLaW50b25lQWxsUmVjb3Jkc0Vycm9yLnBhcnNlRXJyb3JJbmRleCA9IGZ1bmN0aW9uIChlcnJvcnMpIHtcbiAgICAgICAgLy8gVE9ETzogdXNlIG1hdGNoQWxsIGFmdGVyIEVTMjAyMCBzdXBwb3J0XG4gICAgICAgIHZhciBlcnJvckluZGV4ZXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcktleSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGVycm9yS2V5Lm1hdGNoKC9yZWNvcmRzXFxbKFxcZCspXFxdLyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgZXJyb3JJbmRleGVzLnB1c2goTnVtYmVyKHJlc3VsdFsxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9ySW5kZXhlcy5sZW5ndGggPiAwID8gTWF0aC5taW4uYXBwbHkoTWF0aCwgZXJyb3JJbmRleGVzKSA6IG51bGw7XG4gICAgfTtcbiAgICBLaW50b25lQWxsUmVjb3Jkc0Vycm9yLmV4dHJhY3RFcnJvckluZGV4ID0gZnVuY3Rpb24gKG51bU9mUHJvY2Vzc2VkUmVjb3JkcywgZXJyb3IsIGNodW5rTGVuZ3RoKSB7XG4gICAgICAgIGlmIChlcnJvci5idWxrUmVxdWVzdEluZGV4ICE9PSB1bmRlZmluZWQgJiYgZXJyb3IuZXJyb3JzKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JQYXJzZVJlc3VsdCA9IEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IucGFyc2VFcnJvckluZGV4KGVycm9yLmVycm9ycyk7XG4gICAgICAgICAgICBpZiAoZXJyb3JQYXJzZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAobnVtT2ZQcm9jZXNzZWRSZWNvcmRzICtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYnVsa1JlcXVlc3RJbmRleCAqIGNodW5rTGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JQYXJzZVJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IuYnVpbGRFcnJvck1lc3NhZ2UgPSBmdW5jdGlvbiAobnVtT2ZQcm9jZXNzZWRSZWNvcmRzLCBudW1PZkFsbFJlY29yZHMsIGVycm9ySW5kZXgpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIlwiO1xuICAgICAgICBpZiAoZXJyb3JJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJBbiBlcnJvciBvY2N1cnJlZCBhdCByZWNvcmRzW1wiLmNvbmNhdChlcnJvckluZGV4LCBcIl0uIFwiKTtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlICs9IFwiXCIuY29uY2F0KG51bU9mUHJvY2Vzc2VkUmVjb3JkcywgXCIvXCIpLmNvbmNhdChudW1PZkFsbFJlY29yZHMsIFwiIHJlY29yZHMgYXJlIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH07XG4gICAgcmV0dXJuIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnRzLktpbnRvbmVBbGxSZWNvcmRzRXJyb3IgPSBLaW50b25lQWxsUmVjb3Jkc0Vycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2ludG9uZUFsbFJlY29yZHNFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLktpbnRvbmVSZXN0QVBJRXJyb3IgPSB2b2lkIDA7XG52YXIgS2ludG9uZVJlc3RBUElFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoS2ludG9uZVJlc3RBUElFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBLaW50b25lUmVzdEFQSUVycm9yKGVycm9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IEtpbnRvbmVSZXN0QVBJRXJyb3IuYnVpbGRFcnJvclJlc3BvbnNlRGF0ZVdpdGhJbmRleChlcnJvciksIGRhdGEgPSBfYS5kYXRhLCBidWxrUmVxdWVzdEluZGV4ID0gX2EuYnVsa1JlcXVlc3RJbmRleDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkYXRhLm1lc3NhZ2UpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5hbWUgPSBcIktpbnRvbmVSZXN0QVBJRXJyb3JcIjtcbiAgICAgICAgX3RoaXMuaWQgPSBkYXRhLmlkO1xuICAgICAgICBfdGhpcy5jb2RlID0gZGF0YS5jb2RlO1xuICAgICAgICBfdGhpcy5lcnJvcnMgPSBkYXRhLmVycm9ycztcbiAgICAgICAgX3RoaXMuc3RhdHVzID0gZXJyb3Iuc3RhdHVzO1xuICAgICAgICBfdGhpcy5idWxrUmVxdWVzdEluZGV4ID0gYnVsa1JlcXVlc3RJbmRleDtcbiAgICAgICAgX3RoaXMuaGVhZGVycyA9IGVycm9yLmhlYWRlcnM7XG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBcIltcIi5jb25jYXQoZXJyb3Iuc3RhdHVzLCBcIl0gW1wiKS5jb25jYXQoX3RoaXMuY29kZSwgXCJdIFwiKS5jb25jYXQoX3RoaXMubWVzc2FnZSwgXCIgKFwiKS5jb25jYXQoX3RoaXMuaWQsIFwiKVwiKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjQ3VzdG9tX0Vycm9yX1R5cGVzXG4gICAgICAgIC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgZm9yIHdoZXJlIG91ciBlcnJvciB3YXMgdGhyb3duIChvbmx5IGF2YWlsYWJsZSBvbiBWOClcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShfdGhpcywgS2ludG9uZVJlc3RBUElFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3dpa2kvQnJlYWtpbmctQ2hhbmdlcyNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAgICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBLaW50b25lUmVzdEFQSUVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgS2ludG9uZVJlc3RBUElFcnJvci5maW5kRXJyb3JSZXNwb25zZURhdGFXaXRoSW5kZXggPSBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXN1bHRzW2ldKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogZGF0YSwgYnVsa1JlcXVlc3RJbmRleDogaSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IEVycm9yKFwiTWlzc2luZyByZXNwb25zZSBkYXRhIGluIGByZXN1bHRzYC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIEtpbnRvbmUgUkVTVCBBUEkgQ2xpZW50LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIik7XG4gICAgfTtcbiAgICBLaW50b25lUmVzdEFQSUVycm9yLmJ1aWxkRXJyb3JSZXNwb25zZURhdGVXaXRoSW5kZXggPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKFwicmVzdWx0c1wiIGluIGVycm9yLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBLaW50b25lUmVzdEFQSUVycm9yLmZpbmRFcnJvclJlc3BvbnNlRGF0YVdpdGhJbmRleChlcnJvci5kYXRhLnJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRhdGE6IGVycm9yLmRhdGEgfTtcbiAgICB9O1xuICAgIHJldHVybiBLaW50b25lUmVzdEFQSUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUVycm9yID0gS2ludG9uZVJlc3RBUElFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtpbnRvbmVSZXN0QVBJRXJyb3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9LaW50b25lQWJvcnRTZWFyY2hFcnJvclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vS2ludG9uZUFsbFJlY29yZHNFcnJvclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vS2ludG9uZVJlc3RBUElFcnJvclwiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVjb3JkQ2xpZW50ID0gdm9pZCAwO1xudmFyIGVycm9yXzEgPSByZXF1aXJlKFwiLi4vZXJyb3JcIik7XG52YXIgQmFzZUNsaWVudF8xID0gcmVxdWlyZShcIi4vQmFzZUNsaWVudFwiKTtcbnZhciBBRERfUkVDT1JEU19MSU1JVCA9IDEwMDtcbnZhciBVUERBVEVfUkVDT1JEU19MSU1JVCA9IDEwMDtcbnZhciBERUxFVEVfUkVDT1JEU19MSU1JVCA9IDEwMDtcbnZhciBHRVRfUkVDT1JEU19MSU1JVCA9IDUwMDtcbnZhciBSZWNvcmRDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlY29yZENsaWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZWNvcmRDbGllbnQoY2xpZW50LCBidWxrUmVxdWVzdENsaWVudCwgZ3Vlc3RTcGFjZUlkKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNsaWVudCwgZ3Vlc3RTcGFjZUlkKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5idWxrUmVxdWVzdENsaWVudCA9IGJ1bGtSZXF1ZXN0Q2xpZW50O1xuICAgICAgICBfdGhpcy5kaWRXYXJuTWF4aW11bU9mZnNldFZhbHVlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRSZWNvcmQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuYWRkUmVjb3JkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVSZWNvcmQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBzZXJ0UmVjb3JkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXBwLCB1cGRhdGVLZXksIHJlY29yZCwgcmVjb3JkcywgcmV2aXNpb247XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAgPSBwYXJhbXMuYXBwLCB1cGRhdGVLZXkgPSBwYXJhbXMudXBkYXRlS2V5LCByZWNvcmQgPSBwYXJhbXMucmVjb3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZWNvcmRzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBcIlwiLmNvbmNhdCh1cGRhdGVLZXkuZmllbGQsIFwiID0gXFxcIlwiKS5jb25jYXQodXBkYXRlS2V5LnZhbHVlLCBcIlxcXCJcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzID0gKF9iLnNlbnQoKSkucmVjb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlY29yZHMubGVuZ3RoID4gMCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVjb3Jkc1swXS4kaWQudHlwZSA9PT0gXCJfX0lEX19cIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy51cGRhdGVSZWNvcmQocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0gKF9iLnNlbnQoKSkucmV2aXNpb247XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBpZDogcmVjb3Jkc1swXS4kaWQudmFsdWUsIHJldmlzaW9uOiByZXZpc2lvbiB9XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGAkaWRgIGluIGBnZXRSZWNvcmRzYCByZXNwb25zZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIEtpbnRvbmUgUkVTVCBBUEkgQ2xpZW50LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuYWRkUmVjb3JkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IE9iamVjdC5hc3NpZ24oe30sIHJlY29yZCwgKF9hID0ge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hW3VwZGF0ZUtleS5maWVsZF0gPSB7IHZhbHVlOiB1cGRhdGVLZXkudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBgcmVjb3Jkc2AgdHlwZSBpbiByZXR1cm4gdHlwZSBzaG91bGQgYmUgZmlsdGVyZWQgYnkgYGZpZWxkc2AuXG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGF0aCwgcmVzcG9uc2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YXJuTWF4aW11bU9mZnNldFZhbHVlSWZOZWVkZWQocGFyYW1zLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZXNwb25zZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS53YXJuTWF4aW11bU9mZnNldFZhbHVlSWZOZWVkZWQgPSBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICB2YXIgcmVnZXhwID0gL29mZnNldFxccysoXFxkKykvaTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBxdWVyeS5tYXRjaChyZWdleHApO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpZFdhcm5NYXhpbXVtT2Zmc2V0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgICAgICAgICBOdW1iZXIocmVzdWx0WzFdKSA+IDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWRXYXJuTWF4aW11bU9mZnNldFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBUaGUgbWF4aW11bSBvZmZzZXQgdmFsdWUgd2lsbCBiZSBsaW1pdGVkIHRvIDEwLDAwMCBpbiB0aGUgZnV0dXJlLiBQbGVhc2UgdXNlIGBjcmVhdGVDdXJzb3IoKWAgYW5kIGBnZXRSZWNvcmRzQnlDdXJzb3IoKWAgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuYWRkUmVjb3JkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhdGgsIF9hLCBpZHMsIHJldmlzaW9ucztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpLCBpZHMgPSBfYS5pZHMsIHJldmlzaW9ucyA9IF9hLnJldmlzaW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkczogaWRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbnM6IHJldmlzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogaWRzLm1hcChmdW5jdGlvbiAoaWQsIGkpIHsgcmV0dXJuICh7IGlkOiBpZCwgcmV2aXNpb246IHJldmlzaW9uc1tpXSB9KTsgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5kZWxldGVSZWNvcmRzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkc1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5jcmVhdGVDdXJzb3IgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzL2N1cnNvclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0UmVjb3Jkc0J5Q3Vyc29yID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkcy9jdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZGVsZXRlQ3Vyc29yID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3Jkcy9jdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGUocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZ2V0QWxsUmVjb3JkcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiwgb3JkZXJCeSwgX2EsIHdpdGhDdXJzb3IsIHJlc3QsIGNvbmRpdGlvblF1ZXJ5LCBxdWVyeTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBwYXJhbXMuY29uZGl0aW9uLCBvcmRlckJ5ID0gcGFyYW1zLm9yZGVyQnksIF9hID0gcGFyYW1zLndpdGhDdXJzb3IsIHdpdGhDdXJzb3IgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hLCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wiY29uZGl0aW9uXCIsIFwib3JkZXJCeVwiLCBcIndpdGhDdXJzb3JcIl0pO1xuICAgICAgICAgICAgICAgIGlmICghb3JkZXJCeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5nZXRBbGxSZWNvcmRzV2l0aElkKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgeyBjb25kaXRpb246IGNvbmRpdGlvbiB9KSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod2l0aEN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25RdWVyeSA9IGNvbmRpdGlvbiA/IFwiXCIuY29uY2F0KGNvbmRpdGlvbiwgXCIgXCIpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBcIlwiLmNvbmNhdChjb25kaXRpb25RdWVyeSkuY29uY2F0KG9yZGVyQnkgPyBcIm9yZGVyIGJ5IFwiLmNvbmNhdChvcmRlckJ5KSA6IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5nZXRBbGxSZWNvcmRzV2l0aEN1cnNvcihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdCksIHsgcXVlcnk6IHF1ZXJ5IH0pKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmdldEFsbFJlY29yZHNXaXRoT2Zmc2V0KF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgeyBvcmRlckJ5OiBvcmRlckJ5LCBjb25kaXRpb246IGNvbmRpdGlvbiB9KSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRBbGxSZWNvcmRzV2l0aElkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxGaWVsZHMsIGNvbmRpdGlvbiwgcmVzdCwgZmllbGRzLCBjb25kaXRpb25RdWVyeSwgYWxsUmVjb3JkcywgbGFzdElkLCBxdWVyeSwgcmVzdWx0LCBsYXN0UmVjb3JkO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxGaWVsZHMgPSBwYXJhbXMuZmllbGRzLCBjb25kaXRpb24gPSBwYXJhbXMuY29uZGl0aW9uLCByZXN0ID0gX19yZXN0KHBhcmFtcywgW1wiZmllbGRzXCIsIFwiY29uZGl0aW9uXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IG9yaWdpbmFsRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kICRpZCBpZiAkaWQgZG9lc24ndCBleGlzdCBpbiBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDAgJiYgZmllbGRzLmluZGV4T2YoXCIkaWRcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBmaWVsZHMsIHRydWUpLCBbXCIkaWRcIl0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblF1ZXJ5ID0gY29uZGl0aW9uID8gXCIoXCIuY29uY2F0KGNvbmRpdGlvbiwgXCIpIGFuZCBcIikgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVjb3JkcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdElkID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJ1ZSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IFwiXCIuY29uY2F0KGNvbmRpdGlvblF1ZXJ5LCBcIiRpZCA+IFwiKS5jb25jYXQobGFzdElkLCBcIiBvcmRlciBieSAkaWQgYXNjIGxpbWl0IFwiKS5jb25jYXQoR0VUX1JFQ09SRFNfTElNSVQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZWNvcmRzKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgeyBmaWVsZHM6IGZpZWxkcywgcXVlcnk6IHF1ZXJ5IH0pKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFJlY29yZHMgPSBhbGxSZWNvcmRzLmNvbmNhdChyZXN1bHQucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlY29yZHMubGVuZ3RoIDwgR0VUX1JFQ09SRFNfTElNSVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSZWNvcmQgPSByZXN1bHQucmVjb3Jkc1tyZXN1bHQucmVjb3Jkcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UmVjb3JkLiRpZC50eXBlID09PSBcIl9fSURfX1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdElkID0gbGFzdFJlY29yZC4kaWQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGAkaWRgIGluIGBnZXRSZWNvcmRzYCByZXNwb25zZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIEtpbnRvbmUgUkVTVCBBUEkgQ2xpZW50LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgYWxsUmVjb3Jkc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRBbGxSZWNvcmRzV2l0aE9mZnNldCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiwgb3JkZXJCeSwgcmVzdCwgY29uZGl0aW9uUXVlcnksIGFsbFJlY29yZHMsIG9mZnNldCwgcXVlcnksIHJlc3VsdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IHBhcmFtcy5jb25kaXRpb24sIG9yZGVyQnkgPSBwYXJhbXMub3JkZXJCeSwgcmVzdCA9IF9fcmVzdChwYXJhbXMsIFtcImNvbmRpdGlvblwiLCBcIm9yZGVyQnlcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uUXVlcnkgPSBjb25kaXRpb24gPyBcIlwiLmNvbmNhdChjb25kaXRpb24sIFwiIFwiKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRydWUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBcIlwiLmNvbmNhdChjb25kaXRpb25RdWVyeSkuY29uY2F0KG9yZGVyQnkgPyBcIm9yZGVyIGJ5IFwiLmNvbmNhdChvcmRlckJ5LCBcIiBcIikgOiBcIlwiLCBcImxpbWl0IFwiKS5jb25jYXQoR0VUX1JFQ09SRFNfTElNSVQsIFwiIG9mZnNldCBcIikuY29uY2F0KG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmdldFJlY29yZHMoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc3QpLCB7IHF1ZXJ5OiBxdWVyeSB9KSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWNvcmRzID0gYWxsUmVjb3Jkcy5jb25jYXQocmVzdWx0LnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWNvcmRzLmxlbmd0aCA8IEdFVF9SRUNPUkRTX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gR0VUX1JFQ09SRFNfTElNSVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgYWxsUmVjb3Jkc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRBbGxSZWNvcmRzV2l0aEN1cnNvciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlkLCBhbGxSZWNvcmRzLCByZXN1bHQsIGVycm9yXzI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuY3JlYXRlQ3Vyc29yKHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IChfYS5zZW50KCkpLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzIsIDYsICwgOF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVjb3JkcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRydWUpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZWNvcmRzQnlDdXJzb3IoeyBpZDogaWQgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxSZWNvcmRzID0gYWxsUmVjb3Jkcy5jb25jYXQocmVzdWx0LnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGFsbFJlY29yZHNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kZWxldGVDdXJzb3IoeyBpZDogaWQgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcl8yO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZEFsbFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5yZWNvcmRzLmV2ZXJ5KGZ1bmN0aW9uIChyZWNvcmQpIHsgcmV0dXJuICFBcnJheS5pc0FycmF5KHJlY29yZCkgJiYgcmVjb3JkIGluc3RhbmNlb2YgT2JqZWN0OyB9KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aGUgYHJlY29yZHNgIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5IG9mIG9iamVjdC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmFkZEFsbFJlY29yZHNSZWN1cnNpdmUocGFyYW1zLCBwYXJhbXMucmVjb3Jkcy5sZW5ndGgsIFtdKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZEFsbFJlY29yZHNSZWN1cnNpdmUgPSBmdW5jdGlvbiAocGFyYW1zLCBudW1PZkFsbFJlY29yZHMsIHJlc3VsdHMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIENIVU5LX0xFTkdUSCwgYXBwLCByZWNvcmRzLCByZWNvcmRzQ2h1bmssIG5ld1Jlc3VsdHMsIGVfMTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIENIVU5LX0xFTkdUSCA9IHRoaXMuYnVsa1JlcXVlc3RDbGllbnQuUkVRVUVTVFNfTEVOR1RIX0xJTUlUICogQUREX1JFQ09SRFNfTElNSVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHAgPSBwYXJhbXMuYXBwLCByZWNvcmRzID0gcGFyYW1zLnJlY29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzQ2h1bmsgPSByZWNvcmRzLnNsaWNlKDAsIENIVU5LX0xFTkdUSCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3Jkc0NodW5rLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHJlY29yZHM6IHJlc3VsdHMgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMSwgMywgLCA0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmFkZEFsbFJlY29yZHNXaXRoQnVsa1JlcXVlc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogcmVjb3Jkc0NodW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVzdWx0cyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JfMS5LaW50b25lQWxsUmVjb3Jkc0Vycm9yKHsgcmVjb3JkczogcmVzdWx0cyB9LCByZWNvcmRzLCBudW1PZkFsbFJlY29yZHMsIGVfMSwgQUREX1JFQ09SRFNfTElNSVQpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmFkZEFsbFJlY29yZHNSZWN1cnNpdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHMuc2xpY2UoQ0hVTktfTEVOR1RIKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bU9mQWxsUmVjb3JkcywgcmVzdWx0cy5jb25jYXQobmV3UmVzdWx0cykpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmFkZEFsbFJlY29yZHNXaXRoQnVsa1JlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzZXBhcmF0ZWRSZWNvcmRzLCByZXF1ZXN0cywgcmVzdWx0cztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlZFJlY29yZHMgPSB0aGlzLnNlcGFyYXRlQXJyYXlSZWN1cnNpdmUoQUREX1JFQ09SRFNfTElNSVQsIFtdLCBwYXJhbXMucmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyA9IHNlcGFyYXRlZFJlY29yZHMubWFwKGZ1bmN0aW9uIChyZWNvcmRzKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogcmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWxrUmVxdWVzdENsaWVudC5zZW5kKHsgcmVxdWVzdHM6IHJlcXVlc3RzIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IChfYS5zZW50KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkcyA9IHJlc3VsdC5pZHMsIHJldmlzaW9ucyA9IHJlc3VsdC5yZXZpc2lvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZHMubWFwKGZ1bmN0aW9uIChpZCwgaSkgeyByZXR1cm4gKHsgaWQ6IGlkLCByZXZpc2lvbjogcmV2aXNpb25zW2ldIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQocmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLnVwZGF0ZUFsbFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy51cGRhdGVBbGxSZWNvcmRzUmVjdXJzaXZlKHBhcmFtcywgcGFyYW1zLnJlY29yZHMubGVuZ3RoLCBbXSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBbGxSZWNvcmRzUmVjdXJzaXZlID0gZnVuY3Rpb24gKHBhcmFtcywgbnVtT2ZBbGxSZWNvcmRzLCByZXN1bHRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBDSFVOS19MRU5HVEgsIGFwcCwgcmVjb3JkcywgcmVjb3Jkc0NodW5rLCBuZXdSZXN1bHRzLCBlXzI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19MRU5HVEggPSB0aGlzLmJ1bGtSZXF1ZXN0Q2xpZW50LlJFUVVFU1RTX0xFTkdUSF9MSU1JVCAqIFVQREFURV9SRUNPUkRTX0xJTUlUO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwID0gcGFyYW1zLmFwcCwgcmVjb3JkcyA9IHBhcmFtcy5yZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0NodW5rID0gcmVjb3Jkcy5zbGljZSgwLCBDSFVOS19MRU5HVEgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZHNDaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyByZWNvcmRzOiByZXN1bHRzIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy51cGRhdGVBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHNDaHVuayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jlc3VsdHMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8yID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yXzEuS2ludG9uZUFsbFJlY29yZHNFcnJvcih7IHJlY29yZHM6IHJlc3VsdHMgfSwgcmVjb3JkcywgbnVtT2ZBbGxSZWNvcmRzLCBlXzIsIFVQREFURV9SRUNPUkRTX0xJTUlUKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy51cGRhdGVBbGxSZWNvcmRzUmVjdXJzaXZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IGFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzOiByZWNvcmRzLnNsaWNlKENIVU5LX0xFTkdUSCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBudW1PZkFsbFJlY29yZHMsIHJlc3VsdHMuY29uY2F0KG5ld1Jlc3VsdHMpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc2VwYXJhdGVkUmVjb3JkcywgcmVxdWVzdHMsIHJlc3VsdHM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZWRSZWNvcmRzID0gdGhpcy5zZXBhcmF0ZUFycmF5UmVjdXJzaXZlKFVQREFURV9SRUNPUkRTX0xJTUlULCBbXSwgcGFyYW1zLnJlY29yZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgPSBzZXBhcmF0ZWRSZWNvcmRzLm1hcChmdW5jdGlvbiAocmVjb3JkcykgeyByZXR1cm4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogcmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWxrUmVxdWVzdENsaWVudC5zZW5kKHsgcmVxdWVzdHM6IHJlcXVlc3RzIH0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IChfYS5zZW50KCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdC5yZWNvcmRzOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQocmVjb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmRlbGV0ZUFsbFJlY29yZHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUFsbFJlY29yZHNSZWN1cnNpdmUocGFyYW1zLCBwYXJhbXMucmVjb3Jkcy5sZW5ndGgpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5kZWxldGVBbGxSZWNvcmRzUmVjdXJzaXZlID0gZnVuY3Rpb24gKHBhcmFtcywgbnVtT2ZBbGxSZWNvcmRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBDSFVOS19MRU5HVEgsIGFwcCwgcmVjb3JkcywgcmVjb3Jkc0NodW5rLCBlXzM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19MRU5HVEggPSB0aGlzLmJ1bGtSZXF1ZXN0Q2xpZW50LlJFUVVFU1RTX0xFTkdUSF9MSU1JVCAqIERFTEVURV9SRUNPUkRTX0xJTUlUO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwID0gcGFyYW1zLmFwcCwgcmVjb3JkcyA9IHBhcmFtcy5yZWNvcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0NodW5rID0gcmVjb3Jkcy5zbGljZSgwLCBDSFVOS19MRU5HVEgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZHNDaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywge31dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5kZWxldGVBbGxSZWNvcmRzV2l0aEJ1bGtSZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHNDaHVuayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JfMS5LaW50b25lQWxsUmVjb3Jkc0Vycm9yKHt9LCByZWNvcmRzLCBudW1PZkFsbFJlY29yZHMsIGVfMywgREVMRVRFX1JFQ09SRFNfTElNSVQpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmRlbGV0ZUFsbFJlY29yZHNSZWN1cnNpdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM6IHJlY29yZHMuc2xpY2UoQ0hVTktfTEVOR1RIKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bU9mQWxsUmVjb3JkcyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUuZGVsZXRlQWxsUmVjb3Jkc1dpdGhCdWxrUmVxdWVzdCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNlcGFyYXRlZFJlY29yZHMsIHJlcXVlc3RzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGVkUmVjb3JkcyA9IHRoaXMuc2VwYXJhdGVBcnJheVJlY3Vyc2l2ZShERUxFVEVfUkVDT1JEU19MSU1JVCwgW10sIHBhcmFtcy5yZWNvcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzID0gc2VwYXJhdGVkUmVjb3Jkcy5tYXAoZnVuY3Rpb24gKHJlY29yZHMpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkczogcmVjb3Jkcy5tYXAoZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gcmVjb3JkLmlkOyB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb25zOiByZWNvcmRzLm1hcChmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiByZWNvcmQucmV2aXNpb247IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJ1bGtSZXF1ZXN0Q2xpZW50LnNlbmQoeyByZXF1ZXN0czogcmVxdWVzdHMgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5zZXBhcmF0ZUFycmF5UmVjdXJzaXZlID0gZnVuY3Rpb24gKHNpemUsIHNlcGFyYXRlZCwgYXJyYXkpIHtcbiAgICAgICAgdmFyIGNodW5rID0gYXJyYXkuc2xpY2UoMCwgc2l6ZSk7XG4gICAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzZXBhcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VwYXJhdGVBcnJheVJlY3Vyc2l2ZShzaXplLCBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIHNlcGFyYXRlZCwgdHJ1ZSksIFtjaHVua10sIGZhbHNlKSwgYXJyYXkuc2xpY2Uoc2l6ZSkpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5hZGRSZWNvcmRDb21tZW50ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwicmVjb3JkL2NvbW1lbnRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wb3N0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLmRlbGV0ZVJlY29yZENvbW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmQvY29tbWVudFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS5nZXRSZWNvcmRDb21tZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9jb21tZW50c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUmVjb3JkQ2xpZW50LnByb3RvdHlwZS51cGRhdGVSZWNvcmRBc3NpZ25lZXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJyZWNvcmQvYXNzaWduZWVzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBSZWNvcmRDbGllbnQucHJvdG90eXBlLnVwZGF0ZVJlY29yZFN0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZC9zdGF0dXNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFJlY29yZENsaWVudC5wcm90b3R5cGUudXBkYXRlUmVjb3Jkc1N0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInJlY29yZHMvc3RhdHVzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVjb3JkQ2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5SZWNvcmRDbGllbnQgPSBSZWNvcmRDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWNvcmRDbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TcGFjZUNsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIFNwYWNlQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTcGFjZUNsaWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTcGFjZUNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUuZ2V0U3BhY2UgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLnVwZGF0ZVNwYWNlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2VcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5wdXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5kZWxldGVTcGFjZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsZXRlKHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUudXBkYXRlU3BhY2VCb2R5ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvYm9keVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmdldFNwYWNlTWVtYmVycyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlL21lbWJlcnNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS51cGRhdGVTcGFjZU1lbWJlcnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZS9tZW1iZXJzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUuYWRkVGhyZWFkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvdGhyZWFkXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLnVwZGF0ZVRocmVhZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aFdpdGhHdWVzdFNwYWNlSWQoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInNwYWNlL3RocmVhZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLmFkZFRocmVhZENvbW1lbnQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJzcGFjZS90aHJlYWQvY29tbWVudFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5hZGRHdWVzdHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImd1ZXN0c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnBvc3QocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFNwYWNlQ2xpZW50LnByb3RvdHlwZS5kZWxldGVHdWVzdHMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImd1ZXN0c1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgU3BhY2VDbGllbnQucHJvdG90eXBlLnVwZGF0ZVNwYWNlR3Vlc3RzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICBlbmRwb2ludE5hbWU6IFwic3BhY2UvZ3Vlc3RzXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucHV0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBTcGFjZUNsaWVudC5wcm90b3R5cGUuYWRkU3BhY2VGcm9tVGVtcGxhdGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoe1xuICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcInRlbXBsYXRlL3NwYWNlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFNwYWNlQ2xpZW50O1xufShCYXNlQ2xpZW50XzEuQmFzZUNsaWVudCkpO1xuZXhwb3J0cy5TcGFjZUNsaWVudCA9IFNwYWNlQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3BhY2VDbGllbnQuanMubWFwIiwiLyogZXNsaW50LWVudiBicm93c2VyICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnID8gc2VsZi5Gb3JtRGF0YSA6IHdpbmRvdy5Gb3JtRGF0YTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkZpbGVDbGllbnQgPSB2b2lkIDA7XG52YXIgZm9ybV9kYXRhXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImZvcm0tZGF0YVwiKSk7XG52YXIgcGxhdGZvcm1fMSA9IHJlcXVpcmUoXCIuLi9wbGF0Zm9ybVwiKTtcbnZhciBVbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9wbGF0Zm9ybS9VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JcIik7XG52YXIgQmFzZUNsaWVudF8xID0gcmVxdWlyZShcIi4vQmFzZUNsaWVudFwiKTtcbnZhciBGaWxlQ2xpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaWxlQ2xpZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpbGVDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgRmlsZUNsaWVudC5wcm90b3R5cGUudXBsb2FkRmlsZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhdGgsIGZvcm1EYXRhLCBfYSwgbmFtZV8xLCBkYXRhLCBlXzEsIF9iLCBuYW1lXzIsIGRhdGEsIGZpbGVEYXRhO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHRoaXMuYnVpbGRQYXRoV2l0aEd1ZXN0U3BhY2VJZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgZm9ybV9kYXRhXzEuZGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoXCJwYXRoXCIgaW4gcGFyYW1zLmZpbGUpKSByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2MudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHBsYXRmb3JtXzEucGxhdGZvcm1EZXBzLnJlYWRGaWxlRnJvbVBhdGgocGFyYW1zLmZpbGUucGF0aCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9jLnNlbnQoKSwgbmFtZV8xID0gX2EubmFtZSwgZGF0YSA9IF9hLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGRhdGEsIG5hbWVfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVfMSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVwbG9hZEZpbGUgZG9lc24ndCBhbGxvdyB0byBhY2NlcHQgYSBmaWxlIHBhdGggaW4gXCIuY29uY2F0KGVfMS5wbGF0Zm9ybSwgXCIgZW52aXJvbm1lbnQuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVfMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBwYXJhbXMuZmlsZSwgbmFtZV8yID0gX2IubmFtZSwgZGF0YSA9IF9iLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRGF0YSA9IHBsYXRmb3JtXzEucGxhdGZvcm1EZXBzLmJ1aWxkRm9ybURhdGFWYWx1ZShkYXRhLCBuYW1lXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlRGF0YSwgbmFtZV8yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jbGllbnQucG9zdERhdGEocGF0aCwgZm9ybURhdGEpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBGaWxlQ2xpZW50LnByb3RvdHlwZS5kb3dubG9hZEZpbGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGhXaXRoR3Vlc3RTcGFjZUlkKHtcbiAgICAgICAgICAgIGVuZHBvaW50TmFtZTogXCJmaWxlXCIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0RGF0YShwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbGVDbGllbnQ7XG59KEJhc2VDbGllbnRfMS5CYXNlQ2xpZW50KSk7XG5leHBvcnRzLkZpbGVDbGllbnQgPSBGaWxlQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZUNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBsdWdpbkNsaWVudCA9IHZvaWQgMDtcbnZhciBCYXNlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9CYXNlQ2xpZW50XCIpO1xudmFyIFBsdWdpbkNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGx1Z2luQ2xpZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBsdWdpbkNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQbHVnaW5DbGllbnQucHJvdG90eXBlLmdldFBsdWdpbnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoeyBlbmRwb2ludE5hbWU6IFwicGx1Z2luc1wiIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBQbHVnaW5DbGllbnQucHJvdG90eXBlLmdldFJlcXVpcmVkUGx1Z2lucyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7IGVuZHBvaW50TmFtZTogXCJwbHVnaW5zL3JlcXVpcmVkXCIgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXQocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFBsdWdpbkNsaWVudC5wcm90b3R5cGUuZ2V0QXBwcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7IGVuZHBvaW50TmFtZTogXCJwbHVnaW4vYXBwc1wiIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0KHBhdGgsIHBhcmFtcyk7XG4gICAgfTtcbiAgICBQbHVnaW5DbGllbnQucHJvdG90eXBlLnVwZGF0ZVBsdWdpbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmJ1aWxkUGF0aCh7IGVuZHBvaW50TmFtZTogXCJwbHVnaW5cIiB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnB1dChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUGx1Z2luQ2xpZW50LnByb3RvdHlwZS5pbnN0YWxsUGx1Z2luID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuYnVpbGRQYXRoKHsgZW5kcG9pbnROYW1lOiBcInBsdWdpblwiIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQucG9zdChwYXRoLCBwYXJhbXMpO1xuICAgIH07XG4gICAgUGx1Z2luQ2xpZW50LnByb3RvdHlwZS51bmluc3RhbGxQbHVnaW4gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5idWlsZFBhdGgoeyBlbmRwb2ludE5hbWU6IFwicGx1Z2luXCIgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGUocGF0aCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIHJldHVybiBQbHVnaW5DbGllbnQ7XG59KEJhc2VDbGllbnRfMS5CYXNlQ2xpZW50KSk7XG5leHBvcnRzLlBsdWdpbkNsaWVudCA9IFBsdWdpbkNsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBsdWdpbkNsaWVudC5qcy5tYXAiLCIvLyBBeGlvcyB2MS43LjcgQ29weXJpZ2h0IChjKSAyMDI0IE1hdHQgWmFicmlza2llIGFuZCBjb250cmlidXRvcnNcbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3Qge3RvU3RyaW5nfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7Z2V0UHJvdG90eXBlT2Z9ID0gT2JqZWN0O1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufTtcblxuY29uc3QgdHlwZU9mVGVzdCA9IHR5cGUgPT4gdGhpbmcgPT4gdHlwZW9mIHRoaW5nID09PSB0eXBlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3Qge2lzQXJyYXl9ID0gQXJyYXk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVbmRlZmluZWQgPSB0eXBlT2ZUZXN0KCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0J1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcbiAgICAmJiBpc0Z1bmN0aW9uKHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNBcnJheUJ1ZmZlciA9IGtpbmRPZlRlc3QoJ0FycmF5QnVmZmVyJyk7XG5cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICBsZXQgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmIChpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyaW5nID0gdHlwZU9mVGVzdCgnc3RyaW5nJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZ1bmN0aW9uLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVPZlRlc3QoJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNOdW1iZXIgPSB0eXBlT2ZUZXN0KCdudW1iZXInKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNPYmplY3QgPSAodGhpbmcpID0+IHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCb29sZWFuXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCb29sZWFuLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCb29sZWFuID0gdGhpbmcgPT4gdGhpbmcgPT09IHRydWUgfHwgdGhpbmcgPT09IGZhbHNlO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAodmFsKSA9PiB7XG4gIGlmIChraW5kT2YodmFsKSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBwcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZih2YWwpO1xuICByZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbCkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0RhdGUgPSBraW5kT2ZUZXN0KCdEYXRlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGUgPSBraW5kT2ZUZXN0KCdGaWxlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jsb2IgPSBraW5kT2ZUZXN0KCdCbG9iJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlTGlzdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlTGlzdCA9IGtpbmRPZlRlc3QoJ0ZpbGVMaXN0Jyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJlYW0gPSAodmFsKSA9PiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Zvcm1EYXRhID0gKHRoaW5nKSA9PiB7XG4gIGxldCBraW5kO1xuICByZXR1cm4gdGhpbmcgJiYgKFxuICAgICh0eXBlb2YgRm9ybURhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpbmcgaW5zdGFuY2VvZiBGb3JtRGF0YSkgfHwgKFxuICAgICAgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIChcbiAgICAgICAgKGtpbmQgPSBraW5kT2YodGhpbmcpKSA9PT0gJ2Zvcm1kYXRhJyB8fFxuICAgICAgICAvLyBkZXRlY3QgZm9ybS1kYXRhIGluc3RhbmNlXG4gICAgICAgIChraW5kID09PSAnb2JqZWN0JyAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRvU3RyaW5nKSAmJiB0aGluZy50b1N0cmluZygpID09PSAnW29iamVjdCBGb3JtRGF0YV0nKVxuICAgICAgKVxuICAgIClcbiAgKVxufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbmNvbnN0IFtpc1JlYWRhYmxlU3RyZWFtLCBpc1JlcXVlc3QsIGlzUmVzcG9uc2UsIGlzSGVhZGVyc10gPSBbJ1JlYWRhYmxlU3RyZWFtJywgJ1JlcXVlc3QnLCAnUmVzcG9uc2UnLCAnSGVhZGVycyddLm1hcChraW5kT2ZUZXN0KTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuY29uc3QgdHJpbSA9IChzdHIpID0+IHN0ci50cmltID9cbiAgc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywgJycpO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7YWxsT3duS2V5cyA9IGZhbHNlfSA9IHt9KSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGk7XG4gIGxldCBsO1xuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yIChpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBjb25zdCBrZXlzID0gYWxsT3duS2V5cyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqLCBrZXkpIHtcbiAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICBsZXQgX2tleTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBfa2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoa2V5ID09PSBfa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBfa2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgX2dsb2JhbCA9ICgoKSA9PiB7XG4gIC8qZXNsaW50IG5vLXVuZGVmOjAqL1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWxUaGlzO1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxufSkoKTtcblxuY29uc3QgaXNDb250ZXh0RGVmaW5lZCA9IChjb250ZXh0KSA9PiAhaXNVbmRlZmluZWQoY29udGV4dCkgJiYgY29udGV4dCAhPT0gX2dsb2JhbDtcblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICBjb25zdCB7Y2FzZWxlc3N9ID0gaXNDb250ZXh0RGVmaW5lZCh0aGlzKSAmJiB0aGlzIHx8IHt9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3QgYXNzaWduVmFsdWUgPSAodmFsLCBrZXkpID0+IHtcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBjYXNlbGVzcyAmJiBmaW5kS2V5KHJlc3VsdCwga2V5KSB8fCBrZXk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W3RhcmdldEtleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZShyZXN1bHRbdGFyZ2V0S2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWw7XG4gICAgfVxuICB9O1xuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGFyZ3VtZW50c1tpXSAmJiBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzXVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5jb25zdCBleHRlbmQgPSAoYSwgYiwgdGhpc0FyZywge2FsbE93bktleXN9PSB7fSkgPT4ge1xuICBmb3JFYWNoKGIsICh2YWwsIGtleSkgPT4ge1xuICAgIGlmICh0aGlzQXJnICYmIGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9LCB7YWxsT3duS2V5c30pO1xuICByZXR1cm4gYTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGJ5dGUgb3JkZXIgbWFya2VyLiBUaGlzIGNhdGNoZXMgRUYgQkIgQkYgKHRoZSBVVEYtOCBCT00pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXG4gKi9cbmNvbnN0IHN0cmlwQk9NID0gKGNvbnRlbnQpID0+IHtcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59O1xuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2Rlc2NyaXB0b3JzXVxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBpbmhlcml0cyA9IChjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSA9PiB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgJ3N1cGVyJywge1xuICAgIHZhbHVlOiBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZVxuICB9KTtcbiAgcHJvcHMgJiYgT2JqZWN0LmFzc2lnbihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3BzKTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZSBvYmplY3Qgd2l0aCBkZWVwIHByb3RvdHlwZSBjaGFpbiB0byBhIGZsYXQgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlT2JqIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGVzdE9ial1cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbn0gW2ZpbHRlcl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wRmlsdGVyXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IHRvRmxhdE9iamVjdCA9IChzb3VyY2VPYmosIGRlc3RPYmosIGZpbHRlciwgcHJvcEZpbHRlcikgPT4ge1xuICBsZXQgcHJvcHM7XG4gIGxldCBpO1xuICBsZXQgcHJvcDtcbiAgY29uc3QgbWVyZ2VkID0ge307XG5cbiAgZGVzdE9iaiA9IGRlc3RPYmogfHwge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBpZiAoc291cmNlT2JqID09IG51bGwpIHJldHVybiBkZXN0T2JqO1xuXG4gIGRvIHtcbiAgICBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZU9iaik7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKCghcHJvcEZpbHRlciB8fCBwcm9wRmlsdGVyKHByb3AsIHNvdXJjZU9iaiwgZGVzdE9iaikpICYmICFtZXJnZWRbcHJvcF0pIHtcbiAgICAgICAgZGVzdE9ialtwcm9wXSA9IHNvdXJjZU9ialtwcm9wXTtcbiAgICAgICAgbWVyZ2VkW3Byb3BdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlT2JqID0gZmlsdGVyICE9PSBmYWxzZSAmJiBnZXRQcm90b3R5cGVPZihzb3VyY2VPYmopO1xuICB9IHdoaWxlIChzb3VyY2VPYmogJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNvdXJjZU9iaiwgZGVzdE9iaikpICYmIHNvdXJjZU9iaiAhPT0gT2JqZWN0LnByb3RvdHlwZSk7XG5cbiAgcmV0dXJuIGRlc3RPYmo7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBlbmRzIHdpdGggdGhlIGNoYXJhY3RlcnMgb2YgYSBzcGVjaWZpZWQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IHNlYXJjaFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbj0gMF1cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZW5kc1dpdGggPSAoc3RyLCBzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKSA9PiB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbiA+IHN0ci5sZW5ndGgpIHtcbiAgICBwb3NpdGlvbiA9IHN0ci5sZW5ndGg7XG4gIH1cbiAgcG9zaXRpb24gLT0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcbiAgY29uc3QgbGFzdEluZGV4ID0gc3RyLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbik7XG4gIHJldHVybiBsYXN0SW5kZXggIT09IC0xICYmIGxhc3RJbmRleCA9PT0gcG9zaXRpb247XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgZnJvbSBhcnJheSBsaWtlIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICpcbiAqIEBwYXJhbSB7Kn0gW3RoaW5nXVxuICpcbiAqIEByZXR1cm5zIHs/QXJyYXl9XG4gKi9cbmNvbnN0IHRvQXJyYXkgPSAodGhpbmcpID0+IHtcbiAgaWYgKCF0aGluZykgcmV0dXJuIG51bGw7XG4gIGlmIChpc0FycmF5KHRoaW5nKSkgcmV0dXJuIHRoaW5nO1xuICBsZXQgaSA9IHRoaW5nLmxlbmd0aDtcbiAgaWYgKCFpc051bWJlcihpKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFyciA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBhcnJbaV0gPSB0aGluZ1tpXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufTtcblxuLyoqXG4gKiBDaGVja2luZyBpZiB0aGUgVWludDhBcnJheSBleGlzdHMgYW5kIGlmIGl0IGRvZXMsIGl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGVcbiAqIHRoaW5nIHBhc3NlZCBpbiBpcyBhbiBpbnN0YW5jZSBvZiBVaW50OEFycmF5XG4gKlxuICogQHBhcmFtIHtUeXBlZEFycmF5fVxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbmNvbnN0IGlzVHlwZWRBcnJheSA9IChUeXBlZEFycmF5ID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuIHRoaW5nID0+IHtcbiAgICByZXR1cm4gVHlwZWRBcnJheSAmJiB0aGluZyBpbnN0YW5jZW9mIFR5cGVkQXJyYXk7XG4gIH07XG59KSh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheSkpO1xuXG4vKipcbiAqIEZvciBlYWNoIGVudHJ5IGluIHRoZSBvYmplY3QsIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGtleSBhbmQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW50cnkuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGZvckVhY2hFbnRyeSA9IChvYmosIGZuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IG9iaiAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXTtcblxuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvci5jYWxsKG9iaik7XG5cbiAgbGV0IHJlc3VsdDtcblxuICB3aGlsZSAoKHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKSkgJiYgIXJlc3VsdC5kb25lKSB7XG4gICAgY29uc3QgcGFpciA9IHJlc3VsdC52YWx1ZTtcbiAgICBmbi5jYWxsKG9iaiwgcGFpclswXSwgcGFpclsxXSk7XG4gIH1cbn07XG5cbi8qKlxuICogSXQgdGFrZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGEgc3RyaW5nLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1hdGNoZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxib29sZWFuPn1cbiAqL1xuY29uc3QgbWF0Y2hBbGwgPSAocmVnRXhwLCBzdHIpID0+IHtcbiAgbGV0IG1hdGNoZXM7XG4gIGNvbnN0IGFyciA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2hlcyA9IHJlZ0V4cC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2gobWF0Y2hlcyk7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufTtcblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICAgIHJldHVybiBwMS50b1VwcGVyQ2FzZSgpICsgcDI7XG4gICAgfVxuICApO1xufTtcblxuLyogQ3JlYXRpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSAoKHtoYXNPd25Qcm9wZXJ0eX0pID0+IChvYmosIHByb3ApID0+IGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGFsbCBtZXRob2RzIHJlYWQtb25seVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbmNvbnN0IGZyZWV6ZU1ldGhvZHMgPSAob2JqKSA9PiB7XG4gIHJlZHVjZURlc2NyaXB0b3JzKG9iaiwgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICAvLyBza2lwIHJlc3RyaWN0ZWQgcHJvcHMgaW4gc3RyaWN0IG1vZGVcbiAgICBpZiAoaXNGdW5jdGlvbihvYmopICYmIFsnYXJndW1lbnRzJywgJ2NhbGxlcicsICdjYWxsZWUnXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW25hbWVdO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG5cbiAgICBpZiAoJ3dyaXRhYmxlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkZXNjcmlwdG9yLnNldCkge1xuICAgICAgZGVzY3JpcHRvci5zZXQgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKCdDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcXCcnICsgbmFtZSArICdcXCcnKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHRvT2JqZWN0U2V0ID0gKGFycmF5T3JTdHJpbmcsIGRlbGltaXRlcikgPT4ge1xuICBjb25zdCBvYmogPSB7fTtcblxuICBjb25zdCBkZWZpbmUgPSAoYXJyKSA9PiB7XG4gICAgYXJyLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgb2JqW3ZhbHVlXSA9IHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuY29uc3QgdG9GaW5pdGVOdW1iZXIgPSAodmFsdWUsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUgPSArdmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59O1xuXG5jb25zdCBBTFBIQSA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7XG5cbmNvbnN0IERJR0lUID0gJzAxMjM0NTY3ODknO1xuXG5jb25zdCBBTFBIQUJFVCA9IHtcbiAgRElHSVQsXG4gIEFMUEhBLFxuICBBTFBIQV9ESUdJVDogQUxQSEEgKyBBTFBIQS50b1VwcGVyQ2FzZSgpICsgRElHSVRcbn07XG5cbmNvbnN0IGdlbmVyYXRlU3RyaW5nID0gKHNpemUgPSAxNiwgYWxwaGFiZXQgPSBBTFBIQUJFVC5BTFBIQV9ESUdJVCkgPT4ge1xuICBsZXQgc3RyID0gJyc7XG4gIGNvbnN0IHtsZW5ndGh9ID0gYWxwaGFiZXQ7XG4gIHdoaWxlIChzaXplLS0pIHtcbiAgICBzdHIgKz0gYWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIGxlbmd0aHwwXTtcbiAgfVxuXG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YScgJiYgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSk7XG59XG5cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXJyYXkoMTApO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSwgaSkgPT4ge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmIChzdGFjay5pbmRleE9mKHNvdXJjZSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmKCEoJ3RvSlNPTicgaW4gc291cmNlKSkge1xuICAgICAgICBzdGFja1tpXSA9IHNvdXJjZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSwgaSArIDEpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YWNrW2ldID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfTtcblxuICByZXR1cm4gdmlzaXQob2JqLCAwKTtcbn07XG5cbmNvbnN0IGlzQXN5bmNGbiA9IGtpbmRPZlRlc3QoJ0FzeW5jRnVuY3Rpb24nKTtcblxuY29uc3QgaXNUaGVuYWJsZSA9ICh0aGluZykgPT5cbiAgdGhpbmcgJiYgKGlzT2JqZWN0KHRoaW5nKSB8fCBpc0Z1bmN0aW9uKHRoaW5nKSkgJiYgaXNGdW5jdGlvbih0aGluZy50aGVuKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLmNhdGNoKTtcblxuLy8gb3JpZ2luYWwgY29kZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RpZ2l0YWxCcmFpbkpTL0F4aW9zUHJvbWlzZS9ibG9iLzE2ZGVhYjEzNzEwZWMwOTc3OTkyMjEzMWYzZmE1OTU0MzIwZjgzYWIvbGliL3V0aWxzLmpzI0wxMS1MMzRcblxuY29uc3QgX3NldEltbWVkaWF0ZSA9ICgoc2V0SW1tZWRpYXRlU3VwcG9ydGVkLCBwb3N0TWVzc2FnZVN1cHBvcnRlZCkgPT4ge1xuICBpZiAoc2V0SW1tZWRpYXRlU3VwcG9ydGVkKSB7XG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbiAgfVxuXG4gIHJldHVybiBwb3N0TWVzc2FnZVN1cHBvcnRlZCA/ICgodG9rZW4sIGNhbGxiYWNrcykgPT4ge1xuICAgIF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHtzb3VyY2UsIGRhdGF9KSA9PiB7XG4gICAgICBpZiAoc291cmNlID09PSBfZ2xvYmFsICYmIGRhdGEgPT09IHRva2VuKSB7XG4gICAgICAgIGNhbGxiYWNrcy5sZW5ndGggJiYgY2FsbGJhY2tzLnNoaWZ0KCkoKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICByZXR1cm4gKGNiKSA9PiB7XG4gICAgICBjYWxsYmFja3MucHVzaChjYik7XG4gICAgICBfZ2xvYmFsLnBvc3RNZXNzYWdlKHRva2VuLCBcIipcIik7XG4gICAgfVxuICB9KShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsIFtdKSA6IChjYikgPT4gc2V0VGltZW91dChjYik7XG59KShcbiAgdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyxcbiAgaXNGdW5jdGlvbihfZ2xvYmFsLnBvc3RNZXNzYWdlKVxuKTtcblxuY29uc3QgYXNhcCA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayAhPT0gJ3VuZGVmaW5lZCcgP1xuICBxdWV1ZU1pY3JvdGFzay5iaW5kKF9nbG9iYWwpIDogKCB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5uZXh0VGljayB8fCBfc2V0SW1tZWRpYXRlKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqXG5cbnZhciB1dGlscyQxID0ge1xuICBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNCb29sZWFuLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZXF1ZXN0LFxuICBpc1Jlc3BvbnNlLFxuICBpc0hlYWRlcnMsXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RhdGUsXG4gIGlzRmlsZSxcbiAgaXNCbG9iLFxuICBpc1JlZ0V4cCxcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1R5cGVkQXJyYXksXG4gIGlzRmlsZUxpc3QsXG4gIGZvckVhY2gsXG4gIG1lcmdlLFxuICBleHRlbmQsXG4gIHRyaW0sXG4gIHN0cmlwQk9NLFxuICBpbmhlcml0cyxcbiAgdG9GbGF0T2JqZWN0LFxuICBraW5kT2YsXG4gIGtpbmRPZlRlc3QsXG4gIGVuZHNXaXRoLFxuICB0b0FycmF5LFxuICBmb3JFYWNoRW50cnksXG4gIG1hdGNoQWxsLFxuICBpc0hUTUxGb3JtLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaGFzT3duUHJvcDogaGFzT3duUHJvcGVydHksIC8vIGFuIGFsaWFzIHRvIGF2b2lkIEVTTGludCBuby1wcm90b3R5cGUtYnVpbHRpbnMgZGV0ZWN0aW9uXG4gIHJlZHVjZURlc2NyaXB0b3JzLFxuICBmcmVlemVNZXRob2RzLFxuICB0b09iamVjdFNldCxcbiAgdG9DYW1lbENhc2UsXG4gIG5vb3AsXG4gIHRvRmluaXRlTnVtYmVyLFxuICBmaW5kS2V5LFxuICBnbG9iYWw6IF9nbG9iYWwsXG4gIGlzQ29udGV4dERlZmluZWQsXG4gIEFMUEhBQkVULFxuICBnZW5lcmF0ZVN0cmluZyxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcFxufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIEF4aW9zRXJyb3IobWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5uYW1lID0gJ0F4aW9zRXJyb3InO1xuICBjb2RlICYmICh0aGlzLmNvZGUgPSBjb2RlKTtcbiAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICBpZiAocmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXMgPyByZXNwb25zZS5zdGF0dXMgOiBudWxsO1xuICB9XG59XG5cbnV0aWxzJDEuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMkMS50b0pTT05PYmplY3QodGhpcy5jb25maWcpLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1c1xuICAgIH07XG4gIH1cbn0pO1xuXG5jb25zdCBwcm90b3R5cGUkMSA9IEF4aW9zRXJyb3IucHJvdG90eXBlO1xuY29uc3QgZGVzY3JpcHRvcnMgPSB7fTtcblxuW1xuICAnRVJSX0JBRF9PUFRJT05fVkFMVUUnLFxuICAnRVJSX0JBRF9PUFRJT04nLFxuICAnRUNPTk5BQk9SVEVEJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFUlJfTkVUV09SSycsXG4gICdFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTJyxcbiAgJ0VSUl9ERVBSRUNBVEVEJyxcbiAgJ0VSUl9CQURfUkVTUE9OU0UnLFxuICAnRVJSX0JBRF9SRVFVRVNUJyxcbiAgJ0VSUl9DQU5DRUxFRCcsXG4gICdFUlJfTk9UX1NVUFBPUlQnLFxuICAnRVJSX0lOVkFMSURfVVJMJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbl0uZm9yRWFjaChjb2RlID0+IHtcbiAgZGVzY3JpcHRvcnNbY29kZV0gPSB7dmFsdWU6IGNvZGV9O1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF4aW9zRXJyb3IsIGRlc2NyaXB0b3JzKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUkMSwgJ2lzQXhpb3NFcnJvcicsIHt2YWx1ZTogdHJ1ZX0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuQXhpb3NFcnJvci5mcm9tID0gKGVycm9yLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlLCBjdXN0b21Qcm9wcykgPT4ge1xuICBjb25zdCBheGlvc0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUkMSk7XG5cbiAgdXRpbHMkMS50b0ZsYXRPYmplY3QoZXJyb3IsIGF4aW9zRXJyb3IsIGZ1bmN0aW9uIGZpbHRlcihvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSBFcnJvci5wcm90b3R5cGU7XG4gIH0sIHByb3AgPT4ge1xuICAgIHJldHVybiBwcm9wICE9PSAnaXNBeGlvc0Vycm9yJztcbiAgfSk7XG5cbiAgQXhpb3NFcnJvci5jYWxsKGF4aW9zRXJyb3IsIGVycm9yLm1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gIGF4aW9zRXJyb3IuY2F1c2UgPSBlcnJvcjtcblxuICBheGlvc0Vycm9yLm5hbWUgPSBlcnJvci5uYW1lO1xuXG4gIGN1c3RvbVByb3BzICYmIE9iamVjdC5hc3NpZ24oYXhpb3NFcnJvciwgY3VzdG9tUHJvcHMpO1xuXG4gIHJldHVybiBheGlvc0Vycm9yO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0cmljdFxudmFyIGh0dHBBZGFwdGVyID0gbnVsbDtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscyQxLmlzUGxhaW5PYmplY3QodGhpbmcpIHx8IHV0aWxzJDEuaXNBcnJheSh0aGluZyk7XG59XG5cbi8qKlxuICogSXQgcmVtb3ZlcyB0aGUgYnJhY2tldHMgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IHdpdGhvdXQgdGhlIGJyYWNrZXRzLlxuICovXG5mdW5jdGlvbiByZW1vdmVCcmFja2V0cyhrZXkpIHtcbiAgcmV0dXJuIHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscyQxLmlzQXJyYXkoYXJyKSAmJiAhYXJyLnNvbWUoaXNWaXNpdGFibGUpO1xufVxuXG5jb25zdCBwcmVkaWNhdGVzID0gdXRpbHMkMS50b0ZsYXRPYmplY3QodXRpbHMkMSwge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzJDEuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZvcm1EYXRhID0gZm9ybURhdGEgfHwgbmV3IChGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzJDEudG9GbGF0T2JqZWN0KG9wdGlvbnMsIHtcbiAgICBtZXRhVG9rZW5zOiB0cnVlLFxuICAgIGRvdHM6IGZhbHNlLFxuICAgIGluZGV4ZXM6IGZhbHNlXG4gIH0sIGZhbHNlLCBmdW5jdGlvbiBkZWZpbmVkKG9wdGlvbiwgc291cmNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gICAgcmV0dXJuICF1dGlscyQxLmlzVW5kZWZpbmVkKHNvdXJjZVtvcHRpb25dKTtcbiAgfSk7XG5cbiAgY29uc3QgbWV0YVRva2VucyA9IG9wdGlvbnMubWV0YVRva2VucztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGNvbnN0IHZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3IgfHwgZGVmYXVsdFZpc2l0b3I7XG4gIGNvbnN0IGRvdHMgPSBvcHRpb25zLmRvdHM7XG4gIGNvbnN0IGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXM7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucy5CbG9iIHx8IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBCbG9iO1xuICBjb25zdCB1c2VCbG9iID0gX0Jsb2IgJiYgdXRpbHMkMS5pc1NwZWNDb21wbGlhbnRGb3JtKGZvcm1EYXRhKTtcblxuICBpZiAoIXV0aWxzJDEuaXNGdW5jdGlvbih2aXNpdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Zpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnJztcblxuICAgIGlmICh1dGlscyQxLmlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghdXNlQmxvYiAmJiB1dGlscyQxLmlzQmxvYih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXIodmFsdWUpIHx8IHV0aWxzJDEuaXNUeXBlZEFycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVzZUJsb2IgJiYgdHlwZW9mIEJsb2IgPT09ICdmdW5jdGlvbicgPyBuZXcgQmxvYihbdmFsdWVdKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCB2aXNpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0ga2V5XG4gICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAgICogQHRoaXMge0Zvcm1EYXRhfVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGVhY2ggcHJvcCBvZiB0aGUgdmFsdWUgcmVjdXJzaXZlbHlcbiAgICovXG4gIGZ1bmN0aW9uIGRlZmF1bHRWaXNpdG9yKHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBsZXQgYXJyID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgIXBhdGggJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAne30nKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gbWV0YVRva2VucyA/IGtleSA6IGtleS5zbGljZSgwLCAtMik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh1dGlscyQxLmlzQXJyYXkodmFsdWUpICYmIGlzRmxhdEFycmF5KHZhbHVlKSkgfHxcbiAgICAgICAgKCh1dGlscyQxLmlzRmlsZUxpc3QodmFsdWUpIHx8IHV0aWxzJDEuZW5kc1dpdGgoa2V5LCAnW10nKSkgJiYgKGFyciA9IHV0aWxzJDEudG9BcnJheSh2YWx1ZSkpXG4gICAgICAgICkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IHJlbW92ZUJyYWNrZXRzKGtleSk7XG5cbiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gZWFjaChlbCwgaW5kZXgpIHtcbiAgICAgICAgICAhKHV0aWxzJDEuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIGluZGV4ZXMgPT09IHRydWUgPyByZW5kZXJLZXkoW2tleV0sIGluZGV4LCBkb3RzKSA6IChpbmRleGVzID09PSBudWxsID8ga2V5IDoga2V5ICsgJ1tdJyksXG4gICAgICAgICAgICBjb252ZXJ0VmFsdWUoZWwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNWaXNpdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQocmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cyksIGNvbnZlcnRWYWx1ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3RhY2sgPSBbXTtcblxuICBjb25zdCBleHBvc2VkSGVscGVycyA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlcywge1xuICAgIGRlZmF1bHRWaXNpdG9yLFxuICAgIGNvbnZlcnRWYWx1ZSxcbiAgICBpc1Zpc2l0YWJsZVxuICB9KTtcblxuICBmdW5jdGlvbiBidWlsZCh2YWx1ZSwgcGF0aCkge1xuICAgIGlmICh1dGlscyQxLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGF0aC5qb2luKCcuJykpO1xuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiBlYWNoKGVsLCBrZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9ICEodXRpbHMkMS5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIHZpc2l0b3IuY2FsbChcbiAgICAgICAgZm9ybURhdGEsIGVsLCB1dGlscyQxLmlzU3RyaW5nKGtleSkgPyBrZXkudHJpbSgpIDoga2V5LCBwYXRoLCBleHBvc2VkSGVscGVyc1xuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICBidWlsZChlbCwgcGF0aCA/IHBhdGguY29uY2F0KGtleSkgOiBba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIGlmICghdXRpbHMkMS5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGF0YSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgYnVpbGQob2JqKTtcblxuICByZXR1cm4gZm9ybURhdGE7XG59XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUkMShzdHIpIHtcbiAgY29uc3QgY2hhck1hcCA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgIFwiJ1wiOiAnJTI3JyxcbiAgICAnKCc6ICclMjgnLFxuICAgICcpJzogJyUyOScsXG4gICAgJ34nOiAnJTdFJyxcbiAgICAnJTIwJzogJysnLFxuICAgICclMDAnOiAnXFx4MDAnXG4gIH07XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKX5dfCUyMHwlMDAvZywgZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgICByZXR1cm4gY2hhck1hcFttYXRjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGFyYW1zIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBhIEZvcm1EYXRhIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEF4aW9zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5fcGFpcnMgPSBbXTtcblxuICBwYXJhbXMgJiYgdG9Gb3JtRGF0YShwYXJhbXMsIHRoaXMsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc1VSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG5cbnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fcGFpcnMucHVzaChbbmFtZSwgdmFsdWVdKTtcbn07XG5cbnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGVuY29kZXIpIHtcbiAgY29uc3QgX2VuY29kZSA9IGVuY29kZXIgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVyLmNhbGwodGhpcywgdmFsdWUsIGVuY29kZSQxKTtcbiAgfSA6IGVuY29kZSQxO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuLyoqXG4gKiBJdCByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjaGFyYWN0ZXJzIGA6YCwgYCRgLCBgLGAsIGArYCwgYFtgLCBhbmQgYF1gIHdpdGggdGhlaXJcbiAqIFVSSSBlbmNvZGVkIGNvdW50ZXJwYXJ0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIHZhbHVlIHRvIGJlIGVuY29kZWQuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcGFyYW0gez9vYmplY3R9IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICovXG5mdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgb3B0aW9ucykge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIFxuICBjb25zdCBfZW5jb2RlID0gb3B0aW9ucyAmJiBvcHRpb25zLmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgY29uc3Qgc2VyaWFsaXplRm4gPSBvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplO1xuXG4gIGxldCBzZXJpYWxpemVkUGFyYW1zO1xuXG4gIGlmIChzZXJpYWxpemVGbikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBzZXJpYWxpemVGbihwYXJhbXMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSB1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykgP1xuICAgICAgcGFyYW1zLnRvU3RyaW5nKCkgOlxuICAgICAgbmV3IEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykudG9TdHJpbmcoX2VuY29kZSk7XG4gIH1cblxuICBpZiAoc2VyaWFsaXplZFBhcmFtcykge1xuICAgIGNvbnN0IGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZihcIiNcIik7XG5cbiAgICBpZiAoaGFzaG1hcmtJbmRleCAhPT0gLTEpIHtcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNobWFya0luZGV4KTtcbiAgICB9XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuY2xhc3MgSW50ZXJjZXB0b3JNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gICAqL1xuICB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgICBmdWxmaWxsZWQsXG4gICAgICByZWplY3RlZCxcbiAgICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgICAgcnVuV2hlbjogb3B0aW9ucyA/IG9wdGlvbnMucnVuV2hlbiA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gICAqXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdG9yIHdhcyByZW1vdmVkLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgZWplY3QoaWQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGludGVyY2VwdG9ycyBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gICAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZvckVhY2goZm4pIHtcbiAgICB1dGlscyQxLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgICAgZm4oaCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIEludGVyY2VwdG9yTWFuYWdlciQxID0gSW50ZXJjZXB0b3JNYW5hZ2VyO1xuXG52YXIgdHJhbnNpdGlvbmFsRGVmYXVsdHMgPSB7XG4gIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxuICBmb3JjZWRKU09OUGFyc2luZzogdHJ1ZSxcbiAgY2xhcmlmeVRpbWVvdXRFcnJvcjogZmFsc2Vcbn07XG5cbnZhciBVUkxTZWFyY2hQYXJhbXMkMSA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnID8gVVJMU2VhcmNoUGFyYW1zIDogQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG5cbnZhciBGb3JtRGF0YSQxID0gdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogbnVsbDtcblxudmFyIEJsb2IkMSA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyA/IEJsb2IgOiBudWxsO1xuXG52YXIgcGxhdGZvcm0kMSA9IHtcbiAgaXNCcm93c2VyOiB0cnVlLFxuICBjbGFzc2VzOiB7XG4gICAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMkMSxcbiAgICBGb3JtRGF0YTogRm9ybURhdGEkMSxcbiAgICBCbG9iOiBCbG9iJDFcbiAgfSxcbiAgcHJvdG9jb2xzOiBbJ2h0dHAnLCAnaHR0cHMnLCAnZmlsZScsICdibG9iJywgJ3VybCcsICdkYXRhJ11cbn07XG5cbmNvbnN0IGhhc0Jyb3dzZXJFbnYgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5jb25zdCBfbmF2aWdhdG9yID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yIHx8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9IGhhc0Jyb3dzZXJFbnYgJiZcbiAgKCFfbmF2aWdhdG9yIHx8IFsnUmVhY3ROYXRpdmUnLCAnTmF0aXZlU2NyaXB0JywgJ05TJ10uaW5kZXhPZihfbmF2aWdhdG9yLnByb2R1Y3QpIDwgMCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmNvbnN0IG9yaWdpbiA9IGhhc0Jyb3dzZXJFbnYgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG52YXIgdXRpbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgaGFzQnJvd3NlckVudjogaGFzQnJvd3NlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52OiBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlckVudjogaGFzU3RhbmRhcmRCcm93c2VyRW52LFxuICBuYXZpZ2F0b3I6IF9uYXZpZ2F0b3IsXG4gIG9yaWdpbjogb3JpZ2luXG59KTtcblxudmFyIHBsYXRmb3JtID0ge1xuICAuLi51dGlscyxcbiAgLi4ucGxhdGZvcm0kMVxufTtcblxuZnVuY3Rpb24gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b0Zvcm1EYXRhKGRhdGEsIG5ldyBwbGF0Zm9ybS5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcygpLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aXNpdG9yOiBmdW5jdGlvbih2YWx1ZSwga2V5LCBwYXRoLCBoZWxwZXJzKSB7XG4gICAgICBpZiAocGxhdGZvcm0uaXNOb2RlICYmIHV0aWxzJDEuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscyQxLm1hdGNoQWxsKC9cXHcrfFxcWyhcXHcqKV0vZywgbmFtZSkubWFwKG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gPT09ICdbXScgPyAnJyA6IG1hdGNoWzFdIHx8IG1hdGNoWzBdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjb252ZXJ0IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheVRvT2JqZWN0KGFycikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG4gIGxldCBpO1xuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgbGV0IGtleTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBvYmpba2V5XSA9IGFycltrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBGb3JtRGF0YSBvYmplY3QgYW5kIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55PiB8IG51bGx9IFRoZSBjb252ZXJ0ZWQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmb3JtRGF0YVRvSlNPTihmb3JtRGF0YSkge1xuICBmdW5jdGlvbiBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldCwgaW5kZXgpIHtcbiAgICBsZXQgbmFtZSA9IHBhdGhbaW5kZXgrK107XG5cbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgaXNOdW1lcmljS2V5ID0gTnVtYmVyLmlzRmluaXRlKCtuYW1lKTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA+PSBwYXRoLmxlbmd0aDtcbiAgICBuYW1lID0gIW5hbWUgJiYgdXRpbHMkMS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQubGVuZ3RoIDogbmFtZTtcblxuICAgIGlmIChpc0xhc3QpIHtcbiAgICAgIGlmICh1dGlscyQxLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzJDEuaXNPYmplY3QodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXRbbmFtZV0sIGluZGV4KTtcblxuICAgIGlmIChyZXN1bHQgJiYgdXRpbHMkMS5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IGFycmF5VG9PYmplY3QodGFyZ2V0W25hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgfVxuXG4gIGlmICh1dGlscyQxLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzJDEuaXNGdW5jdGlvbihmb3JtRGF0YS5lbnRyaWVzKSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuXG4gICAgdXRpbHMkMS5mb3JFYWNoRW50cnkoZm9ybURhdGEsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgYnVpbGRQYXRoKHBhcnNlUHJvcFBhdGgobmFtZSksIHZhbHVlLCBvYmosIDApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nLCB0cmllcyB0byBwYXJzZSBpdCwgYW5kIGlmIGl0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgaW5wdXRcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmF3VmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgdGhlIHJhd1ZhbHVlLlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMkMS5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMkMS50cmltKHJhd1ZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lICE9PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChlbmNvZGVyIHx8IEpTT04uc3RyaW5naWZ5KShyYXdWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCcsICdmZXRjaCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSB8fCAnJztcbiAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscyQxLmlzT2JqZWN0KGRhdGEpO1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCAmJiB1dGlscyQxLmlzSFRNTEZvcm0oZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGb3JtRGF0YSA9IHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKTtcblxuICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMkMS5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc0Jsb2IoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscyQxLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscyQxLmlzRmlsZUxpc3QoZGF0YSkpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgIGlzRmlsZUxpc3QgPyB7J2ZpbGVzW10nOiBkYXRhfSA6IGRhdGEsXG4gICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICB0aGlzLmZvcm1TZXJpYWxpemVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCB8fCBoYXNKU09OQ29udGVudFR5cGUgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmICh1dGlscyQxLmlzUmVzcG9uc2UoZGF0YSkgfHwgdXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscyQxLmlzU3RyaW5nKGRhdGEpICYmICgoZm9yY2VkSlNPTlBhcnNpbmcgJiYgIXRoaXMucmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKSkge1xuICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzdHJpY3RKU09OUGFyc2luZykge1xuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIHRoaXMsIG51bGwsIHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuICBtYXhCb2R5TGVuZ3RoOiAtMSxcblxuICBlbnY6IHtcbiAgICBGb3JtRGF0YTogcGxhdGZvcm0uY2xhc3Nlcy5Gb3JtRGF0YSxcbiAgICBCbG9iOiBwbGF0Zm9ybS5jbGFzc2VzLkJsb2JcbiAgfSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9LFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzJDEuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCddLCAobWV0aG9kKSA9PiB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnZhciBkZWZhdWx0cyQxID0gZGVmYXVsdHM7XG5cbi8vIFJhd0F4aW9zSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbmNvbnN0IGlnbm9yZUR1cGxpY2F0ZU9mID0gdXRpbHMkMS50b09iamVjdFNldChbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG52YXIgcGFyc2VIZWFkZXJzID0gcmF3SGVhZGVycyA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHt9O1xuICBsZXQga2V5O1xuICBsZXQgdmFsO1xuICBsZXQgaTtcblxuICByYXdIZWFkZXJzICYmIHJhd0hlYWRlcnMuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gcGFyc2VyKGxpbmUpIHtcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XG4gICAga2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gbGluZS5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcblxuICAgIGlmICgha2V5IHx8IChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZltrZXldKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgaWYgKHBhcnNlZFtrZXldKSB7XG4gICAgICAgIHBhcnNlZFtrZXldLnB1c2godmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZFtrZXldID0gW3ZhbF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcblxuY29uc3QgJGludGVybmFscyA9IFN5bWJvbCgnaW50ZXJuYWxzJyk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlciAmJiBTdHJpbmcoaGVhZGVyKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAobm9ybWFsaXplVmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb2tlbnMoc3RyKSB7XG4gIGNvbnN0IHRva2VucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGNvbnN0IHRva2Vuc1JFID0gLyhbXlxccyw7PV0rKVxccyooPzo9XFxzKihbXiw7XSspKT8vZztcbiAgbGV0IG1hdGNoO1xuXG4gIHdoaWxlICgobWF0Y2ggPSB0b2tlbnNSRS5leGVjKHN0cikpKSB7XG4gICAgdG9rZW5zW21hdGNoWzFdXSA9IG1hdGNoWzJdO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuY29uc3QgaXNWYWxpZEhlYWRlck5hbWUgPSAoc3RyKSA9PiAvXlstX2EtekEtWjAtOV5gfH4sISMkJSYnKisuXSskLy50ZXN0KHN0ci50cmltKCkpO1xuXG5mdW5jdGlvbiBtYXRjaEhlYWRlclZhbHVlKGNvbnRleHQsIHZhbHVlLCBoZWFkZXIsIGZpbHRlciwgaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gIGlmICh1dGlscyQxLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgICB2YWx1ZSA9IGhlYWRlcjtcbiAgfVxuXG4gIGlmICghdXRpbHMkMS5pc1N0cmluZyh2YWx1ZSkpIHJldHVybjtcblxuICBpZiAodXRpbHMkMS5pc1N0cmluZyhmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoZmlsdGVyKSAhPT0gLTE7XG4gIH1cblxuICBpZiAodXRpbHMkMS5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscyQxLnRvQ2FtZWxDYXNlKCcgJyArIGhlYWRlcik7XG5cbiAgWydnZXQnLCAnc2V0JywgJ2hhcyddLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbWV0aG9kTmFtZSArIGFjY2Vzc29yTmFtZSwge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0uY2FsbCh0aGlzLCBoZWFkZXIsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY2xhc3MgQXhpb3NIZWFkZXJzIHtcbiAgY29uc3RydWN0b3IoaGVhZGVycykge1xuICAgIGhlYWRlcnMgJiYgdGhpcy5zZXQoaGVhZGVycyk7XG4gIH1cblxuICBzZXQoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSwgcmV3cml0ZSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZnVuY3Rpb24gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghbEhlYWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShzZWxmLCBsSGVhZGVyKTtcblxuICAgICAgaWYoIWtleSB8fCBzZWxmW2tleV0gPT09IHVuZGVmaW5lZCB8fCBfcmV3cml0ZSA9PT0gdHJ1ZSB8fCAoX3Jld3JpdGUgPT09IHVuZGVmaW5lZCAmJiBzZWxmW2tleV0gIT09IGZhbHNlKSkge1xuICAgICAgICBzZWxmW2tleSB8fCBfaGVhZGVyXSA9IG5vcm1hbGl6ZVZhbHVlKF92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0SGVhZGVycyA9IChoZWFkZXJzLCBfcmV3cml0ZSkgPT5cbiAgICAgIHV0aWxzJDEuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChoZWFkZXIpIHx8IGhlYWRlciBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpIHtcbiAgICAgIHNldEhlYWRlcnMoaGVhZGVyLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmKHV0aWxzJDEuaXNTdHJpbmcoaGVhZGVyKSAmJiAoaGVhZGVyID0gaGVhZGVyLnRyaW0oKSkgJiYgIWlzVmFsaWRIZWFkZXJOYW1lKGhlYWRlcikpIHtcbiAgICAgIHNldEhlYWRlcnMocGFyc2VIZWFkZXJzKGhlYWRlciksIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNIZWFkZXJzKGhlYWRlcikpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGhlYWRlci5lbnRyaWVzKCkpIHtcbiAgICAgICAgc2V0SGVhZGVyKHZhbHVlLCBrZXksIHJld3JpdGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgIT0gbnVsbCAmJiBzZXRIZWFkZXIodmFsdWVPclJld3JpdGUsIGhlYWRlciwgcmV3cml0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXQoaGVhZGVyLCBwYXJzZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmNhbGwodGhpcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMkMS5pc1JlZ0V4cChwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5leGVjKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFzKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHNlbGYsIF9oZWFkZXIpO1xuXG4gICAgICAgIGlmIChrZXkgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUoc2VsZiwgc2VsZltrZXldLCBrZXksIG1hdGNoZXIpKSkge1xuICAgICAgICAgIGRlbGV0ZSBzZWxmW2tleV07XG5cbiAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgaGVhZGVyLmZvckVhY2goZGVsZXRlSGVhZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlSGVhZGVyKGhlYWRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBjbGVhcihtYXRjaGVyKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICAgIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZighbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyLCB0cnVlKSkge1xuICAgICAgICBkZWxldGUgdGhpc1trZXldO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIG5vcm1hbGl6ZShmb3JtYXQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG5cbiAgICB1dGlscyQxLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzJDEuZmluZEtleShoZWFkZXJzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHNlbGZba2V5XSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZm9ybWF0ID8gZm9ybWF0SGVhZGVyKGhlYWRlcikgOiBTdHJpbmcoaGVhZGVyKS50cmltKCk7XG5cbiAgICAgIGlmIChub3JtYWxpemVkICE9PSBoZWFkZXIpIHtcbiAgICAgICAgZGVsZXRlIHNlbGZbaGVhZGVyXTtcbiAgICAgIH1cblxuICAgICAgc2VsZltub3JtYWxpemVkXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcblxuICAgICAgaGVhZGVyc1tub3JtYWxpemVkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNvbmNhdCguLi50YXJnZXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsIC4uLnRhcmdldHMpO1xuICB9XG5cbiAgdG9KU09OKGFzU3RyaW5ncykge1xuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICB1dGlscyQxLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09IGZhbHNlICYmIChvYmpbaGVhZGVyXSA9IGFzU3RyaW5ncyAmJiB1dGlscyQxLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscyQxLmlzQXJyYXkoaGVhZGVyKSA/IGhlYWRlci5mb3JFYWNoKGRlZmluZUFjY2Vzc29yKSA6IGRlZmluZUFjY2Vzc29yKGhlYWRlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5BeGlvc0hlYWRlcnMuYWNjZXNzb3IoWydDb250ZW50LVR5cGUnLCAnQ29udGVudC1MZW5ndGgnLCAnQWNjZXB0JywgJ0FjY2VwdC1FbmNvZGluZycsICdVc2VyLUFnZW50JywgJ0F1dGhvcml6YXRpb24nXSk7XG5cbi8vIHJlc2VydmVkIG5hbWVzIGhvdGZpeFxudXRpbHMkMS5yZWR1Y2VEZXNjcmlwdG9ycyhBeGlvc0hlYWRlcnMucHJvdG90eXBlLCAoe3ZhbHVlfSwga2V5KSA9PiB7XG4gIGxldCBtYXBwZWQgPSBrZXlbMF0udG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTsgLy8gbWFwIGBzZXRgID0+IGBTZXRgXG4gIHJldHVybiB7XG4gICAgZ2V0OiAoKSA9PiB2YWx1ZSxcbiAgICBzZXQoaGVhZGVyVmFsdWUpIHtcbiAgICAgIHRoaXNbbWFwcGVkXSA9IGhlYWRlclZhbHVlO1xuICAgIH1cbiAgfVxufSk7XG5cbnV0aWxzJDEuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG52YXIgQXhpb3NIZWFkZXJzJDEgPSBBeGlvc0hlYWRlcnM7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7P09iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShmbnMsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHRoaXMgfHwgZGVmYXVsdHMkMTtcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29udGV4dC5oZWFkZXJzKTtcbiAgbGV0IGRhdGEgPSBjb250ZXh0LmRhdGE7XG5cbiAgdXRpbHMkMS5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29uZmlnLCBkYXRhLCBoZWFkZXJzLm5vcm1hbGl6ZSgpLCByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGhlYWRlcnMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsKHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fX0NBTkNFTF9fKTtcbn1cblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzJDEuaW5oZXJpdHMoQ2FuY2VsZWRFcnJvciwgQXhpb3NFcnJvciwge1xuICBfX0NBTkNFTF9fOiB0cnVlXG59KTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IHZhbGlkYXRlU3RhdHVzID0gcmVzcG9uc2UuY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICBbQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihyZXNwb25zZS5zdGF0dXMgLyAxMDApIC0gNF0sXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3RvY29sKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9eKFstK1xcd117MSwyNX0pKDo/XFwvXFwvfDopLy5leGVjKHVybCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgZGF0YSBtYXhSYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3NhbXBsZXNDb3VudD0gMTBdXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbj0gMTAwMF1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3BlZWRvbWV0ZXIoc2FtcGxlc0NvdW50LCBtaW4pIHtcbiAgc2FtcGxlc0NvdW50ID0gc2FtcGxlc0NvdW50IHx8IDEwO1xuICBjb25zdCBieXRlcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBjb25zdCB0aW1lc3RhbXBzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGxldCBoZWFkID0gMDtcbiAgbGV0IHRhaWwgPSAwO1xuICBsZXQgZmlyc3RTYW1wbGVUUztcblxuICBtaW4gPSBtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IDEwMDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1c2goY2h1bmtMZW5ndGgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gdGltZXN0YW1wc1t0YWlsXTtcblxuICAgIGlmICghZmlyc3RTYW1wbGVUUykge1xuICAgICAgZmlyc3RTYW1wbGVUUyA9IG5vdztcbiAgICB9XG5cbiAgICBieXRlc1toZWFkXSA9IGNodW5rTGVuZ3RoO1xuICAgIHRpbWVzdGFtcHNbaGVhZF0gPSBub3c7XG5cbiAgICBsZXQgaSA9IHRhaWw7XG4gICAgbGV0IGJ5dGVzQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgIT09IGhlYWQpIHtcbiAgICAgIGJ5dGVzQ291bnQgKz0gYnl0ZXNbaSsrXTtcbiAgICAgIGkgPSBpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGhlYWQgPSAoaGVhZCArIDEpICUgc2FtcGxlc0NvdW50O1xuXG4gICAgaWYgKGhlYWQgPT09IHRhaWwpIHtcbiAgICAgIHRhaWwgPSAodGFpbCArIDEpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChub3cgLSBmaXJzdFNhbXBsZVRTIDwgbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc2VkID0gc3RhcnRlZEF0ICYmIG5vdyAtIHN0YXJ0ZWRBdDtcblxuICAgIHJldHVybiBwYXNzZWQgPyBNYXRoLnJvdW5kKGJ5dGVzQ291bnQgKiAxMDAwIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaHJvdHRsZSBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gZnJlcVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCBmcmVxKSB7XG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBsZXQgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCBsYXN0QXJncztcbiAgbGV0IHRpbWVyO1xuXG4gIGNvbnN0IGludm9rZSA9IChhcmdzLCBub3cgPSBEYXRlLm5vdygpKSA9PiB7XG4gICAgdGltZXN0YW1wID0gbm93O1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IHRocm90dGxlZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBwYXNzZWQgPSBub3cgLSB0aW1lc3RhbXA7XG4gICAgaWYgKCBwYXNzZWQgPj0gdGhyZXNob2xkKSB7XG4gICAgICBpbnZva2UoYXJncywgbm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICBpbnZva2UobGFzdEFyZ3MpO1xuICAgICAgICB9LCB0aHJlc2hvbGQgLSBwYXNzZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBmbHVzaCA9ICgpID0+IGxhc3RBcmdzICYmIGludm9rZShsYXN0QXJncyk7XG5cbiAgcmV0dXJuIFt0aHJvdHRsZWQsIGZsdXNoXTtcbn1cblxuY29uc3QgcHJvZ3Jlc3NFdmVudFJlZHVjZXIgPSAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGUsXG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiB0b3RhbCAhPSBudWxsLFxuICAgICAgW2lzRG93bmxvYWRTdHJlYW0gPyAnZG93bmxvYWQnIDogJ3VwbG9hZCddOiB0cnVlXG4gICAgfTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9LCBmcmVxKTtcbn07XG5cbmNvbnN0IHByb2dyZXNzRXZlbnREZWNvcmF0b3IgPSAodG90YWwsIHRocm90dGxlZCkgPT4ge1xuICBjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT0gbnVsbDtcblxuICByZXR1cm4gWyhsb2FkZWQpID0+IHRocm90dGxlZFswXSh7XG4gICAgbGVuZ3RoQ29tcHV0YWJsZSxcbiAgICB0b3RhbCxcbiAgICBsb2FkZWRcbiAgfSksIHRocm90dGxlZFsxXV07XG59O1xuXG5jb25zdCBhc3luY0RlY29yYXRvciA9IChmbikgPT4gKC4uLmFyZ3MpID0+IHV0aWxzJDEuYXNhcCgoKSA9PiBmbiguLi5hcmdzKSk7XG5cbnZhciBpc1VSTFNhbWVPcmlnaW4gPSBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4vLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3Rcbi8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIGNvbnN0IG1zaWUgPSBwbGF0Zm9ybS5uYXZpZ2F0b3IgJiYgLyhtc2llfHRyaWRlbnQpL2kudGVzdChwbGF0Zm9ybS5uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBjb25zdCB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsZXQgb3JpZ2luVVJMO1xuXG4gICAgLyoqXG4gICAgKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdHMgY29tcG9uZW50c1xuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byBiZSBwYXJzZWRcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xuICAgICAgbGV0IGhyZWYgPSB1cmw7XG5cbiAgICAgIGlmIChtc2llKSB7XG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgfVxuXG4gICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICAgICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9ICh1dGlscyQxLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSkoKTtcblxudmFyIGNvb2tpZXMgPSBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICB7XG4gICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICBjb25zdCBjb29raWUgPSBbbmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSldO1xuXG4gICAgICB1dGlscyQxLmlzTnVtYmVyKGV4cGlyZXMpICYmIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcblxuICAgICAgdXRpbHMkMS5pc1N0cmluZyhwYXRoKSAmJiBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG5cbiAgICAgIHV0aWxzJDEuaXNTdHJpbmcoZG9tYWluKSAmJiBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXG4gICAgICBzZWN1cmUgPT09IHRydWUgJiYgY29va2llLnB1c2goJ3NlY3VyZScpO1xuXG4gICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICB9LFxuXG4gICAgcmVhZChuYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgIH0sXG5cbiAgICByZW1vdmUobmFtZSkge1xuICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICB9XG4gIH1cblxuICA6XG5cbiAgLy8gTm9uLXN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICB7XG4gICAgd3JpdGUoKSB7fSxcbiAgICByZWFkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmUoKSB7fVxuICB9O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXG4gKi9cbmZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8/XFwvJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXG4gKiBvbmx5IHdoZW4gdGhlIHJlcXVlc3RlZFVSTCBpcyBub3QgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwuXG4gKiBJZiB0aGUgcmVxdWVzdFVSTCBpcyBhYnNvbHV0ZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1ZXN0ZWRVUkwgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RlZFVSTCBBYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgdG8gY29tYmluZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBmdWxsIHBhdGhcbiAqL1xuZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59XG5cbmNvbnN0IGhlYWRlcnNUb09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgaW5zdGFuY2VvZiBBeGlvc0hlYWRlcnMkMSA/IHsgLi4udGhpbmcgfSA6IHRoaW5nO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICBjb25zdCBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSwgY2FzZWxlc3MpIHtcbiAgICBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMkMS5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscyQxLm1lcmdlLmNhbGwoe2Nhc2VsZXNzfSwgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscyQxLm1lcmdlKHt9LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKGEsIGIsIGNhc2VsZXNzKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYiwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIGNhc2VsZXNzKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscyQxLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEaXJlY3RLZXlzKGEsIGIsIHByb3ApIHtcbiAgICBpZiAocHJvcCBpbiBjb25maWcyKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYik7XG4gICAgfSBlbHNlIGlmIChwcm9wIGluIGNvbmZpZzEpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlTWFwID0ge1xuICAgIHVybDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBtZXRob2Q6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgZGF0YTogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBiYXNlVVJMOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcGFyYW1zU2VyaWFsaXplcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXRNZXNzYWdlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhDcmVkZW50aWFsczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoWFNSRlRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGFkYXB0ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VUeXBlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZDb29raWVOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHhzcmZIZWFkZXJOYW1lOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGRlY29tcHJlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Q29udGVudExlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhCb2R5TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGJlZm9yZVJlZGlyZWN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zcG9ydDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cHNBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBjYW5jZWxUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBzb2NrZXRQYXRoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlRW5jb2Rpbmc6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdmFsaWRhdGVTdGF0dXM6IG1lcmdlRGlyZWN0S2V5cyxcbiAgICBoZWFkZXJzOiAoYSwgYikgPT4gbWVyZ2VEZWVwUHJvcGVydGllcyhoZWFkZXJzVG9PYmplY3QoYSksIGhlYWRlcnNUb09iamVjdChiKSwgdHJ1ZSlcbiAgfTtcblxuICB1dGlscyQxLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnMSwgY29uZmlnMikpLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscyQxLmlzVW5kZWZpbmVkKGNvbmZpZ1ZhbHVlKSAmJiBtZXJnZSAhPT0gbWVyZ2VEaXJlY3RLZXlzKSB8fCAoY29uZmlnW3Byb3BdID0gY29uZmlnVmFsdWUpO1xuICB9KTtcblxuICByZXR1cm4gY29uZmlnO1xufVxuXG52YXIgcmVzb2x2ZUNvbmZpZyA9IChjb25maWcpID0+IHtcbiAgY29uc3QgbmV3Q29uZmlnID0gbWVyZ2VDb25maWcoe30sIGNvbmZpZyk7XG5cbiAgbGV0IHtkYXRhLCB3aXRoWFNSRlRva2VuLCB4c3JmSGVhZGVyTmFtZSwgeHNyZkNvb2tpZU5hbWUsIGhlYWRlcnMsIGF1dGh9ID0gbmV3Q29uZmlnO1xuXG4gIG5ld0NvbmZpZy5oZWFkZXJzID0gaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oaGVhZGVycyk7XG5cbiAgbmV3Q29uZmlnLnVybCA9IGJ1aWxkVVJMKGJ1aWxkRnVsbFBhdGgobmV3Q29uZmlnLmJhc2VVUkwsIG5ld0NvbmZpZy51cmwpLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgK1xuICAgICAgYnRvYSgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhdXRoLnBhc3N3b3JkKSkgOiAnJykpXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb250ZW50VHlwZTtcblxuICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscyQxLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikgJiYgKHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKG5ld0NvbmZpZykpO1xuXG4gICAgaWYgKHdpdGhYU1JGVG9rZW4gfHwgKHdpdGhYU1JGVG9rZW4gIT09IGZhbHNlICYmIGlzVVJMU2FtZU9yaWdpbihuZXdDb25maWcudXJsKSkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgY29uc3QgeHNyZlZhbHVlID0geHNyZkhlYWRlck5hbWUgJiYgeHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKHhzcmZDb29raWVOYW1lKTtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICBoZWFkZXJzLnNldCh4c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q29uZmlnO1xufTtcblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxudmFyIHhockFkYXB0ZXIgPSBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShfY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuICAgIGxldCB7cmVzcG9uc2VUeXBlLCBvblVwbG9hZFByb2dyZXNzLCBvbkRvd25sb2FkUHJvZ3Jlc3N9ID0gX2NvbmZpZztcbiAgICBsZXQgb25DYW5jZWxlZDtcbiAgICBsZXQgdXBsb2FkVGhyb3R0bGVkLCBkb3dubG9hZFRocm90dGxlZDtcbiAgICBsZXQgZmx1c2hVcGxvYWQsIGZsdXNoRG93bmxvYWQ7XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgZmx1c2hVcGxvYWQgJiYgZmx1c2hVcGxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG4gICAgICBmbHVzaERvd25sb2FkICYmIGZsdXNoRG93bmxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcblxuICAgICAgX2NvbmZpZy5zaWduYWwgJiYgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gX2NvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzJDEuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChfY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgKFtkb3dubG9hZFRocm90dGxlZCwgZmx1c2hEb3dubG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvbkRvd25sb2FkUHJvZ3Jlc3MsIHRydWUpKTtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBkb3dubG9hZFRocm90dGxlZCk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAob25VcGxvYWRQcm9ncmVzcyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgKFt1cGxvYWRUaHJvdHRsZWQsIGZsdXNoVXBsb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uVXBsb2FkUHJvZ3Jlc3MpKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB1cGxvYWRUaHJvdHRsZWQpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZmx1c2hVcGxvYWQpO1xuICAgIH1cblxuICAgIGlmIChfY29uZmlnLmNhbmNlbFRva2VuIHx8IF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgb25DYW5jZWxlZCA9IGNhbmNlbCA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCBjYW5jZWwudHlwZSA/IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZywgcmVxdWVzdCkgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIGlmIChfY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBfY29uZmlnLnNpZ25hbC5hYm9ydGVkID8gb25DYW5jZWxlZCgpIDogX2NvbmZpZy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2woX2NvbmZpZy51cmwpO1xuXG4gICAgaWYgKHByb3RvY29sICYmIHBsYXRmb3JtLnByb3RvY29scy5pbmRleE9mKHByb3RvY29sKSA9PT0gLTEpIHtcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sICsgJzonLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgY29uZmlnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhIHx8IG51bGwpO1xuICB9KTtcbn07XG5cbmNvbnN0IGNvbXBvc2VTaWduYWxzID0gKHNpZ25hbHMsIHRpbWVvdXQpID0+IHtcbiAgY29uc3Qge2xlbmd0aH0gPSAoc2lnbmFscyA9IHNpZ25hbHMgPyBzaWduYWxzLmZpbHRlcihCb29sZWFuKSA6IFtdKTtcblxuICBpZiAodGltZW91dCB8fCBsZW5ndGgpIHtcbiAgICBsZXQgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGxldCBhYm9ydGVkO1xuXG4gICAgY29uc3Qgb25hYm9ydCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlmICghYWJvcnRlZCkge1xuICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY29uc3QgZXJyID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiB0aGlzLnJlYXNvbjtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yID8gZXJyIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgaWYgKHNpZ25hbHMpIHtcbiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICBzaWduYWxzLmZvckVhY2goc2lnbmFsID0+IHtcbiAgICAgICAgICBzaWduYWwudW5zdWJzY3JpYmUgPyBzaWduYWwudW5zdWJzY3JpYmUob25hYm9ydCkgOiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNpZ25hbHMgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gICAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gICAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMkMS5hc2FwKHVuc3Vic2NyaWJlKTtcblxuICAgIHJldHVybiBzaWduYWw7XG4gIH1cbn07XG5cbnZhciBjb21wb3NlU2lnbmFscyQxID0gY29tcG9zZVNpZ25hbHM7XG5cbmNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmICghY2h1bmtTaXplIHx8IGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufTtcblxuY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVhZFN0cmVhbShpdGVyYWJsZSkpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoY2h1bmssIGNodW5rU2l6ZSk7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRTdHJlYW0gPSBhc3luYyBmdW5jdGlvbiogKHN0cmVhbSkge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHlpZWxkKiBzdHJlYW07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHtkb25lLCB2YWx1ZX0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICB9XG59O1xuXG5jb25zdCB0cmFja1N0cmVhbSA9IChzdHJlYW0sIGNodW5rU2l6ZSwgb25Qcm9ncmVzcywgb25GaW5pc2gpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufTtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbmNvbnN0IHN1cHBvcnRzUmVxdWVzdFN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiYgdGVzdCgoKSA9PiB7XG4gIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAnaGFsZic7XG4gICAgfSxcbiAgfSkuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG59KTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICB0ZXN0KCgpID0+IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzJDEuaXNGdW5jdGlvbihyZXNbdHlwZV0pID8gKHJlcykgPT4gcmVzW3R5cGVdKCkgOlxuICAgICAgKF8sIGNvbmZpZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSk7XG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscyQxLmlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemU7XG4gIH1cblxuICBpZih1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICBjb25zdCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5LFxuICAgIH0pO1xuICAgIHJldHVybiAoYXdhaXQgX3JlcXVlc3QuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMkMS5pc0FycmF5QnVmZmVyKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMoYm9keSkpIHtcbiAgICBib2R5ID0gYm9keSArICcnO1xuICB9XG5cbiAgaWYodXRpbHMkMS5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufTtcblxuY29uc3QgcmVzb2x2ZUJvZHlMZW5ndGggPSBhc3luYyAoaGVhZGVycywgYm9keSkgPT4ge1xuICBjb25zdCBsZW5ndGggPSB1dGlscyQxLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufTtcblxudmFyIGZldGNoQWRhcHRlciA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKGFzeW5jIChjb25maWcpID0+IHtcbiAgbGV0IHtcbiAgICB1cmwsXG4gICAgbWV0aG9kLFxuICAgIGRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbFRva2VuLFxuICAgIHRpbWVvdXQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlLFxuICAgIGhlYWRlcnMsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICBmZXRjaE9wdGlvbnNcbiAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgPyAocmVzcG9uc2VUeXBlICsgJycpLnRvTG93ZXJDYXNlKCkgOiAndGV4dCc7XG5cbiAgbGV0IGNvbXBvc2VkU2lnbmFsID0gY29tcG9zZVNpZ25hbHMkMShbc2lnbmFsLCBjYW5jZWxUb2tlbiAmJiBjYW5jZWxUb2tlbi50b0Fib3J0U2lnbmFsKCldLCB0aW1lb3V0KTtcblxuICBsZXQgcmVxdWVzdDtcblxuICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbXBvc2VkU2lnbmFsICYmIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlICYmICgoKSA9PiB7XG4gICAgICBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSgpO1xuICB9KTtcblxuICBsZXQgcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgdHJ5IHtcbiAgICBpZiAoXG4gICAgICBvblVwbG9hZFByb2dyZXNzICYmIHN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJiBtZXRob2QgIT09ICdnZXQnICYmIG1ldGhvZCAhPT0gJ2hlYWQnICYmXG4gICAgICAocmVxdWVzdENvbnRlbnRMZW5ndGggPSBhd2FpdCByZXNvbHZlQm9keUxlbmd0aChoZWFkZXJzLCBkYXRhKSkgIT09IDBcbiAgICApIHtcbiAgICAgIGxldCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgZHVwbGV4OiBcImhhbGZcIlxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjb250ZW50VHlwZUhlYWRlcjtcblxuICAgICAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3JlcXVlc3QuYm9keSkge1xuICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICByZXF1ZXN0Q29udGVudExlbmd0aCxcbiAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvblVwbG9hZFByb2dyZXNzKSlcbiAgICAgICAgKTtcblxuICAgICAgICBkYXRhID0gdHJhY2tTdHJlYW0oX3JlcXVlc3QuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCBmbHVzaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICB9XG5cbiAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWw6IGNvbXBvc2VkU2lnbmFsLFxuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgZHVwbGV4OiBcImhhbGZcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICBpZiAoc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAob25Eb3dubG9hZFByb2dyZXNzIHx8IChpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpO1xuXG4gICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gb25Eb3dubG9hZFByb2dyZXNzICYmIHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgIHJlc3BvbnNlQ29udGVudExlbmd0aCxcbiAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25Eb3dubG9hZFByb2dyZXNzKSwgdHJ1ZSlcbiAgICAgICkgfHwgW107XG5cbiAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICB0cmFja1N0cmVhbShyZXNwb25zZS5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsICgpID0+IHtcbiAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICBsZXQgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzb2x2ZXJzW3V0aWxzJDEuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pO1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgfVxufSk7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn07XG5cbnV0aWxzJDEuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzJDEuaXNGdW5jdGlvbihhZGFwdGVyKSB8fCBhZGFwdGVyID09PSBudWxsIHx8IGFkYXB0ZXIgPT09IGZhbHNlO1xuXG52YXIgYWRhcHRlcnMgPSB7XG4gIGdldEFkYXB0ZXI6IChhZGFwdGVycykgPT4ge1xuICAgIGFkYXB0ZXJzID0gdXRpbHMkMS5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5mdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29uZmlnLmhlYWRlcnMpO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgaWYgKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpICE9PSAtMSkge1xuICAgIGNvbmZpZy5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcihjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cyQxLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShyZWFzb24ucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufVxuXG5jb25zdCBWRVJTSU9OID0gXCIxLjcuN1wiO1xuXG5jb25zdCB2YWxpZGF0b3JzJDEgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnMkMVt0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzJDEudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgY29uc3Qgb3B0ID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdG9yID0ge1xuICBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzJDFcbn07XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB2YWxpZGF0b3IudmFsaWRhdG9ycztcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW5zdGFuY2VDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuY2xhc3MgQXhpb3Mge1xuICBjb25zdHJ1Y3RvcihpbnN0YW5jZUNvbmZpZykge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcbiAgICB0aGlzLmludGVyY2VwdG9ycyA9IHtcbiAgICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIkMSgpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIkMSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBjb25maWdPclVybCBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gICAqIEBwYXJhbSB7P09iamVjdH0gY29uZmlnXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAgICovXG4gIGFzeW5jIHJlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBsZXQgZHVtbXk7XG5cbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSA9IHt9KSA6IChkdW1teSA9IG5ldyBFcnJvcigpKTtcblxuICAgICAgICAvLyBzbGljZSBvZmYgdGhlIEVycm9yOiAuLi4gbGluZVxuICAgICAgICBjb25zdCBzdGFjayA9IGR1bW15LnN0YWNrID8gZHVtbXkuc3RhY2sucmVwbGFjZSgvXi4rXFxuLywgJycpIDogJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGVyci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgICAgLy8gbWF0Y2ggd2l0aG91dCB0aGUgMiB0b3Agc3RhY2sgbGluZXNcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrICYmICFTdHJpbmcoZXJyLnN0YWNrKS5lbmRzV2l0aChzdGFjay5yZXBsYWNlKC9eLitcXG4uK1xcbi8sICcnKSkpIHtcbiAgICAgICAgICAgIGVyci5zdGFjayArPSAnXFxuJyArIHN0YWNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGUgY2FzZSB3aGVyZSBcInN0YWNrXCIgaXMgYW4gdW4td3JpdGFibGUgcHJvcGVydHlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBjb25maWdPclVybCB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgY29uc3Qge3RyYW5zaXRpb25hbCwgcGFyYW1zU2VyaWFsaXplciwgaGVhZGVyc30gPSBjb25maWc7XG5cbiAgICBpZiAodHJhbnNpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgICBzaWxlbnRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zU2VyaWFsaXplciAhPSBudWxsKSB7XG4gICAgICBpZiAodXRpbHMkMS5pc0Z1bmN0aW9uKHBhcmFtc1NlcmlhbGl6ZXIpKSB7XG4gICAgICAgIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyID0ge1xuICAgICAgICAgIHNlcmlhbGl6ZTogcGFyYW1zU2VyaWFsaXplclxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMocGFyYW1zU2VyaWFsaXplciwge1xuICAgICAgICAgIGVuY29kZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICBzZXJpYWxpemU6IHZhbGlkYXRvcnMuZnVuY3Rpb25cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgICBjb25maWcubWV0aG9kID0gKGNvbmZpZy5tZXRob2QgfHwgdGhpcy5kZWZhdWx0cy5tZXRob2QgfHwgJ2dldCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgICBsZXQgY29udGV4dEhlYWRlcnMgPSBoZWFkZXJzICYmIHV0aWxzJDEubWVyZ2UoXG4gICAgICBoZWFkZXJzLmNvbW1vbixcbiAgICAgIGhlYWRlcnNbY29uZmlnLm1ldGhvZF1cbiAgICApO1xuXG4gICAgaGVhZGVycyAmJiB1dGlscyQxLmZvckVhY2goXG4gICAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICAgIChtZXRob2QpID0+IHtcbiAgICAgICAgZGVsZXRlIGhlYWRlcnNbbWV0aG9kXTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5jb25jYXQoY29udGV4dEhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICAgIGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgbGV0IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGxldCBwcm9taXNlO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuO1xuXG4gICAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdC5iaW5kKHRoaXMpLCB1bmRlZmluZWRdO1xuICAgICAgY2hhaW4udW5zaGlmdC5hcHBseShjaGFpbiwgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgY2hhaW4ucHVzaC5hcHBseShjaGFpbiwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGxlbiA9IGNoYWluLmxlbmd0aDtcblxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gICAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluW2krK10sIGNoYWluW2krK10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBsZW4gPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgY29uc3Qgb25GdWxmaWxsZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgY29uc3Qgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICB0cnkge1xuICAgICAgICBuZXdDb25maWcgPSBvbkZ1bGZpbGxlZChuZXdDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25SZWplY3RlZC5jYWxsKHRoaXMsIGVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UgPSBkaXNwYXRjaFJlcXVlc3QuY2FsbCh0aGlzLCBuZXdDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIGkgPSAwO1xuICAgIGxlbiA9IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgZ2V0VXJpKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXR1cm4gYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcbiAgfVxufVxuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzJDEuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdvcHRpb25zJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgZGF0YTogKGNvbmZpZyB8fCB7fSkuZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG51dGlscyQxLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxudmFyIEF4aW9zJDEgPSBBeGlvcztcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsVG9rZW59XG4gKi9cbmNsYXNzIENhbmNlbFRva2VuIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVQcm9taXNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4oY2FuY2VsID0+IHtcbiAgICAgIGlmICghdG9rZW4uX2xpc3RlbmVycykgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgICB9XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4gPSBvbmZ1bGZpbGxlZCA9PiB7XG4gICAgICBsZXQgX3Jlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgICAgdG9rZW4udW5zdWJzY3JpYmUoX3Jlc29sdmUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAqL1xuICB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgdGhyb3cgdGhpcy5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICB0b0Fib3J0U2lnbmFsKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBjb25zdCBhYm9ydCA9IChlcnIpID0+IHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zdWJzY3JpYmUoYWJvcnQpO1xuXG4gICAgY29udHJvbGxlci5zaWduYWwudW5zdWJzY3JpYmUgPSAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gICAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gICAqL1xuICBzdGF0aWMgc291cmNlKCkge1xuICAgIGxldCBjYW5jZWw7XG4gICAgY29uc3QgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgICAgY2FuY2VsID0gYztcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICBjYW5jZWxcbiAgICB9O1xuICB9XG59XG5cbnZhciBDYW5jZWxUb2tlbiQxID0gQ2FuY2VsVG9rZW47XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMkMS5pc09iamVjdChwYXlsb2FkKSAmJiAocGF5bG9hZC5pc0F4aW9zRXJyb3IgPT09IHRydWUpO1xufVxuXG5jb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxudmFyIEh0dHBTdGF0dXNDb2RlJDEgPSBIdHRwU3RhdHVzQ29kZTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zJDEoZGVmYXVsdENvbmZpZyk7XG4gIGNvbnN0IGluc3RhbmNlID0gYmluZChBeGlvcyQxLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscyQxLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MkMS5wcm90b3R5cGUsIGNvbnRleHQsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzJDEuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0LCBudWxsLCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMkMSk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcyQxO1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbGVkRXJyb3IgPSBDYW5jZWxlZEVycm9yO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSBDYW5jZWxUb2tlbiQxO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycyQxO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMkMS5pc0hUTUxGb3JtKHRoaW5nKSA/IG5ldyBGb3JtRGF0YSh0aGluZykgOiB0aGluZyk7XG5cbmF4aW9zLmdldEFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyO1xuXG5heGlvcy5IdHRwU3RhdHVzQ29kZSA9IEh0dHBTdGF0dXNDb2RlJDE7XG5cbmF4aW9zLmRlZmF1bHQgPSBheGlvcztcblxubW9kdWxlLmV4cG9ydHMgPSBheGlvcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF4aW9zLmNqcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkF4aW9zQ2xpZW50ID0gdm9pZCAwO1xudmFyIGF4aW9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImF4aW9zXCIpKTtcbnZhciBBeGlvc0NsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBeGlvc0NsaWVudChfYSkge1xuICAgICAgICB2YXIgcmVzcG9uc2VIYW5kbGVyID0gX2EucmVzcG9uc2VIYW5kbGVyLCByZXF1ZXN0Q29uZmlnQnVpbGRlciA9IF9hLnJlcXVlc3RDb25maWdCdWlsZGVyO1xuICAgICAgICB0aGlzLnJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlSGFuZGxlcjtcbiAgICAgICAgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlciA9IHJlcXVlc3RDb25maWdCdWlsZGVyO1xuICAgIH1cbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBhdGgsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlci5idWlsZChcImdldFwiLCBwYXRoLCBwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbmZpZyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdENvbmZpZyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCAoX2Euc2VudCgpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQXhpb3NDbGllbnQucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0Q29uZmlnO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RDb25maWdCdWlsZGVyLmJ1aWxkKFwiZ2V0XCIsIHBhdGgsIHBhcmFtcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUucG9zdCA9IGZ1bmN0aW9uIChwYXRoLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RDb25maWc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdENvbmZpZ0J1aWxkZXIuYnVpbGQoXCJwb3N0XCIsIHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUucG9zdERhdGEgPSBmdW5jdGlvbiAocGF0aCwgZm9ybURhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RDb25maWc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucmVxdWVzdENvbmZpZ0J1aWxkZXIuYnVpbGQoXCJwb3N0XCIsIHBhdGgsIGZvcm1EYXRhKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgKF9hLnNlbnQoKSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEF4aW9zQ2xpZW50LnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0Q29uZmlnO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnJlcXVlc3RDb25maWdCdWlsZGVyLmJ1aWxkKFwicHV0XCIsIHBhdGgsIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29uZmlnID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zZW5kUmVxdWVzdChyZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYS5zZW50KCkpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBBeGlvc0NsaWVudC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhdGgsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5yZXF1ZXN0Q29uZmlnQnVpbGRlci5idWlsZChcImRlbGV0ZVwiLCBwYXRoLCBwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbmZpZyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdENvbmZpZyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCAoX2Euc2VudCgpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQXhpb3NDbGllbnQucHJvdG90eXBlLnNlbmRSZXF1ZXN0ID0gZnVuY3Rpb24gKHJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VIYW5kbGVyLmhhbmRsZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgICAgKDAsIGF4aW9zXzEuZGVmYXVsdCkoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IG1heEJvZHlMZW5ndGg6IEluZmluaXR5LCBtYXhDb250ZW50TGVuZ3RoOiBJbmZpbml0eSB9KSkpO1xuICAgIH07XG4gICAgcmV0dXJuIEF4aW9zQ2xpZW50O1xufSgpKTtcbmV4cG9ydHMuQXhpb3NDbGllbnQgPSBBeGlvc0NsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUF4aW9zQ2xpZW50LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EZWZhdWx0SHR0cENsaWVudCA9IHZvaWQgMDtcbnZhciBBeGlvc0NsaWVudF8xID0gcmVxdWlyZShcIi4vQXhpb3NDbGllbnRcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEZWZhdWx0SHR0cENsaWVudFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gQXhpb3NDbGllbnRfMS5BeGlvc0NsaWVudDsgfSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2V2YWwnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gRXZhbEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yYW5nZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBSYW5nZUVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLi9yZWYnKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gUmVmZXJlbmNlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3N5bnRheCcpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBTeW50YXhFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vdHlwZScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBUeXBlRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL3VyaScpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBVUklFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxOF0sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHsgcmV0dXJuIHRydWU7IH1cblxuXHR2YXIgb2JqID0ge307XG5cdHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcblx0dmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXHRpZiAodHlwZW9mIHN5bSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW1PYmopICE9PSAnW29iamVjdCBTeW1ib2xdJykgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL29iamVjdC5hc3NpZ24vaXNzdWVzLzE3XG5cdC8vIGlmIChzeW0gaW5zdGFuY2VvZiBTeW1ib2wpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL2dldC1vd24tcHJvcGVydHktc3ltYm9scy9pc3N1ZXMvNFxuXHQvLyBpZiAoIShzeW1PYmogaW5zdGFuY2VvZiBTeW1ib2wpKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0Ly8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltVmFsID0gNDI7XG5cdG9ialtzeW1dID0gc3ltVmFsO1xuXHRmb3IgKHN5bSBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLXVucmVhY2hhYmxlLWxvb3Bcblx0aWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHZhciBzeW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuXHRpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pO1xuXHRcdGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7IHJldHVybiBmYWxzZTsgfVxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3JpZ1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGVzdCA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRmb286IHt9XG59O1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzUHJvdG8oKSB7XG5cdC8vIEB0cy1leHBlY3QtZXJyb3I6IFRTIGVycm9ycyBvbiBhbiBpbmhlcml0ZWQgcHJvcGVydHkgZm9yIHNvbWUgcmVhc29uXG5cdHJldHVybiB7IF9fcHJvdG9fXzogdGVzdCB9LmZvbyA9PT0gdGVzdC5mb29cblx0XHQmJiAhKHRlc3QgaW5zdGFuY2VvZiAkT2JqZWN0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDEgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnO1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBmdW5jVHlwZSA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cbnZhciBjb25jYXR0eSA9IGZ1bmN0aW9uIGNvbmNhdHR5KGEsIGIpIHtcbiAgICB2YXIgYXJyID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXJyW2ldID0gYVtpXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBiLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGFycltqICsgYS5sZW5ndGhdID0gYltqXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xufTtcblxudmFyIHNsaWN5ID0gZnVuY3Rpb24gc2xpY3koYXJyTGlrZSwgb2Zmc2V0KSB7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBvZmZzZXQgfHwgMCwgaiA9IDA7IGkgPCBhcnJMaWtlLmxlbmd0aDsgaSArPSAxLCBqICs9IDEpIHtcbiAgICAgICAgYXJyW2pdID0gYXJyTGlrZVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbn07XG5cbnZhciBqb2lueSA9IGZ1bmN0aW9uIChhcnIsIGpvaW5lcikge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBzdHIgKz0gYXJyW2ldO1xuICAgICAgICBpZiAoaSArIDEgPCBhcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICBzdHIgKz0gam9pbmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQodGhhdCkge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyLmFwcGx5KHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY3koYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBib3VuZDtcbiAgICB2YXIgYmluZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgY29uY2F0dHkoYXJncywgYXJndW1lbnRzKVxuICAgICAgICApO1xuXG4gICAgfTtcblxuICAgIHZhciBib3VuZExlbmd0aCA9IG1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzW2ldID0gJyQnICsgaTtcbiAgICB9XG5cbiAgICBib3VuZCA9IEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgam9pbnkoYm91bmRBcmdzLCAnLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICAgIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciAkaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpfSAqL1xubW9kdWxlLmV4cG9ydHMgPSBiaW5kLmNhbGwoY2FsbCwgJGhhc093bik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMnKTtcbnZhciAkRXZhbEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL2V2YWwnKTtcbnZhciAkUmFuZ2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yYW5nZScpO1xudmFyICRSZWZlcmVuY2VFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy9yZWYnKTtcbnZhciAkU3ludGF4RXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvc3ludGF4Jyk7XG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFVSSUVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3VyaScpO1xuXG52YXIgJEZ1bmN0aW9uID0gRnVuY3Rpb247XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxudmFyIGdldEV2YWxsZWRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChleHByZXNzaW9uU3ludGF4KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuICRGdW5jdGlvbignXCJ1c2Ugc3RyaWN0XCI7IHJldHVybiAoJyArIGV4cHJlc3Npb25TeW50YXggKyAnKS5jb25zdHJ1Y3RvcjsnKSgpO1xuXHR9IGNhdGNoIChlKSB7fVxufTtcblxudmFyICRnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbmlmICgkZ09QRCkge1xuXHR0cnkge1xuXHRcdCRnT1BEKHt9LCAnJyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQkZ09QRCA9IG51bGw7IC8vIHRoaXMgaXMgSUUgOCwgd2hpY2ggaGFzIGEgYnJva2VuIGdPUERcblx0fVxufVxuXG52YXIgdGhyb3dUeXBlRXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdHRocm93IG5ldyAkVHlwZUVycm9yKCk7XG59O1xudmFyIFRocm93VHlwZUVycm9yID0gJGdPUERcblx0PyAoZnVuY3Rpb24gKCkge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zLCBuby1jYWxsZXIsIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllc1xuXHRcdFx0YXJndW1lbnRzLmNhbGxlZTsgLy8gSUUgOCBkb2VzIG5vdCB0aHJvdyBoZXJlXG5cdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0fSBjYXRjaCAoY2FsbGVlVGhyb3dzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBJRSA4IHRocm93cyBvbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFyZ3VtZW50cywgJycpXG5cdFx0XHRcdHJldHVybiAkZ09QRChhcmd1bWVudHMsICdjYWxsZWUnKS5nZXQ7XG5cdFx0XHR9IGNhdGNoIChnT1BEdGhyb3dzKSB7XG5cdFx0XHRcdHJldHVybiB0aHJvd1R5cGVFcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cdH0oKSlcblx0OiB0aHJvd1R5cGVFcnJvcjtcblxudmFyIGhhc1N5bWJvbHMgPSByZXF1aXJlKCdoYXMtc3ltYm9scycpKCk7XG52YXIgaGFzUHJvdG8gPSByZXF1aXJlKCdoYXMtcHJvdG8nKSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgKFxuXHRoYXNQcm90b1xuXHRcdD8gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblx0XHQ6IG51bGxcbik7XG5cbnZhciBuZWVkc0V2YWwgPSB7fTtcblxudmFyIFR5cGVkQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG5cbnZhciBJTlRSSU5TSUNTID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCclQWdncmVnYXRlRXJyb3IlJzogdHlwZW9mIEFnZ3JlZ2F0ZUVycm9yID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFnZ3JlZ2F0ZUVycm9yLFxuXHQnJUFycmF5JSc6IEFycmF5LFxuXHQnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBcnJheUJ1ZmZlcixcblx0JyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJUFzeW5jRnJvbVN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogbmVlZHNFdmFsLFxuXHQnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogbmVlZHNFdmFsLFxuXHQnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXRvbWljcyxcblx0JyVCaWdJbnQlJzogdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQsXG5cdCclQmlnSW50NjRBcnJheSUnOiB0eXBlb2YgQmlnSW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdJbnQ2NEFycmF5LFxuXHQnJUJpZ1VpbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdVaW50NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBCaWdVaW50NjRBcnJheSxcblx0JyVCb29sZWFuJSc6IEJvb2xlYW4sXG5cdCclRGF0YVZpZXclJzogdHlwZW9mIERhdGFWaWV3ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IERhdGFWaWV3LFxuXHQnJURhdGUlJzogRGF0ZSxcblx0JyVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuXHQnJWRlY29kZVVSSUNvbXBvbmVudCUnOiBkZWNvZGVVUklDb21wb25lbnQsXG5cdCclZW5jb2RlVVJJJSc6IGVuY29kZVVSSSxcblx0JyVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuXHQnJUVycm9yJSc6ICRFcnJvcixcblx0JyVldmFsJSc6IGV2YWwsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuXHQnJUV2YWxFcnJvciUnOiAkRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6ICRSYW5nZUVycm9yLFxuXHQnJVJlZmVyZW5jZUVycm9yJSc6ICRSZWZlcmVuY2VFcnJvcixcblx0JyVSZWZsZWN0JSc6IHR5cGVvZiBSZWZsZWN0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFJlZmxlY3QsXG5cdCclUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTZXQsXG5cdCclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNoYXJlZEFycmF5QnVmZmVyLFxuXHQnJVN0cmluZyUnOiBTdHJpbmcsXG5cdCclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclU3ltYm9sJSc6IGhhc1N5bWJvbHMgPyBTeW1ib2wgOiB1bmRlZmluZWQsXG5cdCclU3ludGF4RXJyb3IlJzogJFN5bnRheEVycm9yLFxuXHQnJVRocm93VHlwZUVycm9yJSc6IFRocm93VHlwZUVycm9yLFxuXHQnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcblx0JyVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcblx0JyVVaW50OEFycmF5JSc6IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4QXJyYXksXG5cdCclVWludDhDbGFtcGVkQXJyYXklJzogdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHQnJVVpbnQxNkFycmF5JSc6IHR5cGVvZiBVaW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MTZBcnJheSxcblx0JyVVaW50MzJBcnJheSUnOiB0eXBlb2YgVWludDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDMyQXJyYXksXG5cdCclVVJJRXJyb3IlJzogJFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0JyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ0FycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG90eXBlJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclQXJyYXlQcm90b19lbnRyaWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2VudHJpZXMnXSxcblx0JyVBcnJheVByb3RvX2ZvckVhY2glJzogWydBcnJheScsICdwcm90b3R5cGUnLCAnZm9yRWFjaCddLFxuXHQnJUFycmF5UHJvdG9fa2V5cyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdrZXlzJ10sXG5cdCclQXJyYXlQcm90b192YWx1ZXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAndmFsdWVzJ10sXG5cdCclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0FzeW5jRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclQXN5bmNHZW5lcmF0b3IlJzogWydBc3luY0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnLCAncHJvdG90eXBlJ10sXG5cdCclQm9vbGVhblByb3RvdHlwZSUnOiBbJ0Jvb2xlYW4nLCAncHJvdG90eXBlJ10sXG5cdCclRGF0YVZpZXdQcm90b3R5cGUlJzogWydEYXRhVmlldycsICdwcm90b3R5cGUnXSxcblx0JyVEYXRlUHJvdG90eXBlJSc6IFsnRGF0ZScsICdwcm90b3R5cGUnXSxcblx0JyVFcnJvclByb3RvdHlwZSUnOiBbJ0Vycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBbJ0V2YWxFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVGbG9hdDMyQXJyYXlQcm90b3R5cGUlJzogWydGbG9hdDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQ2NEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IFsnRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJ10sXG5cdCclR2VuZXJhdG9yUHJvdG90eXBlJSc6IFsnR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUludDhBcnJheVByb3RvdHlwZSUnOiBbJ0ludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnSW50MTZBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnSW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVKU09OUGFyc2UlJzogWydKU09OJywgJ3BhcnNlJ10sXG5cdCclSlNPTlN0cmluZ2lmeSUnOiBbJ0pTT04nLCAnc3RyaW5naWZ5J10sXG5cdCclTWFwUHJvdG90eXBlJSc6IFsnTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJU51bWJlclByb3RvdHlwZSUnOiBbJ051bWJlcicsICdwcm90b3R5cGUnXSxcblx0JyVPYmplY3RQcm90b3R5cGUlJzogWydPYmplY3QnLCAncHJvdG90eXBlJ10sXG5cdCclT2JqUHJvdG9fdG9TdHJpbmclJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3RvU3RyaW5nJ10sXG5cdCclT2JqUHJvdG9fdmFsdWVPZiUnOiBbJ09iamVjdCcsICdwcm90b3R5cGUnLCAndmFsdWVPZiddLFxuXHQnJVByb21pc2VQcm90b3R5cGUlJzogWydQcm9taXNlJywgJ3Byb3RvdHlwZSddLFxuXHQnJVByb21pc2VQcm90b190aGVuJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnLCAndGhlbiddLFxuXHQnJVByb21pc2VfYWxsJSc6IFsnUHJvbWlzZScsICdhbGwnXSxcblx0JyVQcm9taXNlX3JlamVjdCUnOiBbJ1Byb21pc2UnLCAncmVqZWN0J10sXG5cdCclUHJvbWlzZV9yZXNvbHZlJSc6IFsnUHJvbWlzZScsICdyZXNvbHZlJ10sXG5cdCclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBbJ1JhbmdlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogWydSZWZlcmVuY2VFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVSZWdFeHBQcm90b3R5cGUlJzogWydSZWdFeHAnLCAncHJvdG90eXBlJ10sXG5cdCclU2V0UHJvdG90eXBlJSc6IFsnU2V0JywgJ3Byb3RvdHlwZSddLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IFsnU2hhcmVkQXJyYXlCdWZmZXInLCAncHJvdG90eXBlJ10sXG5cdCclU3RyaW5nUHJvdG90eXBlJSc6IFsnU3RyaW5nJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN5bWJvbFByb3RvdHlwZSUnOiBbJ1N5bWJvbCcsICdwcm90b3R5cGUnXSxcblx0JyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBbJ1N5bnRheEVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogWydUeXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVR5cGVFcnJvclByb3RvdHlwZSUnOiBbJ1R5cGVFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFsnVWludDhBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFsnVWludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDMyQXJyYXlQcm90b3R5cGUlJzogWydVaW50MzJBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVUklFcnJvclByb3RvdHlwZSUnOiBbJ1VSSUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtNYXBQcm90b3R5cGUlJzogWydXZWFrTWFwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVdlYWtTZXRQcm90b3R5cGUlJzogWydXZWFrU2V0JywgJ3Byb3RvdHlwZSddXG59O1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCdoYXNvd24nKTtcbnZhciAkY29uY2F0ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIEFycmF5LnByb3RvdHlwZS5jb25jYXQpO1xudmFyICRzcGxpY2VBcHBseSA9IGJpbmQuY2FsbChGdW5jdGlvbi5hcHBseSwgQXJyYXkucHJvdG90eXBlLnNwbGljZSk7XG52YXIgJHJlcGxhY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciAkc3RyU2xpY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG52YXIgJGV4ZWMgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgUmVnRXhwLnByb3RvdHlwZS5leGVjKTtcblxuLyogYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvNC4xNy4xNS9kaXN0L2xvZGFzaC5qcyNMNjczNS1MNjc0NCAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14lLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCUkKSkvZztcbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZzsgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgc3RyaW5nVG9QYXRoID0gZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHN0cmluZykge1xuXHR2YXIgZmlyc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAwLCAxKTtcblx0dmFyIGxhc3QgPSAkc3RyU2xpY2Uoc3RyaW5nLCAtMSk7XG5cdGlmIChmaXJzdCA9PT0gJyUnICYmIGxhc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAnKTtcblx0fSBlbHNlIGlmIChsYXN0ID09PSAnJScgJiYgZmlyc3QgIT09ICclJykge1xuXHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgb3BlbmluZyBgJWAnKTtcblx0fVxuXHR2YXIgcmVzdWx0ID0gW107XG5cdCRyZXBsYWNlKHN0cmluZywgcmVQcm9wTmFtZSwgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcblx0XHRyZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBxdW90ZSA/ICRyZXBsYWNlKHN1YlN0cmluZywgcmVFc2NhcGVDaGFyLCAnJDEnKSA6IG51bWJlciB8fCBtYXRjaDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuLyogZW5kIGFkYXB0YXRpb24gKi9cblxudmFyIGdldEJhc2VJbnRyaW5zaWMgPSBmdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljTmFtZSA9IG5hbWU7XG5cdHZhciBhbGlhcztcblx0aWYgKGhhc093bihMRUdBQ1lfQUxJQVNFUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHRhbGlhcyA9IExFR0FDWV9BTElBU0VTW2ludHJpbnNpY05hbWVdO1xuXHRcdGludHJpbnNpY05hbWUgPSAnJScgKyBhbGlhc1swXSArICclJztcblx0fVxuXG5cdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljTmFtZSkpIHtcblx0XHR2YXIgdmFsdWUgPSBJTlRSSU5TSUNTW2ludHJpbnNpY05hbWVdO1xuXHRcdGlmICh2YWx1ZSA9PT0gbmVlZHNFdmFsKSB7XG5cdFx0XHR2YWx1ZSA9IGRvRXZhbChpbnRyaW5zaWNOYW1lKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFsaWFzOiBhbGlhcyxcblx0XHRcdG5hbWU6IGludHJpbnNpY05hbWUsXG5cdFx0XHR2YWx1ZTogdmFsdWVcblx0XHR9O1xuXHR9XG5cblx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2ludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImFsbG93TWlzc2luZ1wiIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHRpZiAoJGV4ZWMoL14lP1teJV0qJT8kLywgbmFtZSkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lJyk7XG5cdH1cblx0dmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuXHR2YXIgaW50cmluc2ljQmFzZU5hbWUgPSBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJztcblxuXHR2YXIgaW50cmluc2ljID0gZ2V0QmFzZUludHJpbnNpYygnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJywgYWxsb3dNaXNzaW5nKTtcblx0dmFyIGludHJpbnNpY1JlYWxOYW1lID0gaW50cmluc2ljLm5hbWU7XG5cdHZhciB2YWx1ZSA9IGludHJpbnNpYy52YWx1ZTtcblx0dmFyIHNraXBGdXJ0aGVyQ2FjaGluZyA9IGZhbHNlO1xuXG5cdHZhciBhbGlhcyA9IGludHJpbnNpYy5hbGlhcztcblx0aWYgKGFsaWFzKSB7XG5cdFx0aW50cmluc2ljQmFzZU5hbWUgPSBhbGlhc1swXTtcblx0XHQkc3BsaWNlQXBwbHkocGFydHMsICRjb25jYXQoWzAsIDFdLCBhbGlhcykpO1xuXHR9XG5cblx0Zm9yICh2YXIgaSA9IDEsIGlzT3duID0gdHJ1ZTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0dmFyIHBhcnQgPSBwYXJ0c1tpXTtcblx0XHR2YXIgZmlyc3QgPSAkc3RyU2xpY2UocGFydCwgMCwgMSk7XG5cdFx0dmFyIGxhc3QgPSAkc3RyU2xpY2UocGFydCwgLTEpO1xuXHRcdGlmIChcblx0XHRcdChcblx0XHRcdFx0KGZpcnN0ID09PSAnXCInIHx8IGZpcnN0ID09PSBcIidcIiB8fCBmaXJzdCA9PT0gJ2AnKVxuXHRcdFx0XHR8fCAobGFzdCA9PT0gJ1wiJyB8fCBsYXN0ID09PSBcIidcIiB8fCBsYXN0ID09PSAnYCcpXG5cdFx0XHQpXG5cdFx0XHQmJiBmaXJzdCAhPT0gbGFzdFxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcigncHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcycpO1xuXHRcdH1cblx0XHRpZiAocGFydCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhaXNPd24pIHtcblx0XHRcdHNraXBGdXJ0aGVyQ2FjaGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aW50cmluc2ljQmFzZU5hbWUgKz0gJy4nICsgcGFydDtcblx0XHRpbnRyaW5zaWNSZWFsTmFtZSA9ICclJyArIGludHJpbnNpY0Jhc2VOYW1lICsgJyUnO1xuXG5cdFx0aWYgKGhhc093bihJTlRSSU5TSUNTLCBpbnRyaW5zaWNSZWFsTmFtZSkpIHtcblx0XHRcdHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07XG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRpZiAoIShwYXJ0IGluIHZhbHVlKSkge1xuXHRcdFx0XHRpZiAoIWFsbG93TWlzc2luZykge1xuXHRcdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2b2lkIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGlmICgkZ09QRCAmJiAoaSArIDEpID49IHBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHR2YXIgZGVzYyA9ICRnT1BEKHZhbHVlLCBwYXJ0KTtcblx0XHRcdFx0aXNPd24gPSAhIWRlc2M7XG5cblx0XHRcdFx0Ly8gQnkgY29udmVudGlvbiwgd2hlbiBhIGRhdGEgcHJvcGVydHkgaXMgY29udmVydGVkIHRvIGFuIGFjY2Vzc29yXG5cdFx0XHRcdC8vIHByb3BlcnR5IHRvIGVtdWxhdGUgYSBkYXRhIHByb3BlcnR5IHRoYXQgZG9lcyBub3Qgc3VmZmVyIGZyb21cblx0XHRcdFx0Ly8gdGhlIG92ZXJyaWRlIG1pc3Rha2UsIHRoYXQgYWNjZXNzb3IncyBnZXR0ZXIgaXMgbWFya2VkIHdpdGhcblx0XHRcdFx0Ly8gYW4gYG9yaWdpbmFsVmFsdWVgIHByb3BlcnR5LiBIZXJlLCB3aGVuIHdlIGRldGVjdCB0aGlzLCB3ZVxuXHRcdFx0XHQvLyB1cGhvbGQgdGhlIGlsbHVzaW9uIGJ5IHByZXRlbmRpbmcgdG8gc2VlIHRoYXQgb3JpZ2luYWwgZGF0YVxuXHRcdFx0XHQvLyBwcm9wZXJ0eSwgaS5lLiwgcmV0dXJuaW5nIHRoZSB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgZ2V0dGVyXG5cdFx0XHRcdC8vIGl0c2VsZi5cblx0XHRcdFx0aWYgKGlzT3duICYmICdnZXQnIGluIGRlc2MgJiYgISgnb3JpZ2luYWxWYWx1ZScgaW4gZGVzYy5nZXQpKSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBkZXNjLmdldDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpc093biA9IGhhc093bih2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbcGFydF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc093biAmJiAhc2tpcEZ1cnRoZXJDYWNoaW5nKSB7XG5cdFx0XHRcdElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG52YXIgJGRlZmluZVByb3BlcnR5ID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmRlZmluZVByb3BlcnR5JScsIHRydWUpIHx8IGZhbHNlO1xuaWYgKCRkZWZpbmVQcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdCRkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IHZhbHVlOiAxIH0pO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSUUgOCBoYXMgYSBicm9rZW4gZGVmaW5lUHJvcGVydHlcblx0XHQkZGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9ICRkZWZpbmVQcm9wZXJ0eTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyICRnT1BEID0gR2V0SW50cmluc2ljKCclT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUnLCB0cnVlKTtcblxuaWYgKCRnT1BEKSB7XG5cdHRyeSB7XG5cdFx0JGdPUEQoW10sICdsZW5ndGgnKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGdPUERcblx0XHQkZ09QRCA9IG51bGw7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAkZ09QRDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgJFN5bnRheEVycm9yID0gcmVxdWlyZSgnZXMtZXJyb3JzL3N5bnRheCcpO1xudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xuXG52YXIgZ29wZCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKX0gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lRGF0YVByb3BlcnR5KFxuXHRvYmosXG5cdHByb3BlcnR5LFxuXHR2YWx1ZVxuKSB7XG5cdGlmICghb2JqIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgb2JqYCBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uYCcpO1xuXHR9XG5cdGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ3N5bWJvbCcpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYHByb3BlcnR5YCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sYCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzNdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25FbnVtZXJhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwnKTtcblx0fVxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgdHlwZW9mIGFyZ3VtZW50c1s0XSAhPT0gJ2Jvb2xlYW4nICYmIGFyZ3VtZW50c1s0XSAhPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgbm9uV3JpdGFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNSAmJiB0eXBlb2YgYXJndW1lbnRzWzVdICE9PSAnYm9vbGVhbicgJiYgYXJndW1lbnRzWzVdICE9PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Bub25Db25maWd1cmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCcpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gNiAmJiB0eXBlb2YgYXJndW1lbnRzWzZdICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYGxvb3NlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuJyk7XG5cdH1cblxuXHR2YXIgbm9uRW51bWVyYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblx0dmFyIG5vbldyaXRhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgPyBhcmd1bWVudHNbNF0gOiBudWxsO1xuXHR2YXIgbm9uQ29uZmlndXJhYmxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgPyBhcmd1bWVudHNbNV0gOiBudWxsO1xuXHR2YXIgbG9vc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gNiA/IGFyZ3VtZW50c1s2XSA6IGZhbHNlO1xuXG5cdC8qIEB0eXBlIHtmYWxzZSB8IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+fSAqL1xuXHR2YXIgZGVzYyA9ICEhZ29wZCAmJiBnb3BkKG9iaiwgcHJvcGVydHkpO1xuXG5cdGlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0XHQkZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eSwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiBub25Db25maWd1cmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuY29uZmlndXJhYmxlIDogIW5vbkNvbmZpZ3VyYWJsZSxcblx0XHRcdGVudW1lcmFibGU6IG5vbkVudW1lcmFibGUgPT09IG51bGwgJiYgZGVzYyA/IGRlc2MuZW51bWVyYWJsZSA6ICFub25FbnVtZXJhYmxlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IG5vbldyaXRhYmxlID09PSBudWxsICYmIGRlc2MgPyBkZXNjLndyaXRhYmxlIDogIW5vbldyaXRhYmxlXG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAobG9vc2UgfHwgKCFub25FbnVtZXJhYmxlICYmICFub25Xcml0YWJsZSAmJiAhbm9uQ29uZmlndXJhYmxlKSkge1xuXHRcdC8vIG11c3QgZmFsbCBiYWNrIHRvIFtbU2V0XV0sIGFuZCB3YXMgbm90IGV4cGxpY2l0bHkgYXNrZWQgdG8gbWFrZSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tY29uZmlndXJhYmxlXG5cdFx0b2JqW3Byb3BlcnR5XSA9IHZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlZmluaW5nIGEgcHJvcGVydHkgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tZW51bWVyYWJsZS4nKTtcblx0fVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xuXG52YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9ycyA9IGZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKSB7XG5cdHJldHVybiAhISRkZWZpbmVQcm9wZXJ0eTtcbn07XG5cbmhhc1Byb3BlcnR5RGVzY3JpcHRvcnMuaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcgPSBmdW5jdGlvbiBoYXNBcnJheUxlbmd0aERlZmluZUJ1ZygpIHtcblx0Ly8gbm9kZSB2MC42IGhhcyBhIGJ1ZyB3aGVyZSBhcnJheSBsZW5ndGhzIGNhbiBiZSBTZXQgYnV0IG5vdCBEZWZpbmVkXG5cdGlmICghJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0dHJ5IHtcblx0XHRyZXR1cm4gJGRlZmluZVByb3BlcnR5KFtdLCAnbGVuZ3RoJywgeyB2YWx1ZTogMSB9KS5sZW5ndGggIT09IDE7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBGaXJlZm94IDQtMjIsIGRlZmluaW5nIGxlbmd0aCBvbiBhbiBhcnJheSB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLWRhdGEtcHJvcGVydHknKTtcbnZhciBoYXNEZXNjcmlwdG9ycyA9IHJlcXVpcmUoJ2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpKCk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJ2dvcGQnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRmbG9vciA9IEdldEludHJpbnNpYygnJU1hdGguZmxvb3IlJyk7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldEZ1bmN0aW9uTGVuZ3RoKGZuLCBsZW5ndGgpIHtcblx0aWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG5cdH1cblx0aWYgKHR5cGVvZiBsZW5ndGggIT09ICdudW1iZXInIHx8IGxlbmd0aCA8IDAgfHwgbGVuZ3RoID4gMHhGRkZGRkZGRiB8fCAkZmxvb3IobGVuZ3RoKSAhPT0gbGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2BsZW5ndGhgIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlcicpO1xuXHR9XG5cblx0dmFyIGxvb3NlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgISFhcmd1bWVudHNbMl07XG5cblx0dmFyIGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgPSB0cnVlO1xuXHR2YXIgZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlID0gdHJ1ZTtcblx0aWYgKCdsZW5ndGgnIGluIGZuICYmIGdPUEQpIHtcblx0XHR2YXIgZGVzYyA9IGdPUEQoZm4sICdsZW5ndGgnKTtcblx0XHRpZiAoZGVzYyAmJiAhZGVzYy5jb25maWd1cmFibGUpIHtcblx0XHRcdGZ1bmN0aW9uTGVuZ3RoSXNDb25maWd1cmFibGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGRlc2MgJiYgIWRlc2Mud3JpdGFibGUpIHtcblx0XHRcdGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlIHx8IGZ1bmN0aW9uTGVuZ3RoSXNXcml0YWJsZSB8fCAhbG9vc2UpIHtcblx0XHRpZiAoaGFzRGVzY3JpcHRvcnMpIHtcblx0XHRcdGRlZmluZSgvKiogQHR5cGUge1BhcmFtZXRlcnM8ZGVmaW5lPlswXX0gKi8gKGZuKSwgJ2xlbmd0aCcsIGxlbmd0aCwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlZmluZSgvKiogQHR5cGUge1BhcmFtZXRlcnM8ZGVmaW5lPlswXX0gKi8gKGZuKSwgJ2xlbmd0aCcsIGxlbmd0aCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcbnZhciBzZXRGdW5jdGlvbkxlbmd0aCA9IHJlcXVpcmUoJ3NldC1mdW5jdGlvbi1sZW5ndGgnKTtcblxudmFyICRUeXBlRXJyb3IgPSByZXF1aXJlKCdlcy1lcnJvcnMvdHlwZScpO1xudmFyICRhcHBseSA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSUnKTtcbnZhciAkY2FsbCA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJScpO1xudmFyICRyZWZsZWN0QXBwbHkgPSBHZXRJbnRyaW5zaWMoJyVSZWZsZWN0LmFwcGx5JScsIHRydWUpIHx8IGJpbmQuY2FsbCgkY2FsbCwgJGFwcGx5KTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJ2VzLWRlZmluZS1wcm9wZXJ0eScpO1xudmFyICRtYXggPSBHZXRJbnRyaW5zaWMoJyVNYXRoLm1heCUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQmluZChvcmlnaW5hbEZ1bmN0aW9uKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ2luYWxGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblx0dmFyIGZ1bmMgPSAkcmVmbGVjdEFwcGx5KGJpbmQsICRjYWxsLCBhcmd1bWVudHMpO1xuXHRyZXR1cm4gc2V0RnVuY3Rpb25MZW5ndGgoXG5cdFx0ZnVuYyxcblx0XHQxICsgJG1heCgwLCBvcmlnaW5hbEZ1bmN0aW9uLmxlbmd0aCAtIChhcmd1bWVudHMubGVuZ3RoIC0gMSkpLFxuXHRcdHRydWVcblx0KTtcbn07XG5cbnZhciBhcHBseUJpbmQgPSBmdW5jdGlvbiBhcHBseUJpbmQoKSB7XG5cdHJldHVybiAkcmVmbGVjdEFwcGx5KGJpbmQsICRhcHBseSwgYXJndW1lbnRzKTtcbn07XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0JGRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYXBwbHknLCB7IHZhbHVlOiBhcHBseUJpbmQgfSk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cy5hcHBseSA9IGFwcGx5QmluZDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJ2dldC1pbnRyaW5zaWMnKTtcblxudmFyIGNhbGxCaW5kID0gcmVxdWlyZSgnLi8nKTtcblxudmFyICRpbmRleE9mID0gY2FsbEJpbmQoR2V0SW50cmluc2ljKCdTdHJpbmcucHJvdG90eXBlLmluZGV4T2YnKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY2FsbEJvdW5kSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuXHR2YXIgaW50cmluc2ljID0gR2V0SW50cmluc2ljKG5hbWUsICEhYWxsb3dNaXNzaW5nKTtcblx0aWYgKHR5cGVvZiBpbnRyaW5zaWMgPT09ICdmdW5jdGlvbicgJiYgJGluZGV4T2YobmFtZSwgJy5wcm90b3R5cGUuJykgPiAtMSkge1xuXHRcdHJldHVybiBjYWxsQmluZChpbnRyaW5zaWMpO1xuXHR9XG5cdHJldHVybiBpbnRyaW5zaWM7XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQge30iLCJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlO1xudmFyIHdlYWtNYXBIYXMgPSBoYXNXZWFrTWFwID8gV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgJiYgV2Vha1NldC5wcm90b3R5cGU7XG52YXIgd2Vha1NldEhhcyA9IGhhc1dlYWtTZXQgPyBXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtSZWYgPSB0eXBlb2YgV2Vha1JlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrUmVmLnByb3RvdHlwZTtcbnZhciB3ZWFrUmVmRGVyZWYgPSBoYXNXZWFrUmVmID8gV2Vha1JlZi5wcm90b3R5cGUuZGVyZWYgOiBudWxsO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciAkbWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xudmFyICRzbGljZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2U7XG52YXIgJHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgJHRvVXBwZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZTtcbnZhciAkdG9Mb3dlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlO1xudmFyICR0ZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xudmFyICRjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyICRqb2luID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG52YXIgJGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xudmFyIGdPUFMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIHN5bVRvU3RyaW5nID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgOiBudWxsO1xudmFyIGhhc1NoYW1tZWRTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnb2JqZWN0Jztcbi8vIGllLCBgaGFzLXRvc3RyaW5ndGFnL3NoYW1zXG52YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gaGFzU2hhbW1lZFN5bWJvbHMgPyAnb2JqZWN0JyA6ICdzeW1ib2wnKVxuICAgID8gU3ltYm9sLnRvU3RyaW5nVGFnXG4gICAgOiBudWxsO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBnUE8gPSAodHlwZW9mIFJlZmxlY3QgPT09ICdmdW5jdGlvbicgPyBSZWZsZWN0LmdldFByb3RvdHlwZU9mIDogT2JqZWN0LmdldFByb3RvdHlwZU9mKSB8fCAoXG4gICAgW10uX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICA/IGZ1bmN0aW9uIChPKSB7XG4gICAgICAgICAgICByZXR1cm4gTy5fX3Byb3RvX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgfVxuICAgICAgICA6IG51bGxcbik7XG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLCBzdHIpIHtcbiAgICBpZiAoXG4gICAgICAgIG51bSA9PT0gSW5maW5pdHlcbiAgICAgICAgfHwgbnVtID09PSAtSW5maW5pdHlcbiAgICAgICAgfHwgbnVtICE9PSBudW1cbiAgICAgICAgfHwgKG51bSAmJiBudW0gPiAtMTAwMCAmJiBudW0gPCAxMDAwKVxuICAgICAgICB8fCAkdGVzdC5jYWxsKC9lLywgc3RyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICB2YXIgc2VwUmVnZXggPSAvWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO1xuICAgIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgaW50ID0gbnVtIDwgMCA/IC0kZmxvb3IoLW51bSkgOiAkZmxvb3IobnVtKTsgLy8gdHJ1bmMobnVtKVxuICAgICAgICBpZiAoaW50ICE9PSBudW0pIHtcbiAgICAgICAgICAgIHZhciBpbnRTdHIgPSBTdHJpbmcoaW50KTtcbiAgICAgICAgICAgIHZhciBkZWMgPSAkc2xpY2UuY2FsbChzdHIsIGludFN0ci5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKGludFN0ciwgc2VwUmVnZXgsICckJl8nKSArICcuJyArICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChkZWMsIC8oWzAtOV17M30pL2csICckJl8nKSwgL18kLywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHN0ciwgc2VwUmVnZXgsICckJl8nKTtcbn1cblxudmFyIHV0aWxJbnNwZWN0ID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgKG9wdHMucXVvdGVTdHlsZSAhPT0gJ3NpbmdsZScgJiYgb3B0cy5xdW90ZVN0eWxlICE9PSAnZG91YmxlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIGlmIChtYXBGb3JFYWNoKSB7XG4gICAgICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIGlmIChzZXRGb3JFYWNoKSB7XG4gICAgICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0cy5wdXNoKGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignU2V0Jywgc2V0U2l6ZS5jYWxsKG9iaiksIHNldFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrTWFwKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtNYXAnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1NldChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrU2V0Jyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1JlZicpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICAvLyBub3RlOiBpbiBJRSA4LCBzb21ldGltZXMgYGdsb2JhbCAhPT0gd2luZG93YCBidXQgYm90aCBhcmUgdGhlIHByb3RvdHlwZXMgb2YgZWFjaCBvdGhlclxuICAgIC8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBvYmogPT09IHdpbmRvdykge1xuICAgICAgICByZXR1cm4gJ3sgW29iamVjdCBXaW5kb3ddIH0nO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWxUaGlzKVxuICAgICAgICB8fCAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgb2JqID09PSBnbG9iYWwpXG4gICAgKSB7XG4gICAgICAgIHJldHVybiAneyBbb2JqZWN0IGdsb2JhbFRoaXNdIH0nO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgcXVvdGVDaGFyID0gKG9wdHMucXVvdGVTdHlsZSB8fCBkZWZhdWx0U3R5bGUpID09PSAnZG91YmxlJyA/ICdcIicgOiBcIidcIjtcbiAgICByZXR1cm4gcXVvdGVDaGFyICsgcyArIHF1b3RlQ2hhcjtcbn1cblxuZnVuY3Rpb24gcXVvdGUocykge1xuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKFN0cmluZyhzKSwgL1wiL2csICcmcXVvdDsnKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgdmFyIHMgPSAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoc3RyLCAvKFsnXFxcXF0pL2csICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdnZXQtaW50cmluc2ljJyk7XG52YXIgY2FsbEJvdW5kID0gcmVxdWlyZSgnY2FsbC1iaW5kL2NhbGxCb3VuZCcpO1xudmFyIGluc3BlY3QgPSByZXF1aXJlKCdvYmplY3QtaW5zcGVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IHJlcXVpcmUoJ2VzLWVycm9ycy90eXBlJyk7XG52YXIgJFdlYWtNYXAgPSBHZXRJbnRyaW5zaWMoJyVXZWFrTWFwJScsIHRydWUpO1xudmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cbnZhciAkd2Vha01hcEdldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBTZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xudmFyICR3ZWFrTWFwSGFzID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcbnZhciAkbWFwR2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xudmFyICRtYXBTZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJG1hcEhhcyA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcblxuLypcbiogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGxpc3QgcmV0dXJuaW5nIHRoZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleS5cbipcbiogVGhhdCBub2RlIGlzIGFsc28gbW92ZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXQgaWYgaXQncyBhY2Nlc3NlZCBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIHRyYXZlcnNlIHRoZSB3aG9sZSBsaXN0LiBCeSBkb2luZyBzbywgYWxsIHRoZSByZWNlbnRseSB1c2VkIG5vZGVzIGNhbiBiZSBhY2Nlc3NlZCByZWxhdGl2ZWx5IHF1aWNrbHkuXG4qL1xuLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5saXN0R2V0Tm9kZX0gKi9cbnZhciBsaXN0R2V0Tm9kZSA9IGZ1bmN0aW9uIChsaXN0LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHQvKiogQHR5cGUge3R5cGVvZiBsaXN0IHwgTm9uTnVsbGFibGU8KHR5cGVvZiBsaXN0KVsnbmV4dCddPn0gKi9cblx0dmFyIHByZXYgPSBsaXN0O1xuXHQvKiogQHR5cGUgeyh0eXBlb2YgbGlzdClbJ25leHQnXX0gKi9cblx0dmFyIGN1cnI7XG5cdGZvciAoOyAoY3VyciA9IHByZXYubmV4dCkgIT09IG51bGw7IHByZXYgPSBjdXJyKSB7XG5cdFx0aWYgKGN1cnIua2V5ID09PSBrZXkpIHtcblx0XHRcdHByZXYubmV4dCA9IGN1cnIubmV4dDtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1leHRyYS1wYXJlbnNcblx0XHRcdGN1cnIubmV4dCA9IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIGxpc3QubmV4dD59ICovIChsaXN0Lm5leHQpO1xuXHRcdFx0bGlzdC5uZXh0ID0gY3VycjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHRcdFx0cmV0dXJuIGN1cnI7XG5cdFx0fVxuXHR9XG59O1xuXG4vKiogQHR5cGUge2ltcG9ydCgnLicpLmxpc3RHZXR9ICovXG52YXIgbGlzdEdldCA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXkpIHtcblx0dmFyIG5vZGUgPSBsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xuXHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlO1xufTtcbi8qKiBAdHlwZSB7aW1wb3J0KCcuJykubGlzdFNldH0gKi9cbnZhciBsaXN0U2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSwgdmFsdWUpIHtcblx0dmFyIG5vZGUgPSBsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xuXHRpZiAobm9kZSkge1xuXHRcdG5vZGUudmFsdWUgPSB2YWx1ZTtcblx0fSBlbHNlIHtcblx0XHQvLyBQcmVwZW5kIHRoZSBuZXcgbm9kZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cdFx0b2JqZWN0cy5uZXh0ID0gLyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5MaXN0Tm9kZTx0eXBlb2YgdmFsdWU+fSAqLyAoeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduLCBuby1leHRyYS1wYXJlbnNcblx0XHRcdGtleToga2V5LFxuXHRcdFx0bmV4dDogb2JqZWN0cy5uZXh0LFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fSk7XG5cdH1cbn07XG4vKiogQHR5cGUge2ltcG9ydCgnLicpLmxpc3RIYXN9ICovXG52YXIgbGlzdEhhcyA9IGZ1bmN0aW9uIChvYmplY3RzLCBrZXkpIHtcblx0cmV0dXJuICEhbGlzdEdldE5vZGUob2JqZWN0cywga2V5KTtcbn07XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuJyl9ICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFNpZGVDaGFubmVsKCkge1xuXHQvKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCB1bmtub3duPn0gKi8gdmFyICR3bTtcblx0LyoqIEB0eXBlIHtNYXA8b2JqZWN0LCB1bmtub3duPn0gKi8gdmFyICRtO1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLicpLlJvb3ROb2RlPHVua25vd24+fSAqLyB2YXIgJG87XG5cblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4nKS5DaGFubmVsfSAqL1xuXHR2YXIgY2hhbm5lbCA9IHtcblx0XHRhc3NlcnQ6IGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdGlmICghY2hhbm5lbC5oYXMoa2V5KSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignU2lkZSBjaGFubmVsIGRvZXMgbm90IGNvbnRhaW4gJyArIGluc3BlY3Qoa2V5KSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRnZXQ6IGZ1bmN0aW9uIChrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0aWYgKCR3bSkge1xuXHRcdFx0XHRcdHJldHVybiAkd2Vha01hcEdldCgkd20sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoJE1hcCkge1xuXHRcdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0XHRyZXR1cm4gJG1hcEdldCgkbSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCRvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbG9uZWx5LWlmXG5cdFx0XHRcdFx0cmV0dXJuIGxpc3RHZXQoJG8sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGhhczogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0aWYgKCR3bSkge1xuXHRcdFx0XHRcdHJldHVybiAkd2Vha01hcEhhcygkd20sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoJE1hcCkge1xuXHRcdFx0XHRpZiAoJG0pIHtcblx0XHRcdFx0XHRyZXR1cm4gJG1hcEhhcygkbSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCRvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbG9uZWx5LWlmXG5cdFx0XHRcdFx0cmV0dXJuIGxpc3RIYXMoJG8sIGtleSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdGlmICgkV2Vha01hcCAmJiBrZXkgJiYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpKSB7XG5cdFx0XHRcdGlmICghJHdtKSB7XG5cdFx0XHRcdFx0JHdtID0gbmV3ICRXZWFrTWFwKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JHdlYWtNYXBTZXQoJHdtLCBrZXksIHZhbHVlKTtcblx0XHRcdH0gZWxzZSBpZiAoJE1hcCkge1xuXHRcdFx0XHRpZiAoISRtKSB7XG5cdFx0XHRcdFx0JG0gPSBuZXcgJE1hcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCRtYXBTZXQoJG0sIGtleSwgdmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCEkbykge1xuXHRcdFx0XHRcdC8vIEluaXRpYWxpemUgdGhlIGxpbmtlZCBsaXN0IGFzIGFuIGVtcHR5IG5vZGUsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2YgdGhlIGZpcnN0IG5vZGU6IHdlIGNhbiBhbHdheXMgcmVmZXIgdG8gaXQgYXMgKHByZXZpb3VzIG5vZGUpLm5leHQsIGluc3RlYWQgb2Ygc29tZXRoaW5nIGxpa2UgKGxpc3QpLmhlYWRcblx0XHRcdFx0XHQkbyA9IHsga2V5OiB7fSwgbmV4dDogbnVsbCB9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxpc3RTZXQoJG8sIGtleSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0cmV0dXJuIGNoYW5uZWw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbnZhciBGb3JtYXQgPSB7XG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2RlZmF1bHQnOiBGb3JtYXQuUkZDMzk4NixcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiBGb3JtYXQuUkZDMTczOCxcbiAgICBSRkMzOTg2OiBGb3JtYXQuUkZDMzk4NlxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgLyogZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOiAwICovXG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyAmJiAob3B0aW9ucy5wbGFpbk9iamVjdHMgfHwgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpKSB8fCAhaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVjb2RlciwgY2hhcnNldCkge1xuICAgIHZhciBzdHJXaXRob3V0UGx1cyA9IHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIC8vIHVuZXNjYXBlIG5ldmVyIHRocm93cywgbm8gdHJ5Li4uY2F0Y2ggbmVlZGVkOlxuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXMucmVwbGFjZSgvJVswLTlhLWZdezJ9L2dpLCB1bmVzY2FwZSk7XG4gICAgfVxuICAgIC8vIHV0Zi04XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJXaXRob3V0UGx1cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXM7XG4gICAgfVxufTtcblxudmFyIGxpbWl0ID0gMTAyNDtcblxuLyogZXNsaW50IG9wZXJhdG9yLWxpbmVicmVhazogWzIsIFwiYmVmb3JlXCJdICovXG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyLCBkZWZhdWx0RW5jb2RlciwgY2hhcnNldCwga2luZCwgZm9ybWF0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSBzdHI7XG4gICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHN0cmluZyA9IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzdHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyaW5nID0gU3RyaW5nKHN0cik7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0cmluZy5sZW5ndGg7IGogKz0gbGltaXQpIHtcbiAgICAgICAgdmFyIHNlZ21lbnQgPSBzdHJpbmcubGVuZ3RoID49IGxpbWl0ID8gc3RyaW5nLnNsaWNlKGosIGogKyBsaW1pdCkgOiBzdHJpbmc7XG4gICAgICAgIHZhciBhcnIgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlZ21lbnQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBjID0gc2VnbWVudC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgICAgIHx8IGMgPT09IDB4MkUgLy8gLlxuICAgICAgICAgICAgICAgIHx8IGMgPT09IDB4NUYgLy8gX1xuICAgICAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgICAgIHx8IChjID49IDB4MzAgJiYgYyA8PSAweDM5KSAvLyAwLTlcbiAgICAgICAgICAgICAgICB8fCAoYyA+PSAweDQxICYmIGMgPD0gMHg1QSkgLy8gYS16XG4gICAgICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICAgICAgICAgIHx8IChmb3JtYXQgPT09IGZvcm1hdHMuUkZDMTczOCAmJiAoYyA9PT0gMHgyOCB8fCBjID09PSAweDI5KSkgLy8gKCApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBzZWdtZW50LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICAgICAgYXJyW2Fyci5sZW5ndGhdID0gaGV4VGFibGVbY107XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVsweEMwIHwgKGMgPj4gNildXG4gICAgICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgICAgIGFyclthcnIubGVuZ3RoXSA9IGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildXG4gICAgICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzZWdtZW50LmNoYXJDb2RlQXQoaSkgJiAweDNGRikpO1xuXG4gICAgICAgICAgICBhcnJbYXJyLmxlbmd0aF0gPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXVxuICAgICAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKV1cbiAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dCArPSBhcnIuam9pbignJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbnZhciBjb21wYWN0ID0gZnVuY3Rpb24gY29tcGFjdCh2YWx1ZSkge1xuICAgIHZhciBxdWV1ZSA9IFt7IG9iajogeyBvOiB2YWx1ZSB9LCBwcm9wOiAnbycgfV07XG4gICAgdmFyIHJlZnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZVtpXTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiByZWZzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqOiBvYmosIHByb3A6IGtleSB9KTtcbiAgICAgICAgICAgICAgICByZWZzLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhIShvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopKTtcbn07XG5cbnZhciBjb21iaW5lID0gZnVuY3Rpb24gY29tYmluZShhLCBiKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhLCBiKTtcbn07XG5cbnZhciBtYXliZU1hcCA9IGZ1bmN0aW9uIG1heWJlTWFwKHZhbCwgZm4pIHtcbiAgICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIG1hcHBlZC5wdXNoKGZuKHZhbFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICAgIHJldHVybiBmbih2YWwpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21iaW5lOiBjb21iaW5lLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtYXliZU1hcDogbWF5YmVNYXAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0U2lkZUNoYW5uZWwgPSByZXF1aXJlKCdzaWRlLWNoYW5uZWwnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGFycmF5UHJlZml4R2VuZXJhdG9ycyA9IHtcbiAgICBicmFja2V0czogZnVuY3Rpb24gYnJhY2tldHMocHJlZml4KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnW10nO1xuICAgIH0sXG4gICAgY29tbWE6ICdjb21tYScsXG4gICAgaW5kaWNlczogZnVuY3Rpb24gaW5kaWNlcyhwcmVmaXgsIGtleSkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1snICsga2V5ICsgJ10nO1xuICAgIH0sXG4gICAgcmVwZWF0OiBmdW5jdGlvbiByZXBlYXQocHJlZml4KSB7XG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaDtcbnZhciBwdXNoVG9BcnJheSA9IGZ1bmN0aW9uIChhcnIsIHZhbHVlT3JBcnJheSkge1xuICAgIHB1c2guYXBwbHkoYXJyLCBpc0FycmF5KHZhbHVlT3JBcnJheSkgPyB2YWx1ZU9yQXJyYXkgOiBbdmFsdWVPckFycmF5XSk7XG59O1xuXG52YXIgdG9JU08gPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcblxudmFyIGRlZmF1bHRGb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWRkUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dFbXB0eUFycmF5czogZmFsc2UsXG4gICAgYXJyYXlGb3JtYXQ6ICdpbmRpY2VzJyxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZURvdEluS2V5czogZmFsc2UsXG4gICAgZW5jb2RlcjogdXRpbHMuZW5jb2RlLFxuICAgIGVuY29kZVZhbHVlc09ubHk6IGZhbHNlLFxuICAgIGZvcm1hdDogZGVmYXVsdEZvcm1hdCxcbiAgICBmb3JtYXR0ZXI6IGZvcm1hdHMuZm9ybWF0dGVyc1tkZWZhdWx0Rm9ybWF0XSxcbiAgICAvLyBkZXByZWNhdGVkXG4gICAgaW5kaWNlczogZmFsc2UsXG4gICAgc2VyaWFsaXplRGF0ZTogZnVuY3Rpb24gc2VyaWFsaXplRGF0ZShkYXRlKSB7XG4gICAgICAgIHJldHVybiB0b0lTTy5jYWxsKGRhdGUpO1xuICAgIH0sXG4gICAgc2tpcE51bGxzOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlXG59O1xuXG52YXIgaXNOb25OdWxsaXNoUHJpbWl0aXZlID0gZnVuY3Rpb24gaXNOb25OdWxsaXNoUHJpbWl0aXZlKHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnbnVtYmVyJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgIHx8IHR5cGVvZiB2ID09PSAnc3ltYm9sJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ2JpZ2ludCc7XG59O1xuXG52YXIgc2VudGluZWwgPSB7fTtcblxudmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShcbiAgICBvYmplY3QsXG4gICAgcHJlZml4LFxuICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgY29tbWFSb3VuZFRyaXAsXG4gICAgYWxsb3dFbXB0eUFycmF5cyxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgc2tpcE51bGxzLFxuICAgIGVuY29kZURvdEluS2V5cyxcbiAgICBlbmNvZGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0LFxuICAgIGFsbG93RG90cyxcbiAgICBzZXJpYWxpemVEYXRlLFxuICAgIGZvcm1hdCxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICBjaGFyc2V0LFxuICAgIHNpZGVDaGFubmVsXG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuXG4gICAgdmFyIHRtcFNjID0gc2lkZUNoYW5uZWw7XG4gICAgdmFyIHN0ZXAgPSAwO1xuICAgIHZhciBmaW5kRmxhZyA9IGZhbHNlO1xuICAgIHdoaWxlICgodG1wU2MgPSB0bXBTYy5nZXQoc2VudGluZWwpKSAhPT0gdm9pZCB1bmRlZmluZWQgJiYgIWZpbmRGbGFnKSB7XG4gICAgICAgIC8vIFdoZXJlIG9iamVjdCBsYXN0IGFwcGVhcmVkIGluIHRoZSByZWYgdHJlZVxuICAgICAgICB2YXIgcG9zID0gdG1wU2MuZ2V0KG9iamVjdCk7XG4gICAgICAgIHN0ZXAgKz0gMTtcbiAgICAgICAgaWYgKHR5cGVvZiBwb3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAocG9zID09PSBzdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0N5Y2xpYyBvYmplY3QgdmFsdWUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluZEZsYWcgPSB0cnVlOyAvLyBCcmVhayB3aGlsZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdG1wU2MuZ2V0KHNlbnRpbmVsKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN0ZXAgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqID0gZmlsdGVyKHByZWZpeCwgb2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb2JqID0gc2VyaWFsaXplRGF0ZShvYmopO1xuICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBpc0FycmF5KG9iaikpIHtcbiAgICAgICAgb2JqID0gdXRpbHMubWF5YmVNYXAob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHN0cmljdE51bGxIYW5kbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIgJiYgIWVuY29kZVZhbHVlc09ubHkgPyBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCkgOiBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICBvYmogPSAnJztcbiAgICB9XG5cbiAgICBpZiAoaXNOb25OdWxsaXNoUHJpbWl0aXZlKG9iaikgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0LCAna2V5JywgZm9ybWF0KTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ3ZhbHVlJywgZm9ybWF0KSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbZm9ybWF0dGVyKHByZWZpeCkgKyAnPScgKyBmb3JtYXR0ZXIoU3RyaW5nKG9iaikpXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBpc0FycmF5KG9iaikpIHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBqb2luIGVsZW1lbnRzIGluXG4gICAgICAgIGlmIChlbmNvZGVWYWx1ZXNPbmx5ICYmIGVuY29kZXIpIHtcbiAgICAgICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZW5jb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgb2JqS2V5cyA9IFt7IHZhbHVlOiBvYmoubGVuZ3RoID4gMCA/IG9iai5qb2luKCcsJykgfHwgbnVsbCA6IHZvaWQgdW5kZWZpbmVkIH1dO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBvYmpLZXlzID0gc29ydCA/IGtleXMuc29ydChzb3J0KSA6IGtleXM7XG4gICAgfVxuXG4gICAgdmFyIGVuY29kZWRQcmVmaXggPSBlbmNvZGVEb3RJbktleXMgPyBwcmVmaXgucmVwbGFjZSgvXFwuL2csICclMkUnKSA6IHByZWZpeDtcblxuICAgIHZhciBhZGp1c3RlZFByZWZpeCA9IGNvbW1hUm91bmRUcmlwICYmIGlzQXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoID09PSAxID8gZW5jb2RlZFByZWZpeCArICdbXScgOiBlbmNvZGVkUHJlZml4O1xuXG4gICAgaWYgKGFsbG93RW1wdHlBcnJheXMgJiYgaXNBcnJheShvYmopICYmIG9iai5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGFkanVzdGVkUHJlZml4ICsgJ1tdJztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iaktleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbal07XG4gICAgICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkudmFsdWUgIT09ICd1bmRlZmluZWQnID8ga2V5LnZhbHVlIDogb2JqW2tleV07XG5cbiAgICAgICAgaWYgKHNraXBOdWxscyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5jb2RlZEtleSA9IGFsbG93RG90cyAmJiBlbmNvZGVEb3RJbktleXMgPyBrZXkucmVwbGFjZSgvXFwuL2csICclMkUnKSA6IGtleTtcbiAgICAgICAgdmFyIGtleVByZWZpeCA9IGlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyB0eXBlb2YgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2Z1bmN0aW9uJyA/IGdlbmVyYXRlQXJyYXlQcmVmaXgoYWRqdXN0ZWRQcmVmaXgsIGVuY29kZWRLZXkpIDogYWRqdXN0ZWRQcmVmaXhcbiAgICAgICAgICAgIDogYWRqdXN0ZWRQcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsgZW5jb2RlZEtleSA6ICdbJyArIGVuY29kZWRLZXkgKyAnXScpO1xuXG4gICAgICAgIHNpZGVDaGFubmVsLnNldChvYmplY3QsIHN0ZXApO1xuICAgICAgICB2YXIgdmFsdWVTaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgICAgIHZhbHVlU2lkZUNoYW5uZWwuc2V0KHNlbnRpbmVsLCBzaWRlQ2hhbm5lbCk7XG4gICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXlQcmVmaXgsXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBhbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5ICYmIGlzQXJyYXkob2JqKSA/IG51bGwgOiBlbmNvZGVyLFxuICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgY2hhcnNldCxcbiAgICAgICAgICAgIHZhbHVlU2lkZUNoYW5uZWxcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbnZhciBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuZW5jb2RlRG90SW5LZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZW5jb2RlRG90SW5LZXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmNvZGVyICE9PSBudWxsICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdHMuY2hhcnNldCB8fCBkZWZhdWx0cy5jaGFyc2V0O1xuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICghaGFzLmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXQgPSBvcHRzLmZvcm1hdDtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXG4gICAgdmFyIGZpbHRlciA9IGRlZmF1bHRzLmZpbHRlcjtcbiAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IGlzQXJyYXkob3B0cy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdHMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9IGRlZmF1bHRzLmFycmF5Rm9ybWF0O1xuICAgIH1cblxuICAgIGlmICgnY29tbWFSb3VuZFRyaXAnIGluIG9wdHMgJiYgdHlwZW9mIG9wdHMuY29tbWFSb3VuZFRyaXAgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgY29tbWFSb3VuZFRyaXBgIG11c3QgYmUgYSBib29sZWFuLCBvciBhYnNlbnQnKTtcbiAgICB9XG5cbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IG9wdHMuZW5jb2RlRG90SW5LZXlzID09PSB0cnVlID8gdHJ1ZSA6IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRRdWVyeVByZWZpeDogdHlwZW9mIG9wdHMuYWRkUXVlcnlQcmVmaXggPT09ICdib29sZWFuJyA/IG9wdHMuYWRkUXVlcnlQcmVmaXggOiBkZWZhdWx0cy5hZGRRdWVyeVByZWZpeCxcbiAgICAgICAgYWxsb3dEb3RzOiBhbGxvd0RvdHMsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheXM6IHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgPT09ICdib29sZWFuJyA/ICEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzIDogZGVmYXVsdHMuYWxsb3dFbXB0eUFycmF5cyxcbiAgICAgICAgYXJyYXlGb3JtYXQ6IGFycmF5Rm9ybWF0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hUm91bmRUcmlwOiBvcHRzLmNvbW1hUm91bmRUcmlwLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kZWxpbWl0ZXIgOiBvcHRzLmRlbGltaXRlcixcbiAgICAgICAgZW5jb2RlOiB0eXBlb2Ygb3B0cy5lbmNvZGUgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlIDogZGVmYXVsdHMuZW5jb2RlLFxuICAgICAgICBlbmNvZGVEb3RJbktleXM6IHR5cGVvZiBvcHRzLmVuY29kZURvdEluS2V5cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGVEb3RJbktleXMgOiBkZWZhdWx0cy5lbmNvZGVEb3RJbktleXMsXG4gICAgICAgIGVuY29kZXI6IHR5cGVvZiBvcHRzLmVuY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmVuY29kZXIgOiBkZWZhdWx0cy5lbmNvZGVyLFxuICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5OiB0eXBlb2Ygb3B0cy5lbmNvZGVWYWx1ZXNPbmx5ID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZVZhbHVlc09ubHkgOiBkZWZhdWx0cy5lbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICAgIGZvcm1hdHRlcjogZm9ybWF0dGVyLFxuICAgICAgICBzZXJpYWxpemVEYXRlOiB0eXBlb2Ygb3B0cy5zZXJpYWxpemVEYXRlID09PSAnZnVuY3Rpb24nID8gb3B0cy5zZXJpYWxpemVEYXRlIDogZGVmYXVsdHMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgc2tpcE51bGxzOiB0eXBlb2Ygb3B0cy5za2lwTnVsbHMgPT09ICdib29sZWFuJyA/IG9wdHMuc2tpcE51bGxzIDogZGVmYXVsdHMuc2tpcE51bGxzLFxuICAgICAgICBzb3J0OiB0eXBlb2Ygb3B0cy5zb3J0ID09PSAnZnVuY3Rpb24nID8gb3B0cy5zb3J0IDogbnVsbCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgb3B0cykge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpO1xuXG4gICAgdmFyIG9iaktleXM7XG4gICAgdmFyIGZpbHRlcjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaiA9IGZpbHRlcignJywgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob3B0aW9ucy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1tvcHRpb25zLmFycmF5Rm9ybWF0XTtcbiAgICB2YXIgY29tbWFSb3VuZFRyaXAgPSBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIG9wdGlvbnMuY29tbWFSb3VuZFRyaXA7XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc29ydCkge1xuICAgICAgICBvYmpLZXlzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgICB9XG5cbiAgICB2YXIgc2lkZUNoYW5uZWwgPSBnZXRTaWRlQ2hhbm5lbCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIGNvbW1hUm91bmRUcmlwLFxuICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBvcHRpb25zLnNraXBOdWxscyxcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlRG90SW5LZXlzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXQsXG4gICAgICAgICAgICBzaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGRlZmF1bHRzID0ge1xuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgYWxsb3dFbXB0eUFycmF5czogZmFsc2UsXG4gICAgYWxsb3dQcm90b3R5cGVzOiBmYWxzZSxcbiAgICBhbGxvd1NwYXJzZTogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hOiBmYWxzZSxcbiAgICBkZWNvZGVEb3RJbktleXM6IGZhbHNlLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBkdXBsaWNhdGVzOiAnY29tYmluZScsXG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogZmFsc2UsXG4gICAgcGFyYW1ldGVyTGltaXQ6IDEwMDAsXG4gICAgcGFyc2VBcnJheXM6IHRydWUsXG4gICAgcGxhaW5PYmplY3RzOiBmYWxzZSxcbiAgICBzdHJpY3REZXB0aDogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICB2YXIgY2xlYW5TdHIgPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID8gc3RyLnJlcGxhY2UoL15cXD8vLCAnJykgOiBzdHI7XG4gICAgY2xlYW5TdHIgPSBjbGVhblN0ci5yZXBsYWNlKC8lNUIvZ2ksICdbJykucmVwbGFjZSgvJTVEL2dpLCAnXScpO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICdrZXknKTtcbiAgICAgICAgICAgIHZhbCA9IHV0aWxzLm1heWJlTWFwKFxuICAgICAgICAgICAgICAgIHBhcnNlQXJyYXlWYWx1ZShwYXJ0LnNsaWNlKHBvcyArIDEpLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZW5jb2RlZFZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kZWNvZGVyKGVuY29kZWRWYWwsIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQsICd2YWx1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydC5pbmRleE9mKCdbXT0nKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWwgPSBpc0FycmF5KHZhbCkgPyBbdmFsXSA6IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleGlzdGluZyA9IGhhcy5jYWxsKG9iaiwga2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nICYmIG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2NvbWJpbmUnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nIHx8IG9wdGlvbnMuZHVwbGljYXRlcyA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgdmFyIGxlYWYgPSB2YWx1ZXNQYXJzZWQgPyB2YWwgOiBwYXJzZUFycmF5VmFsdWUodmFsLCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMuYWxsb3dFbXB0eUFycmF5cyAmJiAobGVhZiA9PT0gJycgfHwgKG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nICYmIGxlYWYgPT09IG51bGwpKVxuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGRlY29kZWRSb290ID0gb3B0aW9ucy5kZWNvZGVEb3RJbktleXMgPyBjbGVhblJvb3QucmVwbGFjZSgvJTJFL2csICcuJykgOiBjbGVhblJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChkZWNvZGVkUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcnNlQXJyYXlzICYmIGRlY29kZWRSb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gZGVjb2RlZFJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBkZWNvZGVkUm9vdFxuICAgICAgICAgICAgICAgICYmIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAmJiAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgICAgICBvYmpbaW5kZXhdID0gbGVhZjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlZFJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2RlY29kZWRSb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMsIHZhbHVlc1BhcnNlZCkge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBvcHRpb25zLmRlcHRoID4gMCAmJiBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAob3B0aW9ucy5kZXB0aCA+IDAgJiYgKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGNoZWNrIHN0cmljdERlcHRoIG9wdGlvbiBmb3IgdGhyb3csIGVsc2UganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0RGVwdGggPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnB1dCBkZXB0aCBleGNlZWRlZCBkZXB0aCBvcHRpb24gb2YgJyArIG9wdGlvbnMuZGVwdGggKyAnIGFuZCBzdHJpY3REZXB0aCBpcyB0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKTtcbn07XG5cbnZhciBub3JtYWxpemVQYXJzZU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVQYXJzZU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRzLmFsbG93RW1wdHlBcnJheXMgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgYWxsb3dFbXB0eUFycmF5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGRlY29kZURvdEluS2V5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZGVjb2RlciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0cy5kZWNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0RlY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICB2YXIgY2hhcnNldCA9IHR5cGVvZiBvcHRzLmNoYXJzZXQgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuY2hhcnNldCA6IG9wdHMuY2hhcnNldDtcblxuICAgIHZhciBkdXBsaWNhdGVzID0gdHlwZW9mIG9wdHMuZHVwbGljYXRlcyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kdXBsaWNhdGVzIDogb3B0cy5kdXBsaWNhdGVzO1xuXG4gICAgaWYgKGR1cGxpY2F0ZXMgIT09ICdjb21iaW5lJyAmJiBkdXBsaWNhdGVzICE9PSAnZmlyc3QnICYmIGR1cGxpY2F0ZXMgIT09ICdsYXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZHVwbGljYXRlcyBvcHRpb24gbXVzdCBiZSBlaXRoZXIgY29tYmluZSwgZmlyc3QsIG9yIGxhc3QnKTtcbiAgICB9XG5cbiAgICB2YXIgYWxsb3dEb3RzID0gdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IG9wdHMuZGVjb2RlRG90SW5LZXlzID09PSB0cnVlID8gdHJ1ZSA6IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd0RvdHM6IGFsbG93RG90cyxcbiAgICAgICAgYWxsb3dFbXB0eUFycmF5czogdHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLmFsbG93RW1wdHlBcnJheXMgOiBkZWZhdWx0cy5hbGxvd0VtcHR5QXJyYXlzLFxuICAgICAgICBhbGxvd1Byb3RvdHlwZXM6IHR5cGVvZiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXMsXG4gICAgICAgIGFsbG93U3BhcnNlOiB0eXBlb2Ygb3B0cy5hbGxvd1NwYXJzZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1NwYXJzZSA6IGRlZmF1bHRzLmFsbG93U3BhcnNlLFxuICAgICAgICBhcnJheUxpbWl0OiB0eXBlb2Ygb3B0cy5hcnJheUxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMuYXJyYXlMaW1pdCA6IGRlZmF1bHRzLmFycmF5TGltaXQsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgY29tbWE6IHR5cGVvZiBvcHRzLmNvbW1hID09PSAnYm9vbGVhbicgPyBvcHRzLmNvbW1hIDogZGVmYXVsdHMuY29tbWEsXG4gICAgICAgIGRlY29kZURvdEluS2V5czogdHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzID09PSAnYm9vbGVhbicgPyBvcHRzLmRlY29kZURvdEluS2V5cyA6IGRlZmF1bHRzLmRlY29kZURvdEluS2V5cyxcbiAgICAgICAgZGVjb2RlcjogdHlwZW9mIG9wdHMuZGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZGVjb2RlciA6IGRlZmF1bHRzLmRlY29kZXIsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAnc3RyaW5nJyB8fCB1dGlscy5pc1JlZ0V4cChvcHRzLmRlbGltaXRlcikgPyBvcHRzLmRlbGltaXRlciA6IGRlZmF1bHRzLmRlbGltaXRlcixcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uLCBuby1leHRyYS1wYXJlbnNcbiAgICAgICAgZGVwdGg6ICh0eXBlb2Ygb3B0cy5kZXB0aCA9PT0gJ251bWJlcicgfHwgb3B0cy5kZXB0aCA9PT0gZmFsc2UpID8gK29wdHMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aCxcbiAgICAgICAgZHVwbGljYXRlczogZHVwbGljYXRlcyxcbiAgICAgICAgaWdub3JlUXVlcnlQcmVmaXg6IG9wdHMuaWdub3JlUXVlcnlQcmVmaXggPT09IHRydWUsXG4gICAgICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogdHlwZW9mIG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID09PSAnYm9vbGVhbicgPyBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA6IGRlZmF1bHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyxcbiAgICAgICAgcGFyYW1ldGVyTGltaXQ6IHR5cGVvZiBvcHRzLnBhcmFtZXRlckxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMucGFyYW1ldGVyTGltaXQgOiBkZWZhdWx0cy5wYXJhbWV0ZXJMaW1pdCxcbiAgICAgICAgcGFyc2VBcnJheXM6IG9wdHMucGFyc2VBcnJheXMgIT09IGZhbHNlLFxuICAgICAgICBwbGFpbk9iamVjdHM6IHR5cGVvZiBvcHRzLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHMsXG4gICAgICAgIHN0cmljdERlcHRoOiB0eXBlb2Ygb3B0cy5zdHJpY3REZXB0aCA9PT0gJ2Jvb2xlYW4nID8gISFvcHRzLnN0cmljdERlcHRoIDogZGVmYXVsdHMuc3RyaWN0RGVwdGgsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKTtcblxuICAgIGlmIChzdHIgPT09ICcnIHx8IHN0ciA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgfVxuXG4gICAgdmFyIHRlbXBPYmogPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHBhcnNlVmFsdWVzKHN0ciwgb3B0aW9ucykgOiBzdHI7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBrZXlzIGFuZCBzZXR1cCB0aGUgbmV3IG9iamVjdFxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0ZW1wT2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBuZXdPYmogPSBwYXJzZUtleXMoa2V5LCB0ZW1wT2JqW2tleV0sIG9wdGlvbnMsIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKTtcbiAgICAgICAgb2JqID0gdXRpbHMubWVyZ2Uob2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmFsbG93U3BhcnNlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLmNvbXBhY3Qob2JqKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG4iLCIvL1xuLy8gVEhJUyBGSUxFIElTIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEISBETyBOT1QgRURJVCBCWSBIQU5EIVxuLy9cbjtcbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KClcbiAgICAgICAgOiB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWRcbiAgICAgICAgICAgID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtYmFzZTY0L2lzc3Vlcy8xMTlcbiAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgdmVyc2lvbiBmb3Igbm9Db25mbGljdCgpXG4gICAgICAgICAgICAgICAgdmFyIF9CYXNlNjQgPSBnbG9iYWwuQmFzZTY0O1xuICAgICAgICAgICAgICAgIHZhciBnQmFzZTY0ID0gZmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgIGdCYXNlNjQubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLkJhc2U2NCA9IF9CYXNlNjQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnQmFzZTY0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbC5NZXRlb3IpIHsgLy8gTWV0ZW9yLmpzXG4gICAgICAgICAgICAgICAgICAgIEJhc2U2NCA9IGdCYXNlNjQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdsb2JhbC5CYXNlNjQgPSBnQmFzZTY0O1xuICAgICAgICAgICAgfSkoKTtcbn0oKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGZcbiAgICA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93XG4gICAgICAgIDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxcbiAgICAgICAgICAgIDogdGhpcyksIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgLyoqXG4gICAgICogIGJhc2U2NC50c1xuICAgICAqXG4gICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgMy1DbGF1c2UgTGljZW5zZS5cbiAgICAgKiAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gICAgICpcbiAgICAgKiAgUmVmZXJlbmNlczpcbiAgICAgKiAgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NFxuICAgICAqXG4gICAgICogQGF1dGhvciBEYW4gS29nYWkgKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaSlcbiAgICAgKi9cbiAgICB2YXIgdmVyc2lvbiA9ICczLjcuNyc7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIGxvd2VyY2FzZSBgdmVyc2lvbmAuXG4gICAgICovXG4gICAgdmFyIFZFUlNJT04gPSB2ZXJzaW9uO1xuICAgIHZhciBfaGFzQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJztcbiAgICB2YXIgX1REID0gdHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHREZWNvZGVyKCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIF9URSA9IHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RW5jb2RlcigpIDogdW5kZWZpbmVkO1xuICAgIHZhciBiNjRjaCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG4gICAgdmFyIGI2NGNocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGI2NGNoKTtcbiAgICB2YXIgYjY0dGFiID0gKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciB0YWIgPSB7fTtcbiAgICAgICAgYS5mb3JFYWNoKGZ1bmN0aW9uIChjLCBpKSB7IHJldHVybiB0YWJbY10gPSBpOyB9KTtcbiAgICAgICAgcmV0dXJuIHRhYjtcbiAgICB9KShiNjRjaHMpO1xuICAgIHZhciBiNjRyZSA9IC9eKD86W0EtWmEtelxcZCtcXC9dezR9KSo/KD86W0EtWmEtelxcZCtcXC9dezJ9KD86PT0pP3xbQS1aYS16XFxkK1xcL117M309Pyk/JC87XG4gICAgdmFyIF9mcm9tQ0MgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmJpbmQoU3RyaW5nKTtcbiAgICB2YXIgX1U4QWZyb20gPSB0eXBlb2YgVWludDhBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gVWludDhBcnJheS5mcm9tLmJpbmQoVWludDhBcnJheSlcbiAgICAgICAgOiBmdW5jdGlvbiAoaXQpIHsgcmV0dXJuIG5ldyBVaW50OEFycmF5KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0LCAwKSk7IH07XG4gICAgdmFyIF9ta1VyaVNhZmUgPSBmdW5jdGlvbiAoc3JjKSB7IHJldHVybiBzcmNcbiAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpLnJlcGxhY2UoL1srXFwvXS9nLCBmdW5jdGlvbiAobTApIHsgcmV0dXJuIG0wID09ICcrJyA/ICctJyA6ICdfJzsgfSk7IH07XG4gICAgdmFyIF90aWR5QjY0ID0gZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9dL2csICcnKTsgfTtcbiAgICAvKipcbiAgICAgKiBwb2x5ZmlsbCB2ZXJzaW9uIG9mIGBidG9hYFxuICAgICAqL1xuICAgIHZhciBidG9hUG9seWZpbGwgPSBmdW5jdGlvbiAoYmluKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7XG4gICAgICAgIHZhciB1MzIsIGMwLCBjMSwgYzIsIGFzYyA9ICcnO1xuICAgICAgICB2YXIgcGFkID0gYmluLmxlbmd0aCAlIDM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluLmxlbmd0aDspIHtcbiAgICAgICAgICAgIGlmICgoYzAgPSBiaW4uY2hhckNvZGVBdChpKyspKSA+IDI1NSB8fFxuICAgICAgICAgICAgICAgIChjMSA9IGJpbi5jaGFyQ29kZUF0KGkrKykpID4gMjU1IHx8XG4gICAgICAgICAgICAgICAgKGMyID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBjaGFyYWN0ZXIgZm91bmQnKTtcbiAgICAgICAgICAgIHUzMiA9IChjMCA8PCAxNikgfCAoYzEgPDwgOCkgfCBjMjtcbiAgICAgICAgICAgIGFzYyArPSBiNjRjaHNbdTMyID4+IDE4ICYgNjNdXG4gICAgICAgICAgICAgICAgKyBiNjRjaHNbdTMyID4+IDEyICYgNjNdXG4gICAgICAgICAgICAgICAgKyBiNjRjaHNbdTMyID4+IDYgJiA2M11cbiAgICAgICAgICAgICAgICArIGI2NGNoc1t1MzIgJiA2M107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZCA/IGFzYy5zbGljZSgwLCBwYWQgLSAzKSArIFwiPT09XCIuc3Vic3RyaW5nKHBhZCkgOiBhc2M7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBkb2VzIHdoYXQgYHdpbmRvdy5idG9hYCBvZiB3ZWIgYnJvd3NlcnMgZG8uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGJpbiBiaW5hcnkgc3RyaW5nXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gICAgICovXG4gICAgdmFyIF9idG9hID0gdHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicgPyBmdW5jdGlvbiAoYmluKSB7IHJldHVybiBidG9hKGJpbik7IH1cbiAgICAgICAgOiBfaGFzQnVmZmVyID8gZnVuY3Rpb24gKGJpbikgeyByZXR1cm4gQnVmZmVyLmZyb20oYmluLCAnYmluYXJ5JykudG9TdHJpbmcoJ2Jhc2U2NCcpOyB9XG4gICAgICAgICAgICA6IGJ0b2FQb2x5ZmlsbDtcbiAgICB2YXIgX2Zyb21VaW50OEFycmF5ID0gX2hhc0J1ZmZlclxuICAgICAgICA/IGZ1bmN0aW9uICh1OGEpIHsgcmV0dXJuIEJ1ZmZlci5mcm9tKHU4YSkudG9TdHJpbmcoJ2Jhc2U2NCcpOyB9XG4gICAgICAgIDogZnVuY3Rpb24gKHU4YSkge1xuICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyNzEwMDAxL2hvdy10by1jb252ZXJ0LXVpbnQ4LWFycmF5LXRvLWJhc2U2NC1lbmNvZGVkLXN0cmluZy8xMjcxMzMyNiMxMjcxMzMyNlxuICAgICAgICAgICAgdmFyIG1heGFyZ3MgPSAweDEwMDA7XG4gICAgICAgICAgICB2YXIgc3RycyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB1OGEubGVuZ3RoOyBpIDwgbDsgaSArPSBtYXhhcmdzKSB7XG4gICAgICAgICAgICAgICAgc3Rycy5wdXNoKF9mcm9tQ0MuYXBwbHkobnVsbCwgdThhLnN1YmFycmF5KGksIGkgKyBtYXhhcmdzKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9idG9hKHN0cnMuam9pbignJykpO1xuICAgICAgICB9O1xuICAgIC8qKlxuICAgICAqIGNvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIEJhc2U2NCBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdXJsc2FmZV0gVVJMLWFuZC1maWxlbmFtZS1zYWZlIGEgbGEgUkZDNDY0OCDCpzVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgc3RyaW5nXG4gICAgICovXG4gICAgdmFyIGZyb21VaW50OEFycmF5ID0gZnVuY3Rpb24gKHU4YSwgdXJsc2FmZSkge1xuICAgICAgICBpZiAodXJsc2FmZSA9PT0gdm9pZCAwKSB7IHVybHNhZmUgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gdXJsc2FmZSA/IF9ta1VyaVNhZmUoX2Zyb21VaW50OEFycmF5KHU4YSkpIDogX2Zyb21VaW50OEFycmF5KHU4YSk7XG4gICAgfTtcbiAgICAvLyBUaGlzIHRyaWNrIGlzIGZvdW5kIGJyb2tlbiBodHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtYmFzZTY0L2lzc3Vlcy8xMzBcbiAgICAvLyBjb25zdCB1dG9iID0gKHNyYzogc3RyaW5nKSA9PiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3JjKSk7XG4gICAgLy8gcmV2ZXJ0aW5nIGdvb2Qgb2xkIGZhdGlvbmVkIHJlZ2V4cFxuICAgIHZhciBjYl91dG9iID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKGMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdmFyIGNjID0gYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgcmV0dXJuIGNjIDwgMHg4MCA/IGNcbiAgICAgICAgICAgICAgICA6IGNjIDwgMHg4MDAgPyAoX2Zyb21DQygweGMwIHwgKGNjID4+PiA2KSlcbiAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpXG4gICAgICAgICAgICAgICAgICAgIDogKF9mcm9tQ0MoMHhlMCB8ICgoY2MgPj4+IDEyKSAmIDB4MGYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoKGNjID4+PiA2KSAmIDB4M2YpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGNjID0gMHgxMDAwMFxuICAgICAgICAgICAgICAgICsgKGMuY2hhckNvZGVBdCgwKSAtIDB4RDgwMCkgKiAweDQwMFxuICAgICAgICAgICAgICAgICsgKGMuY2hhckNvZGVBdCgxKSAtIDB4REMwMCk7XG4gICAgICAgICAgICByZXR1cm4gKF9mcm9tQ0MoMHhmMCB8ICgoY2MgPj4+IDE4KSAmIDB4MDcpKVxuICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKChjYyA+Pj4gMTIpICYgMHgzZikpXG4gICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoKGNjID4+PiA2KSAmIDB4M2YpKVxuICAgICAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKGNjICYgMHgzZikpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIHJlX3V0b2IgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGRl18W15cXHgwMC1cXHg3Rl0vZztcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaG91bGQgaGF2ZSBiZWVuIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgVVRGLTggc3RyaW5nXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVVRGLTE2IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciB1dG9iID0gZnVuY3Rpb24gKHUpIHsgcmV0dXJuIHUucmVwbGFjZShyZV91dG9iLCBjYl91dG9iKTsgfTtcbiAgICAvL1xuICAgIHZhciBfZW5jb2RlID0gX2hhc0J1ZmZlclxuICAgICAgICA/IGZ1bmN0aW9uIChzKSB7IHJldHVybiBCdWZmZXIuZnJvbShzLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTsgfVxuICAgICAgICA6IF9URVxuICAgICAgICAgICAgPyBmdW5jdGlvbiAocykgeyByZXR1cm4gX2Zyb21VaW50OEFycmF5KF9URS5lbmNvZGUocykpOyB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChzKSB7IHJldHVybiBfYnRvYSh1dG9iKHMpKTsgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBhIFVURi04LWVuY29kZWQgc3RyaW5nIHRvIGEgQmFzZTY0IHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt1cmxzYWZlXSBpZiBgdHJ1ZWAgbWFrZSB0aGUgcmVzdWx0IFVSTC1zYWZlXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBlbmNvZGUgPSBmdW5jdGlvbiAoc3JjLCB1cmxzYWZlKSB7XG4gICAgICAgIGlmICh1cmxzYWZlID09PSB2b2lkIDApIHsgdXJsc2FmZSA9IGZhbHNlOyB9XG4gICAgICAgIHJldHVybiB1cmxzYWZlXG4gICAgICAgICAgICA/IF9ta1VyaVNhZmUoX2VuY29kZShzcmMpKVxuICAgICAgICAgICAgOiBfZW5jb2RlKHNyYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBhIFVURi04LWVuY29kZWQgc3RyaW5nIHRvIFVSTC1zYWZlIEJhc2U2NCBSRkM0NjQ4IMKnNS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgc3RyaW5nXG4gICAgICovXG4gICAgdmFyIGVuY29kZVVSSSA9IGZ1bmN0aW9uIChzcmMpIHsgcmV0dXJuIGVuY29kZShzcmMsIHRydWUpOyB9O1xuICAgIC8vIFRoaXMgdHJpY2sgaXMgZm91bmQgYnJva2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaS9qcy1iYXNlNjQvaXNzdWVzLzEzMFxuICAgIC8vIGNvbnN0IGJ0b3UgPSAoc3JjOiBzdHJpbmcpID0+IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3JjKSk7XG4gICAgLy8gcmV2ZXJ0aW5nIGdvb2Qgb2xkIGZhdGlvbmVkIHJlZ2V4cFxuICAgIHZhciByZV9idG91ID0gL1tcXHhDMC1cXHhERl1bXFx4ODAtXFx4QkZdfFtcXHhFMC1cXHhFRl1bXFx4ODAtXFx4QkZdezJ9fFtcXHhGMC1cXHhGN11bXFx4ODAtXFx4QkZdezN9L2c7XG4gICAgdmFyIGNiX2J0b3UgPSBmdW5jdGlvbiAoY2NjYykge1xuICAgICAgICBzd2l0Y2ggKGNjY2MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdmFyIGNwID0gKCgweDA3ICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxOClcbiAgICAgICAgICAgICAgICAgICAgfCAoKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMSkpIDw8IDEyKVxuICAgICAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgyKSkgPDwgNilcbiAgICAgICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgzKSksIG9mZnNldCA9IGNwIC0gMHgxMDAwMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9mcm9tQ0MoKG9mZnNldCA+Pj4gMTApICsgMHhEODAwKVxuICAgICAgICAgICAgICAgICAgICArIF9mcm9tQ0MoKG9mZnNldCAmIDB4M0ZGKSArIDB4REMwMCkpO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJvbUNDKCgoMHgwZiAmIGNjY2MuY2hhckNvZGVBdCgwKSkgPDwgMTIpXG4gICAgICAgICAgICAgICAgICAgIHwgKCgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDEpKSA8PCA2KVxuICAgICAgICAgICAgICAgICAgICB8ICgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDIpKSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJvbUNDKCgoMHgxZiAmIGNjY2MuY2hhckNvZGVBdCgwKSkgPDwgNilcbiAgICAgICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaG91bGQgaGF2ZSBiZWVuIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgVVRGLTE2IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFVURi04IHN0cmluZ1xuICAgICAqL1xuICAgIHZhciBidG91ID0gZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIucmVwbGFjZShyZV9idG91LCBjYl9idG91KTsgfTtcbiAgICAvKipcbiAgICAgKiBwb2x5ZmlsbCB2ZXJzaW9uIG9mIGBhdG9iYFxuICAgICAqL1xuICAgIHZhciBhdG9iUG9seWZpbGwgPSBmdW5jdGlvbiAoYXNjKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7XG4gICAgICAgIGFzYyA9IGFzYy5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICAgICAgaWYgKCFiNjRyZS50ZXN0KGFzYykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxmb3JtZWQgYmFzZTY0LicpO1xuICAgICAgICBhc2MgKz0gJz09Jy5zbGljZSgyIC0gKGFzYy5sZW5ndGggJiAzKSk7XG4gICAgICAgIHZhciB1MjQsIGJpbiA9ICcnLCByMSwgcjI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXNjLmxlbmd0aDspIHtcbiAgICAgICAgICAgIHUyNCA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldIDw8IDE4XG4gICAgICAgICAgICAgICAgfCBiNjR0YWJbYXNjLmNoYXJBdChpKyspXSA8PCAxMlxuICAgICAgICAgICAgICAgIHwgKHIxID0gYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0pIDw8IDZcbiAgICAgICAgICAgICAgICB8IChyMiA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldKTtcbiAgICAgICAgICAgIGJpbiArPSByMSA9PT0gNjQgPyBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSlcbiAgICAgICAgICAgICAgICA6IHIyID09PSA2NCA/IF9mcm9tQ0ModTI0ID4+IDE2ICYgMjU1LCB1MjQgPj4gOCAmIDI1NSlcbiAgICAgICAgICAgICAgICAgICAgOiBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSwgdTI0ID4+IDggJiAyNTUsIHUyNCAmIDI1NSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJpbjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGRvZXMgd2hhdCBgd2luZG93LmF0b2JgIG9mIHdlYiBicm93c2VycyBkby5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYXNjIEJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGJpbmFyeSBzdHJpbmdcbiAgICAgKi9cbiAgICB2YXIgX2F0b2IgPSB0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJyA/IGZ1bmN0aW9uIChhc2MpIHsgcmV0dXJuIGF0b2IoX3RpZHlCNjQoYXNjKSk7IH1cbiAgICAgICAgOiBfaGFzQnVmZmVyID8gZnVuY3Rpb24gKGFzYykgeyByZXR1cm4gQnVmZmVyLmZyb20oYXNjLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpOyB9XG4gICAgICAgICAgICA6IGF0b2JQb2x5ZmlsbDtcbiAgICAvL1xuICAgIHZhciBfdG9VaW50OEFycmF5ID0gX2hhc0J1ZmZlclxuICAgICAgICA/IGZ1bmN0aW9uIChhKSB7IHJldHVybiBfVThBZnJvbShCdWZmZXIuZnJvbShhLCAnYmFzZTY0JykpOyB9XG4gICAgICAgIDogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIF9VOEFmcm9tKF9hdG9iKGEpLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuY2hhckNvZGVBdCgwKTsgfSkpOyB9O1xuICAgIC8qKlxuICAgICAqIGNvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIFVpbnQ4QXJyYXkuXG4gICAgICovXG4gICAgdmFyIHRvVWludDhBcnJheSA9IGZ1bmN0aW9uIChhKSB7IHJldHVybiBfdG9VaW50OEFycmF5KF91blVSSShhKSk7IH07XG4gICAgLy9cbiAgICB2YXIgX2RlY29kZSA9IF9oYXNCdWZmZXJcbiAgICAgICAgPyBmdW5jdGlvbiAoYSkgeyByZXR1cm4gQnVmZmVyLmZyb20oYSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGY4Jyk7IH1cbiAgICAgICAgOiBfVERcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIF9URC5kZWNvZGUoX3RvVWludDhBcnJheShhKSk7IH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGJ0b3UoX2F0b2IoYSkpOyB9O1xuICAgIHZhciBfdW5VUkkgPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gX3RpZHlCNjQoYS5yZXBsYWNlKC9bLV9dL2csIGZ1bmN0aW9uIChtMCkgeyByZXR1cm4gbTAgPT0gJy0nID8gJysnIDogJy8nOyB9KSk7IH07XG4gICAgLyoqXG4gICAgICogY29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgVVRGLTggc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgQmFzZTY0IHN0cmluZy4gIEJvdGggbm9ybWFsIGFuZCBVUkwtc2FmZSBhcmUgc3VwcG9ydGVkXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVVRGLTggc3RyaW5nXG4gICAgICovXG4gICAgdmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzcmMpIHsgcmV0dXJuIF9kZWNvZGUoX3VuVVJJKHNyYykpOyB9O1xuICAgIC8qKlxuICAgICAqIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBCYXNlNjQgc3RyaW5nXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHNyYyBhIHZhbHVlIHRvIGNoZWNrXG4gICAgICAqL1xuICAgIHZhciBpc1ZhbGlkID0gZnVuY3Rpb24gKHNyYykge1xuICAgICAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBzID0gc3JjLnJlcGxhY2UoL1xccysvZywgJycpLnJlcGxhY2UoLz17MCwyfSQvLCAnJyk7XG4gICAgICAgIHJldHVybiAhL1teXFxzMC05YS16QS1aXFwrL10vLnRlc3QocykgfHwgIS9bXlxcczAtOWEtekEtWlxcLV9dLy50ZXN0KHMpO1xuICAgIH07XG4gICAgLy9cbiAgICB2YXIgX25vRW51bSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdiwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGV4dGVuZCBTdHJpbmcucHJvdG90eXBlIHdpdGggcmVsZXZhbnQgbWV0aG9kc1xuICAgICAqL1xuICAgIHZhciBleHRlbmRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYWRkID0gZnVuY3Rpb24gKG5hbWUsIGJvZHkpIHsgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCBuYW1lLCBfbm9FbnVtKGJvZHkpKTsgfTtcbiAgICAgICAgX2FkZCgnZnJvbUJhc2U2NCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlY29kZSh0aGlzKTsgfSk7XG4gICAgICAgIF9hZGQoJ3RvQmFzZTY0JywgZnVuY3Rpb24gKHVybHNhZmUpIHsgcmV0dXJuIGVuY29kZSh0aGlzLCB1cmxzYWZlKTsgfSk7XG4gICAgICAgIF9hZGQoJ3RvQmFzZTY0VVJJJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHRydWUpOyB9KTtcbiAgICAgICAgX2FkZCgndG9CYXNlNjRVUkwnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBlbmNvZGUodGhpcywgdHJ1ZSk7IH0pO1xuICAgICAgICBfYWRkKCd0b1VpbnQ4QXJyYXknLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0b1VpbnQ4QXJyYXkodGhpcyk7IH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogZXh0ZW5kIFVpbnQ4QXJyYXkucHJvdG90eXBlIHdpdGggcmVsZXZhbnQgbWV0aG9kc1xuICAgICAqL1xuICAgIHZhciBleHRlbmRVaW50OEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2FkZCA9IGZ1bmN0aW9uIChuYW1lLCBib2R5KSB7IHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDhBcnJheS5wcm90b3R5cGUsIG5hbWUsIF9ub0VudW0oYm9keSkpOyB9O1xuICAgICAgICBfYWRkKCd0b0Jhc2U2NCcsIGZ1bmN0aW9uICh1cmxzYWZlKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB1cmxzYWZlKTsgfSk7XG4gICAgICAgIF9hZGQoJ3RvQmFzZTY0VVJJJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdHJ1ZSk7IH0pO1xuICAgICAgICBfYWRkKCd0b0Jhc2U2NFVSTCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZyb21VaW50OEFycmF5KHRoaXMsIHRydWUpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGV4dGVuZCBCdWlsdGluIHByb3RvdHlwZXMgd2l0aCByZWxldmFudCBtZXRob2RzXG4gICAgICovXG4gICAgdmFyIGV4dGVuZEJ1aWx0aW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBleHRlbmRTdHJpbmcoKTtcbiAgICAgICAgZXh0ZW5kVWludDhBcnJheSgpO1xuICAgIH07XG4gICAgdmFyIGdCYXNlNjQgPSB7XG4gICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgIFZFUlNJT046IFZFUlNJT04sXG4gICAgICAgIGF0b2I6IF9hdG9iLFxuICAgICAgICBhdG9iUG9seWZpbGw6IGF0b2JQb2x5ZmlsbCxcbiAgICAgICAgYnRvYTogX2J0b2EsXG4gICAgICAgIGJ0b2FQb2x5ZmlsbDogYnRvYVBvbHlmaWxsLFxuICAgICAgICBmcm9tQmFzZTY0OiBkZWNvZGUsXG4gICAgICAgIHRvQmFzZTY0OiBlbmNvZGUsXG4gICAgICAgIGVuY29kZTogZW5jb2RlLFxuICAgICAgICBlbmNvZGVVUkk6IGVuY29kZVVSSSxcbiAgICAgICAgZW5jb2RlVVJMOiBlbmNvZGVVUkksXG4gICAgICAgIHV0b2I6IHV0b2IsXG4gICAgICAgIGJ0b3U6IGJ0b3UsXG4gICAgICAgIGRlY29kZTogZGVjb2RlLFxuICAgICAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgICAgICBmcm9tVWludDhBcnJheTogZnJvbVVpbnQ4QXJyYXksXG4gICAgICAgIHRvVWludDhBcnJheTogdG9VaW50OEFycmF5LFxuICAgICAgICBleHRlbmRTdHJpbmc6IGV4dGVuZFN0cmluZyxcbiAgICAgICAgZXh0ZW5kVWludDhBcnJheTogZXh0ZW5kVWludDhBcnJheSxcbiAgICAgICAgZXh0ZW5kQnVpbHRpbnM6IGV4dGVuZEJ1aWx0aW5zXG4gICAgfTtcbiAgICAvL1xuICAgIC8vIGV4cG9ydCBCYXNlNjQgdG8gdGhlIG5hbWVzcGFjZVxuICAgIC8vXG4gICAgLy8gRVM1IGlzIHlldCB0byBoYXZlIE9iamVjdC5hc3NpZ24oKSB0aGF0IG1heSBtYWtlIHRyYW5zcGlsZXJzIHVuaGFwcHkuXG4gICAgLy8gZ0Jhc2U2NC5CYXNlNjQgPSBPYmplY3QuYXNzaWduKHt9LCBnQmFzZTY0KTtcbiAgICBnQmFzZTY0LkJhc2U2NCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGdCYXNlNjQpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgcmV0dXJuIGdCYXNlNjQuQmFzZTY0W2tdID0gZ0Jhc2U2NFtrXTsgfSk7XG4gICAgcmV0dXJuIGdCYXNlNjQ7XG59KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIgPSB2b2lkIDA7XG52YXIgZm9ybV9kYXRhXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImZvcm0tZGF0YVwiKSk7XG52YXIgcXNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicXNcIikpO1xudmFyIGpzX2Jhc2U2NF8xID0gcmVxdWlyZShcImpzLWJhc2U2NFwiKTtcbnZhciBwbGF0Zm9ybV8xID0gcmVxdWlyZShcIi4vcGxhdGZvcm0vXCIpO1xudmFyIERFRkFVTFRfUFJPWFlfUFJPVE9DT0wgPSBcImh0dHBcIjtcbnZhciBUSFJFU0hPTERfQVZPSURfUkVRVUVTVF9VUkxfVE9PX0xBUkdFID0gNDA5NjtcbnZhciBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICB0aGlzLmF1dGggPSBvcHRpb25zLmF1dGg7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IHRoaXMuYnVpbGRIZWFkZXJzKHtcbiAgICAgICAgICAgIGJhc2ljQXV0aDogb3B0aW9ucy5iYXNpY0F1dGgsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6IG9wdGlvbnMudXNlckFnZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKFwiaHR0cHNBZ2VudFwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChcImNsaWVudENlcnRBdXRoXCIgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGNsaWVudENlcnRBdXRoIGFsb25nIHdpdGggaHR0cHNBZ2VudC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmh0dHBzQWdlbnQgPSBvcHRpb25zLmh0dHBzQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXCJjbGllbnRDZXJ0QXV0aFwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Q2VydEF1dGggPSBvcHRpb25zLmNsaWVudENlcnRBdXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJveHkgPSBvcHRpb25zLnByb3h5O1xuICAgICAgICB0aGlzLnJlcXVlc3RUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc29ja2V0VGltZW91dCA9IG9wdGlvbnMuc29ja2V0VGltZW91dDtcbiAgICB9XG4gICAgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uIChtZXRob2QsIHBhdGgsIHBhcmFtcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdENvbmZpZywgX2EsIHJlcXVlc3RVcmwsIF9iLCBmb3JtRGF0YSwgX2MsIF9kLCByZXF1ZXN0VXJsLCBfZSwgX2Y7XG4gICAgICAgICAgICB2YXIgX2csIF9oLCBfajtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2spIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9rLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7IG1ldGhvZDogbWV0aG9kLCBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsIHVybDogXCJcIi5jb25jYXQodGhpcy5iYXNlVXJsKS5jb25jYXQocGF0aCkgfSwgKG9wdGlvbnMgPyBvcHRpb25zIDoge30pKSwgcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuYnVpbGRQbGF0Zm9ybURlcGVuZGVudENvbmZpZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHNBZ2VudDogdGhpcy5odHRwc0FnZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudENlcnRBdXRoOiB0aGlzLmNsaWVudENlcnRBdXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldFRpbWVvdXQ6IHRoaXMuc29ja2V0VGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgeyBwcm94eTogdGhpcy5idWlsZFByb3h5Q29uZmlnKHRoaXMucHJveHkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBtZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImdldFwiOiByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicG9zdFwiOiByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHV0XCI6IHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVcIjogcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMTJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsID0gdGhpcy5idWlsZFJlcXVlc3RVcmwocGF0aCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHJlcXVlc3RVcmwubGVuZ3RoID4gVEhSRVNIT0xEX0FWT0lEX1JFUVVFU1RfVVJMX1RPT19MQVJHRSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBbX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9nID0geyBtZXRob2Q6IFwicG9zdFwiLCBoZWFkZXJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5oZWFkZXJzKSwgeyBcIlgtSFRUUC1NZXRob2QtT3ZlcnJpZGVcIjogXCJHRVRcIiB9KSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9fYXNzaWduLmFwcGx5KHZvaWQgMCwgX2IuY29uY2F0KFsoX2cuZGF0YSA9IF9rLnNlbnQoKSwgX2cpXSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IHVybDogcmVxdWVzdFVybCB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHBhcmFtcyBpbnN0YW5jZW9mIGZvcm1fZGF0YV8xLmRlZmF1bHQpKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuYnVpbGREYXRhKHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IF9rLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVxdWVzdENvbmZpZyksIHsgaGVhZGVyczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGZvcm1EYXRhLmdldEhlYWRlcnMgZG9lcyBub3QgZXhpc3QgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybURhdGEuZ2V0SGVhZGVycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLmhlYWRlcnMpLCBmb3JtRGF0YS5nZXRIZWFkZXJzKCkpIDogdGhpcy5oZWFkZXJzLCBkYXRhOiBmb3JtRGF0YSB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gW19fYXNzaWduKHt9LCByZXF1ZXN0Q29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfaCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIF9fYXNzaWduLmFwcGx5KHZvaWQgMCwgX2MuY29uY2F0KFsoX2guZGF0YSA9IF9rLnNlbnQoKSwgX2gpXSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2QgPSBbX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9qID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmJ1aWxkRGF0YShwYXJhbXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24uYXBwbHkodm9pZCAwLCBfZC5jb25jYXQoWyhfai5kYXRhID0gX2suc2VudCgpLCBfaildKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2UgPSB0aGlzLmJ1aWxkUmVxdWVzdFVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mID0gW3BhdGhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5idWlsZERhdGEocGFyYW1zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsID0gX2UuYXBwbHkodGhpcywgX2YuY29uY2F0KFtfay5zZW50KCldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oX19hc3NpZ24oe30sIHJlcXVlc3RDb25maWcpLCB7IHVybDogcmVxdWVzdFVybCB9KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIuY29uY2F0KG1ldGhvZCwgXCIgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2subGFiZWwgPSAxMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuYnVpbGRQcm94eUNvbmZpZyA9IGZ1bmN0aW9uIChwcm94eUNvbmZpZykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwcm94eUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm94eUNvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJveHkgPSBwcm94eUNvbmZpZztcbiAgICAgICAgaWYgKHByb3h5LmF1dGggJiZcbiAgICAgICAgICAgIChwcm94eS5hdXRoLnVzZXJuYW1lLmxlbmd0aCA9PT0gMCB8fCBwcm94eS5hdXRoLnBhc3N3b3JkLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHByb3h5LmF1dGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHJveHkucHJvdG9jb2wgPSAoX2EgPSBwcm94eS5wcm90b2NvbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogREVGQVVMVF9QUk9YWV9QUk9UT0NPTDtcbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH07XG4gICAgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLnByb3RvdHlwZS5idWlsZFJlcXVlc3RVcmwgPSBmdW5jdGlvbiAocGF0aCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBcIlwiLmNvbmNhdCh0aGlzLmJhc2VVcmwpLmNvbmNhdChwYXRoLCBcIj9cIikuY29uY2F0KHFzXzEuZGVmYXVsdC5zdHJpbmdpZnkocGFyYW1zKSk7XG4gICAgfTtcbiAgICBLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXIucHJvdG90eXBlLmJ1aWxkRGF0YSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RUb2tlbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuYXV0aC50eXBlID09PSBcInNlc3Npb25cIikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5nZXRSZXF1ZXN0VG9rZW4oKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBmb3JtX2RhdGFfMS5kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZChcIl9fUkVRVUVTVF9UT0tFTl9fXCIsIHJlcXVlc3RUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBhcmFtc107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgX19hc3NpZ24oeyBfX1JFUVVFU1RfVE9LRU5fXzogcmVxdWVzdFRva2VuIH0sIHBhcmFtcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBwYXJhbXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuYnVpbGRIZWFkZXJzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgYmFzaWNBdXRoID0gcGFyYW1zLmJhc2ljQXV0aCwgdXNlckFnZW50ID0gcGFyYW1zLnVzZXJBZ2VudDtcbiAgICAgICAgdmFyIGJhc2ljQXV0aEhlYWRlcnMgPSBiYXNpY0F1dGhcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IFwiQmFzaWMgXCIuY29uY2F0KGpzX2Jhc2U2NF8xLkJhc2U2NC5lbmNvZGUoXCJcIi5jb25jYXQoYmFzaWNBdXRoLnVzZXJuYW1lLCBcIjpcIikuY29uY2F0KGJhc2ljQXV0aC5wYXNzd29yZCkpKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge307XG4gICAgICAgIHZhciBwbGF0Zm9ybURlcHNIZWFkZXJzID0gcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuYnVpbGRIZWFkZXJzKHsgdXNlckFnZW50OiB1c2VyQWdlbnQgfSk7XG4gICAgICAgIHZhciBjb21tb25IZWFkZXJzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHBsYXRmb3JtRGVwc0hlYWRlcnMpLCBiYXNpY0F1dGhIZWFkZXJzKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmF1dGgudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInBhc3N3b3JkXCI6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQXV0aG9yaXphdGlvblwiOiBqc19iYXNlNjRfMS5CYXNlNjQuZW5jb2RlKFwiXCIuY29uY2F0KHRoaXMuYXV0aC51c2VybmFtZSwgXCI6XCIpLmNvbmNhdCh0aGlzLmF1dGgucGFzc3dvcmQpKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJhcGlUb2tlblwiOiB7XG4gICAgICAgICAgICAgICAgdmFyIGFwaVRva2VuID0gdGhpcy5hdXRoLmFwaVRva2VuO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFwaVRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQVBJLVRva2VuXCI6IGFwaVRva2VuLmpvaW4oXCIsXCIpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1DeWJvenUtQVBJLVRva2VuXCI6IGFwaVRva2VuIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIm9BdXRoVG9rZW5cIjoge1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29tbW9uSGVhZGVycyksIHsgQXV0aG9yaXphdGlvbjogXCJCZWFyZXIgXCIuY29uY2F0KHRoaXMuYXV0aC5vQXV0aFRva2VuKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbkhlYWRlcnMpLCB7IFwiWC1SZXF1ZXN0ZWQtV2l0aFwiOiBcIlhNTEh0dHBSZXF1ZXN0XCIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEtpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlci5wcm90b3R5cGUuZ2V0UmVxdWVzdFRva2VuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnJlcXVlc3RUb2tlbiA9PT0gbnVsbCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuZ2V0UmVxdWVzdFRva2VuKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5yZXF1ZXN0VG9rZW4gPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMucmVxdWVzdFRva2VuXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyO1xufSgpKTtcbmV4cG9ydHMuS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyID0gS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZVJlc3BvbnNlSGFuZGxlciA9IHZvaWQgMDtcbnZhciBlcnJvcl8xID0gcmVxdWlyZShcIi4vZXJyb3JcIik7XG52YXIgS2ludG9uZVJlc3BvbnNlSGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBLaW50b25lUmVzcG9uc2VIYW5kbGVyKF9hKSB7XG4gICAgICAgIHZhciBlbmFibGVBYm9ydFNlYXJjaEVycm9yID0gX2EuZW5hYmxlQWJvcnRTZWFyY2hFcnJvcjtcbiAgICAgICAgdGhpcy5lbmFibGVBYm9ydFNlYXJjaEVycm9yID0gZW5hYmxlQWJvcnRTZWFyY2hFcnJvcjtcbiAgICB9XG4gICAgS2ludG9uZVJlc3BvbnNlSGFuZGxlci5wcm90b3R5cGUuaGFuZGxlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiByZXNwb25zZS50aGVuKGZ1bmN0aW9uIChyZXMpIHsgcmV0dXJuIF90aGlzLmhhbmRsZVN1Y2Nlc3NSZXNwb25zZShyZXMpOyB9LCBmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIF90aGlzLmhhbmRsZUVycm9yUmVzcG9uc2UoZXJyb3IpOyB9KTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXNwb25zZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZVN1Y2Nlc3NSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5lbmFibGVBYm9ydFNlYXJjaEVycm9yICYmXG4gICAgICAgICAgICAvRmlsdGVyIGFib3J0ZWQgYmVjYXVzZSBvZiB0b28gbWFueSBzZWFyY2ggcmVzdWx0cy8udGVzdChyZXNwb25zZS5oZWFkZXJzW1wieC1jeWJvenUtd2FybmluZ1wiXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcl8xLktpbnRvbmVBYm9ydFNlYXJjaEVycm9yKHJlc3BvbnNlLmhlYWRlcnNbXCJ4LWN5Ym96dS13YXJuaW5nXCJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9O1xuICAgIEtpbnRvbmVSZXNwb25zZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZUVycm9yUmVzcG9uc2UgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnJvci5yZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gRklYTUU6IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzIGVycm9yXG4gICAgICAgICAgICBpZiAoL21hYyB2ZXJpZnkgZmFpbHVyZS8udGVzdChlcnJvci50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2xpZW50Q2VydEF1dGggc2V0dGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvclJlc3BvbnNlID0gZXJyb3IucmVzcG9uc2U7XG4gICAgICAgIHZhciBkYXRhID0gZXJyb3JSZXNwb25zZS5kYXRhLCByZXN0ID0gX19yZXN0KGVycm9yUmVzcG9uc2UsIFtcImRhdGFcIl0pO1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChyZXN0LnN0YXR1cywgXCI6IFwiKS5jb25jYXQocmVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IGVycm9yXzEuS2ludG9uZVJlc3RBUElFcnJvcihfX2Fzc2lnbih7IGRhdGE6IGRhdGEgfSwgcmVzdCkpO1xuICAgIH07XG4gICAgcmV0dXJuIEtpbnRvbmVSZXNwb25zZUhhbmRsZXI7XG59KCkpO1xuZXhwb3J0cy5LaW50b25lUmVzcG9uc2VIYW5kbGVyID0gS2ludG9uZVJlc3BvbnNlSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtpbnRvbmVSZXNwb25zZUhhbmRsZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUNsaWVudCA9IHZvaWQgMDtcbnZhciBCdWxrUmVxdWVzdENsaWVudF8xID0gcmVxdWlyZShcIi4vY2xpZW50L0J1bGtSZXF1ZXN0Q2xpZW50XCIpO1xudmFyIEFwcENsaWVudF8xID0gcmVxdWlyZShcIi4vY2xpZW50L0FwcENsaWVudFwiKTtcbnZhciBSZWNvcmRDbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9SZWNvcmRDbGllbnRcIik7XG52YXIgU3BhY2VDbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9TcGFjZUNsaWVudFwiKTtcbnZhciBGaWxlQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9jbGllbnQvRmlsZUNsaWVudFwiKTtcbnZhciBQbHVnaW5DbGllbnRfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC9QbHVnaW5DbGllbnRcIik7XG52YXIgaHR0cF8xID0gcmVxdWlyZShcIi4vaHR0cC9cIik7XG52YXIgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyXzEgPSByZXF1aXJlKFwiLi9LaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXJcIik7XG52YXIgS2ludG9uZVJlc3BvbnNlSGFuZGxlcl8xID0gcmVxdWlyZShcIi4vS2ludG9uZVJlc3BvbnNlSGFuZGxlclwiKTtcbnZhciBwbGF0Zm9ybV8xID0gcmVxdWlyZShcIi4vcGxhdGZvcm1cIik7XG52YXIgVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yXzEgPSByZXF1aXJlKFwiLi9wbGF0Zm9ybS9VbnN1cHBvcnRlZFBsYXRmb3JtRXJyb3JcIik7XG52YXIgYnVpbGREaXNjcmltaW5hdGVkQXV0aCA9IGZ1bmN0aW9uIChhdXRoKSB7XG4gICAgaWYgKFwidXNlcm5hbWVcIiBpbiBhdXRoKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbih7IHR5cGU6IFwicGFzc3dvcmRcIiB9LCBhdXRoKTtcbiAgICB9XG4gICAgaWYgKFwiYXBpVG9rZW5cIiBpbiBhdXRoKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbih7IHR5cGU6IFwiYXBpVG9rZW5cIiB9LCBhdXRoKTtcbiAgICB9XG4gICAgaWYgKFwib0F1dGhUb2tlblwiIGluIGF1dGgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKHsgdHlwZTogXCJvQXV0aFRva2VuXCIgfSwgYXV0aCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwbGF0Zm9ybV8xLnBsYXRmb3JtRGVwcy5nZXREZWZhdWx0QXV0aCgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xLlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2Vzc2lvbiBhdXRoZW50aWNhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIFwiLmNvbmNhdChlLnBsYXRmb3JtLCBcIiBlbnZpcm9ubWVudC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufTtcbnZhciBLaW50b25lUmVzdEFQSUNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBLaW50b25lUmVzdEFQSUNsaWVudChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IHBsYXRmb3JtXzEucGxhdGZvcm1EZXBzXG4gICAgICAgICAgICAuYnVpbGRCYXNlVXJsKG9wdGlvbnMuYmFzZVVybClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpOyAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgdmFyIGF1dGggPSBidWlsZERpc2NyaW1pbmF0ZWRBdXRoKChfYSA9IG9wdGlvbnMuYXV0aCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30pO1xuICAgICAgICB2YXIgcmVxdWVzdENvbmZpZ0J1aWxkZXIgPSBuZXcgS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyXzEuS2ludG9uZVJlcXVlc3RDb25maWdCdWlsZGVyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsIGF1dGg6IGF1dGggfSkpO1xuICAgICAgICB2YXIgcmVzcG9uc2VIYW5kbGVyID0gbmV3IEtpbnRvbmVSZXNwb25zZUhhbmRsZXJfMS5LaW50b25lUmVzcG9uc2VIYW5kbGVyKHtcbiAgICAgICAgICAgIGVuYWJsZUFib3J0U2VhcmNoRXJyb3I6IChfYyA9IChfYiA9IG9wdGlvbnMuZmVhdHVyZUZsYWdzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZW5hYmxlQWJvcnRTZWFyY2hFcnJvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaHR0cENsaWVudCA9IG5ldyBodHRwXzEuRGVmYXVsdEh0dHBDbGllbnQoe1xuICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyOiByZXNwb25zZUhhbmRsZXIsXG4gICAgICAgICAgICByZXF1ZXN0Q29uZmlnQnVpbGRlcjogcmVxdWVzdENvbmZpZ0J1aWxkZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZ3Vlc3RTcGFjZUlkID0gb3B0aW9ucy5ndWVzdFNwYWNlSWQ7XG4gICAgICAgIHRoaXMuYnVsa1JlcXVlc3RfID0gbmV3IEJ1bGtSZXF1ZXN0Q2xpZW50XzEuQnVsa1JlcXVlc3RDbGllbnQoaHR0cENsaWVudCwgZ3Vlc3RTcGFjZUlkKTtcbiAgICAgICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkQ2xpZW50XzEuUmVjb3JkQ2xpZW50KGh0dHBDbGllbnQsIHRoaXMuYnVsa1JlcXVlc3RfLCBndWVzdFNwYWNlSWQpO1xuICAgICAgICB0aGlzLmFwcCA9IG5ldyBBcHBDbGllbnRfMS5BcHBDbGllbnQoaHR0cENsaWVudCwgZ3Vlc3RTcGFjZUlkKTtcbiAgICAgICAgdGhpcy5zcGFjZSA9IG5ldyBTcGFjZUNsaWVudF8xLlNwYWNlQ2xpZW50KGh0dHBDbGllbnQsIGd1ZXN0U3BhY2VJZCk7XG4gICAgICAgIHRoaXMuZmlsZSA9IG5ldyBGaWxlQ2xpZW50XzEuRmlsZUNsaWVudChodHRwQ2xpZW50LCBndWVzdFNwYWNlSWQpO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IG5ldyBQbHVnaW5DbGllbnRfMS5QbHVnaW5DbGllbnQoaHR0cENsaWVudCk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShLaW50b25lUmVzdEFQSUNsaWVudCwgXCJ2ZXJzaW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGxhdGZvcm1fMS5wbGF0Zm9ybURlcHMuZ2V0VmVyc2lvbigpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgS2ludG9uZVJlc3RBUElDbGllbnQucHJvdG90eXBlLmdldEJhc2VVcmwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmw7XG4gICAgfTtcbiAgICBLaW50b25lUmVzdEFQSUNsaWVudC5wcm90b3R5cGUuYnVsa1JlcXVlc3QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1bGtSZXF1ZXN0Xy5zZW5kKHBhcmFtcyk7XG4gICAgfTtcbiAgICByZXR1cm4gS2ludG9uZVJlc3RBUElDbGllbnQ7XG59KCkpO1xuZXhwb3J0cy5LaW50b25lUmVzdEFQSUNsaWVudCA9IEtpbnRvbmVSZXN0QVBJQ2xpZW50O1xudmFyIHZhbGlkYXRlT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFsaWRhdGVCYXNlVXJsKG9wdGlvbnMuYmFzZVVybCk7XG4gICAgdmFsaWRhdGVHdWVzdFNwYWNlSWQob3B0aW9ucy5ndWVzdFNwYWNlSWQpO1xuICAgIHZhbGlkYXRlU29ja2V0VGltZW91dChvcHRpb25zLnNvY2tldFRpbWVvdXQpO1xufTtcbnZhciB2YWxpZGF0ZUJhc2VVcmwgPSBmdW5jdGlvbiAoYmFzZVVybCkge1xuICAgIGlmIChiYXNlVXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdXJsID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICBpZiAodXJsLmhvc3RuYW1lICE9PSBcImxvY2FsaG9zdFwiICYmIHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm90b2NvbCBvZiBiYXNlVXJsIG11c3QgYmUgXCJodHRwc1wiLicpO1xuICAgIH1cbn07XG52YXIgdmFsaWRhdGVHdWVzdFNwYWNlSWQgPSBmdW5jdGlvbiAoZ3Vlc3RTcGFjZUlkKSB7XG4gICAgaWYgKGd1ZXN0U3BhY2VJZCA9PT0gXCJcIiB8fCBndWVzdFNwYWNlSWQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBndWVzdFNwYWNlSWQ6IGdvdCBbXCIuY29uY2F0KGd1ZXN0U3BhY2VJZCwgXCJdXCIpKTtcbiAgICB9XG59O1xudmFyIHZhbGlkYXRlU29ja2V0VGltZW91dCA9IGZ1bmN0aW9uIChzb2NrZXRUaW1lb3V0KSB7XG4gICAgaWYgKHNvY2tldFRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBudW1iZXIgPSBwYXJzZUZsb2F0KHNvY2tldFRpbWVvdXQudG9TdHJpbmcoKSk7XG4gICAgaWYgKGlzTmFOKG51bWJlcikgfHwgbnVtYmVyIDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNvY2tldFRpbWVvdXQuIE11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuXCIpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LaW50b25lUmVzdEFQSUNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuS2ludG9uZVJlc3RBUElDbGllbnQgPSB2b2lkIDA7XG52YXIgcGxhdGZvcm1fMSA9IHJlcXVpcmUoXCIuL3BsYXRmb3JtL1wiKTtcbnZhciBicm93c2VyRGVwcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wbGF0Zm9ybS9icm93c2VyXCIpKTtcbigwLCBwbGF0Zm9ybV8xLmluamVjdFBsYXRmb3JtRGVwcykoYnJvd3NlckRlcHMpO1xudmFyIEtpbnRvbmVSZXN0QVBJQ2xpZW50XzEgPSByZXF1aXJlKFwiLi9LaW50b25lUmVzdEFQSUNsaWVudFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIktpbnRvbmVSZXN0QVBJQ2xpZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBLaW50b25lUmVzdEFQSUNsaWVudF8xLktpbnRvbmVSZXN0QVBJQ2xpZW50OyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2Vycm9yXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmJyb3dzZXIuanMubWFwIiwiLy8gc3JjL3R5cGVzL2ZpZWxkLmQudHNcblxuZXhwb3J0IGVudW0gRmllbGRUeXBlIHtcbiAgICBDQUxDID0gXCJDQUxDXCIsXG4gICAgQ0FURUdPUlkgPSBcIkNBVEVHT1JZXCIsXG4gICAgQ0hFQ0tfQk9YID0gXCJDSEVDS19CT1hcIixcbiAgICBDUkVBVEVEX1RJTUUgPSBcIkNSRUFURURfVElNRVwiLFxuICAgIENSRUFUT1IgPSBcIkNSRUFUT1JcIixcbiAgICBEQVRFID0gXCJEQVRFXCIsXG4gICAgREFURVRJTUUgPSBcIkRBVEVUSU1FXCIsXG4gICAgRFJPUF9ET1dOID0gXCJEUk9QX0RPV05cIixcbiAgICBGSUxFID0gXCJGSUxFXCIsXG4gICAgR1JPVVAgPSBcIkdST1VQXCIsXG4gICAgR1JPVVBfU0VMRUNUID0gXCJHUk9VUF9TRUxFQ1RcIixcbiAgICBMSU5LID0gXCJMSU5LXCIsXG4gICAgTU9ESUZJRVIgPSBcIk1PRElGSUVSXCIsXG4gICAgTVVMVElfTElORV9URVhUID0gXCJNVUxUSV9MSU5FX1RFWFRcIixcbiAgICBNVUxUSV9TRUxFQ1QgPSBcIk1VTFRJX1NFTEVDVFwiLFxuICAgIE5VTUJFUiA9IFwiTlVNQkVSXCIsXG4gICAgT1JHQU5JWkFUSU9OX1NFTEVDVCA9IFwiT1JHQU5JWkFUSU9OX1NFTEVDVFwiLFxuICAgIFJBRElPX0JVVFRPTiA9IFwiUkFESU9fQlVUVE9OXCIsXG4gICAgUkVDT1JEX05VTUJFUiA9IFwiUkVDT1JEX05VTUJFUlwiLFxuICAgIFJFRkVSRU5DRV9UQUJMRSA9IFwiUkVGRVJFTkNFX1RBQkxFXCIsXG4gICAgUklDSF9URVhUID0gXCJSSUNIX1RFWFRcIixcbiAgICBTSU5HTEVfTElORV9URVhUID0gXCJTSU5HTEVfTElORV9URVhUXCIsXG4gICAgU1RBVFVTID0gXCJTVEFUVVNcIixcbiAgICBTVEFUVVNfQVNTSUdORUUgPSBcIlNUQVRVU19BU1NJR05FRVwiLFxuICAgIFNVQlRBQkxFID0gXCJTVUJUQUJMRVwiLFxuICAgIFRJTUUgPSBcIlRJTUVcIixcbiAgICBVUERBVEVEX1RJTUUgPSBcIlVQREFURURfVElNRVwiLFxuICAgIFVTRVJfU0VMRUNUID0gXCJVU0VSX1NFTEVDVFwiXG59XG5cbmV4cG9ydCBlbnVtIENhbGNGb3JtYXR7XG4gICAgTlVNQkVSID0gXCJOVU1CRVJcIixcbiAgICBOVU1CRVJfRElHSVQgPSBcIk5VTUJFUl9ESUdJVFwiLFxuICAgIERBVEVUSU1FID0gXCJEQVRFVElNRVwiLFxuICAgIERBVEUgPSBcIkRBVEVcIixcbiAgICBUSU1FID0gXCJUSU1FXCIsXG4gICAgSE9VUl9NSU5VVEU9IFwiSE9VUl9NSU5VVEVcIixcbiAgICBEQVlfSE9VUl9NSU5VVEU9IFwiREFZX0hPVVJfTUlOVVRFXCJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZEZvcm0ge1xuICAgIGNvZGU6IHN0cmluZztcbiAgICB0eXBlOiBGaWVsZFR5cGU7XG4gICAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICAgIG5vTGFiZWw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkZvcm17XG4gICAgaW5kZXg6IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUZvcm0ge1xuICAgIGNvZGU6IHN0cmluZztcbiAgICB0eXBlOiAnVVNFUicgfCAnT1JHQU5JWkFUSU9OJyB8ICdHUk9VUCcgfCAnRlVOQ1RJT04nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGNGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIHVuaXQ/OiBzdHJpbmc7XG4gICAgZXhwcmVzc2lvbj86IHN0cmluZztcbiAgICBmb3JtYXQ/OkNhbGNGb3JtYXQ7XG4gICAgdW5pdFBvc2l0aW9uPzogJ0JFRk9SRScgfCAnQUZURVInO1xuICAgIGRpc3BsYXlTY2FsZT86IHN0cmluZztcbiAgICBoaWRlRXhwcmVzc2lvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIGRlZmF1bHROb3dWYWx1ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZXRpbWVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIGRlZmF1bHROb3dWYWx1ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjaW1hbEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XG4gICAgbWF4VmFsdWU/OiBzdHJpbmc7XG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAgIHVuaXRQb3NpdGlvbj86ICdCRUZPUkUnIHwgJ0FGVEVSJztcbiAgICBtaW5WYWx1ZT86IHN0cmluZztcbiAgICB1bml0Pzogc3RyaW5nO1xuICAgIHVuaXF1ZT86IGJvb2xlYW47XG4gICAgZGlzcGxheVNjYWxlPzogc3RyaW5nO1xuICAgIGRpZ2l0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFZGl0b3JGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlGb3JtIHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgdHlwZTogJ1VTRVInIHwgJ09SR0FOSVpBVElPTicgfCAnR1JPVVAnIHwgJ0ZVTkNUSU9OJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZE1hcHBpbmdGb3JtIHtcbiAgICByZWxhdGVkRmllbGQ6IHN0cmluZztcbiAgICBmaWVsZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIHRodW1ibmFpbFNpemU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIG9wZW5Hcm91cD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBTZWxlY3RGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGVudGl0aWVzOiBFbnRpdHlGb3JtW107XG4gICAgZGVmYXVsdFZhbHVlPzogRW50aXR5Rm9ybVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIHByb3RvY29sPzogJ1dFQicgfCAnQ0FMTCcgfCAnTUFJTCc7XG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAgIG1pbkxlbmd0aD86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIG1heExlbmd0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGxvb2t1cDoge1xuICAgICAgICBsb29rdXBQaWNrZXJGaWVsZHM6IHN0cmluZ1tdO1xuICAgICAgICByZWxhdGVkS2V5RmllbGQ6IHN0cmluZztcbiAgICAgICAgcmVsYXRlZEFwcDoge1xuICAgICAgICAgICAgYXBwOiBzdHJpbmc7XG4gICAgICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIGZpZWxkTWFwcGluZ3M6IEZpZWxkTWFwcGluZ0Zvcm1bXTtcbiAgICAgICAgc29ydD86IHN0cmluZztcbiAgICAgICAgZmlsdGVyQ29uZD86IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmaWVkQXRGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge31cblxuZXhwb3J0IGludGVyZmFjZSBNb2RpZmllckZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpcGxlQ2hlY2tGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZ1tdO1xuICAgIG9wdGlvbnM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogT3B0aW9uRm9ybTtcbiAgICB9O1xuICAgIGFsaWduPzogJ0hPUklaT05UQUwnIHwgJ1ZFUlRJQ0FMJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aXBsZUxpbmVUZXh0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlwbGVTZWxlY3RGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZ1tdO1xuICAgIG9wdGlvbnM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogT3B0aW9uRm9ybTtcbiAgICB9O1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemF0aW9uU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBlbnRpdGllczogRW50aXR5Rm9ybVtdO1xuICAgIGRlZmF1bHRWYWx1ZT86IEVudGl0eUZvcm1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRJZEZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZVRhYmxlRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICByZWZlcmVuY2VUYWJsZToge1xuICAgICAgICBjb25kaXRpb246IHtcbiAgICAgICAgICAgIHJlbGF0ZWRGaWVsZDogc3RyaW5nO1xuICAgICAgICAgICAgZmllbGQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgICAgc2l6ZT86IHN0cmluZztcbiAgICAgICAgcmVsYXRlZEFwcDoge1xuICAgICAgICAgICAgYXBwOiBzdHJpbmc7XG4gICAgICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHNvcnQ/OiBzdHJpbmc7XG4gICAgICAgIGZpbHRlckNvbmQ/OiBzdHJpbmc7XG4gICAgICAgIGRpc3BsYXlGaWVsZHM6IHN0cmluZ1tdO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlQ2hlY2tGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgICBvcHRpb25zOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IE9wdGlvbkZvcm07XG4gICAgfTtcbiAgICBhbGlnbj86ICdIT1JJWk9OVEFMJyB8ICdWRVJUSUNBTCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlTGluZVRleHRGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGV4cHJlc3Npb24/OiBzdHJpbmc7XG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAgIG1pbkxlbmd0aD86IHN0cmluZztcbiAgICB1bmlxdWU/OiBib29sZWFuO1xuICAgIG1heExlbmd0aD86IHN0cmluZztcbiAgICBoaWRlRXhwcmVzc2lvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBPcHRpb25Gb3JtO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzQXNzaWduZWVGaWVsZEZvcm0gZXh0ZW5kcyBGaWVsZEZvcm0ge1xuICAgIGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c0ZpZWxkRm9ybSBleHRlbmRzIEZpZWxkRm9ybSB7XG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogQ2FsY0ZpZWxkRm9ybSB8IENhdGVnb3J5RmllbGRGb3JtIHwgRGF0ZUZpZWxkRm9ybSB8IERhdGV0aW1lRmllbGRGb3JtIHwgRGVjaW1hbEZpZWxkRm9ybSB8IEVkaXRvckZpZWxkRm9ybSB8IEZpbGVGaWVsZEZvcm0gfCBHcm91cEZpZWxkRm9ybSB8IEdyb3VwU2VsZWN0RmllbGRGb3JtIHwgTGlua0ZpZWxkRm9ybSB8IExvb2t1cEZpZWxkRm9ybSB8IE1vZGlmaWVkQXRGaWVsZEZvcm0gfCBNb2RpZmllckZpZWxkRm9ybSB8IE11bHRpcGxlQ2hlY2tGaWVsZEZvcm0gfCBNdWx0aXBsZUxpbmVUZXh0RmllbGRGb3JtIHwgTXVsdGlwbGVTZWxlY3RGaWVsZEZvcm0gfCBPcmdhbml6YXRpb25TZWxlY3RGaWVsZEZvcm0gfCBSZWNvcmRJZEZpZWxkRm9ybSB8IFJlZmVyZW5jZVRhYmxlRmllbGRGb3JtIHwgU2luZ2xlQ2hlY2tGaWVsZEZvcm0gfCBTaW5nbGVMaW5lVGV4dEZpZWxkRm9ybSB8IFNpbmdsZVNlbGVjdEZpZWxkRm9ybSB8IFN0YXR1c0Fzc2lnbmVlRmllbGRGb3JtIHwgU3RhdHVzRmllbGRGb3JtIHwgVGFibGVGb3JtIHwgVGltZUZpZWxkRm9ybSB8IFVzZXJTZWxlY3RGaWVsZEZvcm07XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmc7XG4gICAgZGVmYXVsdE5vd1ZhbHVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyU2VsZWN0RmllbGRGb3JtIGV4dGVuZHMgRmllbGRGb3JtIHtcbiAgICBlbnRpdGllczogRW50aXR5Rm9ybVtdO1xuICAgIGRlZmF1bHRWYWx1ZT86IEVudGl0eUZvcm1bXTtcbn0iLCJpbXBvcnQgeyBGaWVsZEZvcm0sQ2FsY0ZpZWxkRm9ybSxGaWVsZFR5cGUsIENhbGNGb3JtYXR9IGZyb20gXCIuLi90eXBlcy9GaWVsZExheW91dFwiO1xuXG4vKipcbiAqIOmbhuioiOaTjeS9nOWtkFxuICovXG5leHBvcnQgZW51bSBPcGVyYXRvciB7XG4gICAgU1VNID0gXCJTVU1cIixcbiAgICBBVkcgPSBcIkFWR1wiLFxuICAgIE1BWCA9IFwiTUFYXCIsXG4gICAgTUlOID0gXCJNSU5cIixcbiAgICBDT1VOVCA9IFwiQ09VTlRcIixcbiAgICBGSVJTVCA9IFwiRklSU1RcIixcbiAgICBMQVNUID0gXCJMQVNUXCJcbn1cblxuLyoqXG4gKiDpm4boqIjplqLmlbBcbiAqL1xuXG5leHBvcnQgY2xhc3MgQWdncmVnYXRvciB7XG4gICAgcHJpdmF0ZSBkYXRhOiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIGZpZWxkOiBGaWVsZEZvcm07XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBzdHJpbmdbXSwgZmllbGQ6IEZpZWxkRm9ybSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b051bWJlckFycmF5KCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLmRhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5maWVsZC5jb2RlfSDjgI3jga/mlbDlgKTjgavlpInmj5vjgafjgY3jgarjgYTjgZ/jgoHjgIHoqIjnrpfjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgIJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBudW1iZXJBcnJheTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1bSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xuICAgICAgICByZXR1cm4gbnVtYmVyQXJyYXkucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF2ZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBudW1iZXJBcnJheSA9IHRoaXMudG9OdW1iZXJBcnJheSgpO1xuICAgICAgICBjb25zdCB0b3RhbCA9IG51bWJlckFycmF5LnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbCwgMCk7XG4gICAgICAgIHJldHVybiB0b3RhbCAvIG51bWJlckFycmF5Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1heCgpOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5maWVsZC50eXBlID09PSBGaWVsZFR5cGUuTlVNQkVSICkge1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLnRvTnVtYmVyQXJyYXkoKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCguLi5udW1iZXJBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5maWVsZC50eXBlPT09RmllbGRUeXBlLkNBTEMpe1xuICAgICAgICAgICAgY29uc3QgY2FsY0ZpZWxkID0gdGhpcy5maWVsZCBhcyBDYWxjRmllbGRGb3JtO1xuICAgICAgICAgICAgaWYoY2FsY0ZpZWxkLmZvcm1hdD09PUNhbGNGb3JtYXQuTlVNQkVSIHx8IGNhbGNGaWVsZC5mb3JtYXQ9PT1DYWxjRm9ybWF0Lk5VTUJFUl9ESUdJVCl7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyQXJyYXkgPSB0aGlzLnRvTnVtYmVyQXJyYXkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoLi4ubnVtYmVyQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucmVkdWNlKChtYXgsIGl0ZW0pID0+IChpdGVtID4gbWF4ID8gaXRlbSA6IG1heCksIHRoaXMuZGF0YVswXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtaW4oKTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuZmllbGQudHlwZSA9PT0gRmllbGRUeXBlLk5VTUJFUiApIHtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlckFycmF5ID0gdGhpcy50b051bWJlckFycmF5KCk7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oLi4ubnVtYmVyQXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuZmllbGQudHlwZT09PUZpZWxkVHlwZS5DQUxDKXtcbiAgICAgICAgICAgIGNvbnN0IGNhbGNGaWVsZCA9IHRoaXMuZmllbGQgYXMgQ2FsY0ZpZWxkRm9ybTtcbiAgICAgICAgICAgIGlmKGNhbGNGaWVsZC5mb3JtYXQ9PT1DYWxjRm9ybWF0Lk5VTUJFUiB8fCBjYWxjRmllbGQuZm9ybWF0PT09Q2FsY0Zvcm1hdC5OVU1CRVJfRElHSVQpe1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlckFycmF5ID0gdGhpcy50b051bWJlckFycmF5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKC4uLm51bWJlckFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmRhdGE9PT1udWxsIHx8IHRoaXMuZGF0YS5sZW5ndGg9PT0wKXtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucmVkdWNlKChtaW4sIGl0ZW0pID0+IChpdGVtIDwgbWluID8gaXRlbSA6IG1pbiksIHRoaXMuZGF0YVswXSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpcnN0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA/IHRoaXMuZGF0YVswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsYXN0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA/IHRoaXMuZGF0YVt0aGlzLmRhdGEubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYWxjdWxhdGUob3BlcmF0b3I6IE9wZXJhdG9yKTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5TVU06XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdW0oKTtcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkFWRzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF2ZygpO1xuICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuTUFYOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXgoKTtcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLk1JTjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluKCk7XG4gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5DT1VOVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnQoKTtcbiAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkZJUlNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXJzdCgpO1xuICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0b3IuTEFTVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdCgpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQge1xuICBJQWN0aW9uLFxuICBJQWN0aW9uUmVzdWx0LFxuICBJQWN0aW9uTm9kZSxcbiAgSUFjdGlvblByb3BlcnR5LFxuICBJQ29udGV4dCxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHtLaW50b25lUmVzdEFQSUNsaWVudH0gZnJvbSAnQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50JztcbmltcG9ydCB7IEFnZ3JlZ2F0b3IsT3BlcmF0b3J9IGZyb20gJy4uL3V0aWwvYWdncmVnYXRlcyc7XG5pbXBvcnQgeyBGaWVsZEZvcm0gfSBmcm9tIFwiLi4vdHlwZXMvRmllbGRMYXlvdXRcIjtcblxuaW50ZXJmYWNlIElEYXRhUHJvY2Vzc2luZ1Byb3BzIHtcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgc291cmNlczogU291cmNlcztcbiAgY29uZGl0aW9uOiBzdHJpbmc7XG4gIHZlck5hbWU/OiBWZXJOYW1lO1xufVxuXG5pbnRlcmZhY2UgQ29uZGl0aW9uIHtcbiAgcXVlcnlTdHJpbmc6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFZlck5hbWUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgdmFyczogVmFyW107XG59XG5cbmludGVyZmFjZSBWYXIge1xuICBpZDogc3RyaW5nO1xuICBmaWVsZDogRmllbGRGb3JtO1xuICBsb2dpY2FsT3BlcmF0b3I6IENhbGNPcGVyYXRvcjtcbiAgdk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENhbGNPcGVyYXRvciB7XG4gIG9wZXJhdG9yOiBPcGVyYXRvcjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNvdXJjZXMge1xuICBhcHA6IEFwcDtcbiAgZmllbGRzOiBGaWVsZEZvcm1bXTtcbn1cblxuaW50ZXJmYWNlIEFwcCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbnR5cGUgUmVzdWx0ID0ge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHZhbHVlOiBhbnlbXTtcbiAgfTtcbn07XG5cbnR5cGUgQW55T2JqZWN0ID0ge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59O1xuXG5leHBvcnQgY2xhc3MgRGF0YVByb2Nlc3NpbmdBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gIHByb3BzOiBJRGF0YVByb2Nlc3NpbmdQcm9wcyA7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLjg4fjg7zjgr/lh6bnkIZcIjtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIGRpc3BsYXlOYW1lOicnLFxuICAgICAgY29uZGl0aW9uOicnLFxuICAgICAgc291cmNlczp7XG4gICAgICAgIGFwcDp7XG4gICAgICAgICAgaWQ6XCJcIlxuICAgICAgICB9LFxuICAgICAgICBmaWVsZHM6W11cbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzKFxuICAgIGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLFxuICAgIGV2ZW50OiBhbnksXG4gICAgY29udGV4dDogSUNvbnRleHRcbiAgKTogUHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG5cbiAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJRGF0YVByb2Nlc3NpbmdQcm9wcztcbiAgICBjb25zdCBjb25kaXRpb24gPSBKU09OLnBhcnNlKHRoaXMucHJvcHMuY29uZGl0aW9uKSBhcyBDb25kaXRpb247XG4gICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgIGNhbk5leHQ6IHRydWUsXG4gICAgICByZXN1bHQ6IFwiXCIsXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldFF1ZXJ5KGNvbmRpdGlvbi5xdWVyeVN0cmluZyxjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5zZWxlY3REYXRhKHF1ZXJ5KTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coXCJkYXRhIFwiLCBkYXRhKTtcblxuICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lKXtcbiAgICAgICAgIGNvbnN0IHZhclZhbHVlcz0gdGhpcy5wcm9wcy52ZXJOYW1lLnZhcnMucmVkdWNlKChhY2MsIGYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFzPWRhdGFbZi5maWVsZC5jb2RlXS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGFnZyA9IG5ldyBBZ2dyZWdhdG9yKGRhdGFzLGYuZmllbGQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYWdnLmNhbGN1bGF0ZShmLmxvZ2ljYWxPcGVyYXRvci5vcGVyYXRvcilcbiAgICAgICAgICAgIGFjY1tmLnZOYW1lXT1yZXN1bHQ7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9IGFzIEFueU9iamVjdCk7XG4gICAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdPXZhclZhbHVlcztcbiAgICAgICAgY29uc29sZS5sb2coXCJjb250ZXh0IFwiLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFxuICAgKiBAcGFyYW0gc3RyIFxuICAgKiBAcGFyYW0gdmFycyBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBnZXRRdWVyeSA9IChzdHI6IHN0cmluZywgdmFyczogYW55KSA9PiB7XG4gICAgY29uc29sZS5sb2coc3RyKTtcbiAgICBjb25zdCByZWdleCA9IC92YXJcXCgoLio/KVxcKS9nO1xuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgdmFyTmFtZSA9IG1hdGNoWzFdO1xuICAgICAgaWYgKHZhck5hbWUgaW4gdmFycykge1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShtYXRjaFswXSwgdmFyc1t2YXJOYW1lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOWkieaVsCR7dmFyTmFtZX3jgYzopovjgaTjgYvjgorjgb7jgZvjgpNgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coc3RyKTtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIC8qKlxuICAgKiDjg4fjg7zjgr/jgpLlj5blvpfjgZnjgotcbiAgICogQHBhcmFtIHF1ZXJ5IFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIHNlbGVjdERhdGEgPSBhc3luYyAoIHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXBpID0gbmV3IEtpbnRvbmVSZXN0QVBJQ2xpZW50KCk7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5wcm9wcy5zb3VyY2VzLmZpZWxkcy5tYXAoKGZpZWxkKT0+ZmllbGQuY29kZSk7XG4gICAgY29uc3QgcmVzcCA9ICBhd2FpdCBhcGkucmVjb3JkLmdldEFsbFJlY29yZHMoe1xuICAgICAgICBhcHA6IHRoaXMucHJvcHMuc291cmNlcy5hcHAuaWQsXG4gICAgICAgIGZpZWxkczpmaWVsZHMsXG4gICAgICAgIGNvbmRpdGlvbjpxdWVyeVxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHQ6IFJlc3VsdCA9IHt9O1xuICAgICAgcmVzcC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnQpKSB7XG4gICAgICAgICAgaWYgKCFyZXN1bHRba2V5XSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB7IHR5cGU6IHZhbHVlLnR5cGUsIHZhbHVlOiBbXSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRba2V5XS52YWx1ZS5wdXNoKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgICBcbiAgfTtcblxuICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gIH1cbn1cblxubmV3IERhdGFQcm9jZXNzaW5nQWN0aW9uKCk7IiwiaW1wb3J0IHtcbiAgSUFjdGlvbixcbiAgSUFjdGlvblJlc3VsdCxcbiAgSUFjdGlvbk5vZGUsXG4gIElBY3Rpb25Qcm9wZXJ0eSxcbiAgSUNvbnRleHQsXG59IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IEtpbnRvbmVSZXN0QVBJQ2xpZW50IH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHsgTG9va3VwIH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL0tpbnRvbmVGaWVsZHMvdHlwZXMvcHJvcGVydHlcIjtcbmltcG9ydCB7IEZpZWxkRm9ybSwgRmllbGRUeXBlIH0gZnJvbSBcIi4uL3R5cGVzL0ZpZWxkTGF5b3V0XCI7XG5pbnRlcmZhY2UgUHJvcHMge1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBzb3VyY2VzOiBTb3VyY2VzO1xuICBkYXRhTWFwcGluZzogRGF0YU1hcHBpbmc7XG59XG5cbmludGVyZmFjZSBEYXRhTWFwcGluZyB7XG4gIGRhdGE6IE1hcHBpbmdbXTtcbiAgY3JlYXRlV2l0aE51bGw6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBNYXBwaW5nIHtcbiAgaWQ6IHN0cmluZztcbiAgZnJvbTogRnJvbTtcbiAgdG86IFRvO1xuICBpc0tleTogYm9vbGVhbjtcbn1cblxuXG5cbmludGVyZmFjZSBUbyB7XG4gIGFwcDogQXBwO1xuICBmaWVsZHM6RmllbGRGb3JtW107XG4gIGlzRGlhbG9nVmlzaWJsZTogYm9vbGVhbjtcbn1cblxuXG5pbnRlcmZhY2UgRnJvbSB7XG4gIHNoYXJlZFRleHQ6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgb2JqZWN0VHlwZTogJ3ZhcmlhYmxlJ3wnZmllbGQnfCd0ZXh0Jztcbn1cblxuaW50ZXJmYWNlIElWYXIgZXh0ZW5kcyBGcm9te1xuICBuYW1lOntcbiAgICBuYW1lOnN0cmluZztcbiAgfVxufVxuXG5pbnRlcmZhY2UgSUZyb21GaWVsZCBleHRlbmRzIEZyb20sRmllbGRGb3Jte1xuXG59XG5pbnRlcmZhY2UgU291cmNlcyB7XG4gIGFwcDogQXBwO1xufVxuXG5pbnRlcmZhY2UgQXBwIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkYXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVXBkYXRlQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBkYXRhTWFwcGluZ1Byb3BzOiBQcm9wcztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLjg4fjg7zjgr/mm7TmlrBcIjtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XG4gICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzID0ge30gYXMgUHJvcHM7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICB9XG5cbiAgYXN5bmMgcHJvY2VzcyhcbiAgICBhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZSxcbiAgICBldmVudDogYW55LFxuICAgIGNvbnRleHQ6IElDb250ZXh0XG4gICk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgUHJvcHM7XG4gICAgY29uc29sZS5sb2coY29udGV4dCk7XG4gICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgIGNhbk5leHQ6IHRydWUsXG4gICAgICByZXN1bHQ6IFwiXCIsXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb29rdXBGaXhlZEZpZWxkQ29kZXMgPSBhd2FpdCBnZXRMb29rdXBGaXhlZEZpZWxkQ29kZXMoXG4gICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5zb3VyY2VzLmFwcC5pZFxuICAgICAgKTtcblxuICAgICAgLy8gY3JlYXRlV2l0aE51bGwg44GM5pyJ5Yq544Gq5aC05ZCI44Gv44CBNCDnlarnm67jga7jg5Hjg6njg6Hjg7zjgr/jg7zjgpIgdHJ1ZSDjgavjgZfjgaYgZG9VcGRhdGUg6Zai5pWw44OW44Op44Oz44OB44KS5a6f6KGM44GX44G+44GZ44CCXG4gICAgICBpZiAodGhpcy5kYXRhTWFwcGluZ1Byb3BzLmRhdGFNYXBwaW5nLmNyZWF0ZVdpdGhOdWxsKSB7XG4gICAgICAgIGF3YWl0IGRvVXBkYXRlKFxuICAgICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5kYXRhTWFwcGluZy5kYXRhLFxuICAgICAgICAgIHRoaXMuZGF0YU1hcHBpbmdQcm9wcy5zb3VyY2VzLmFwcC5pZCxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHRydWUsIC8vIOOCreODvOOBjOOBquOBhOWgtOWQiOOAgeOBvuOBn+OBr+OCreODvOOBp+OCv+ODvOOCsuODg+ODiOOBjOimi+OBpOOBi+OCieOBquOBhOWgtOWQiOOBq+OAgeODnuODg+ODlOODs+OCsOadoeS7tuOBq+OCiOOBo+OBpuaWsOOBl+OBhOODrOOCs+ODvOODieOCkuS9nOaIkOOBmeOCi+OBi+OBqeOBhuOBi+OCkuaxuuWumuOBmeOCi+OBn+OCgeOBq+S9v+eUqOOBleOCjOOBvuOBmeOAglxuICAgICAgICAgIGxvb2t1cEZpeGVkRmllbGRDb2Rlc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8g44Kt44O844GM44Gq44GE44Go5pu05paw5a++6LGh44KS5Y+W5b6X44Gn44GN44Gq44GE44Gf44KB44CB44GT44Gu5pmC54K544Gn44Gu44G/5pu05paw44GM6KGM44KP44KM44G+44GZ44CCIGRvVXBkYXRlIOmWouaVsOOBriA0IOeVquebruOBruODkeODqeODoeODvOOCv+ODvOOBryBmYWxzZSDjgafjgZnjgIJcbiAgICAgICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzLmRhdGFNYXBwaW5nLmRhdGFcbiAgICAgICAgICAubWFwKChtKSA9PiBtLmlzS2V5KVxuICAgICAgICAgIC5maW5kKChpc0tleSkgPT4gaXNLZXkgPT09IHRydWUpXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgZG9VcGRhdGUoXG4gICAgICAgICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzLmRhdGFNYXBwaW5nLmRhdGEsXG4gICAgICAgICAgdGhpcy5kYXRhTWFwcGluZ1Byb3BzLnNvdXJjZXMuYXBwLmlkLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgbG9va3VwRml4ZWRGaWVsZENvZGVzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBkb0NyZWF0ZShcbiAgICAgICAgICB0aGlzLmRhdGFNYXBwaW5nUHJvcHMuZGF0YU1hcHBpbmcuZGF0YSxcbiAgICAgICAgICB0aGlzLmRhdGFNYXBwaW5nUHJvcHMuc291cmNlcy5hcHAuaWQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBsb29rdXBGaXhlZEZpZWxkQ29kZXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICByZXN1bHQuY2FuTmV4dCA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcImRhdGFNYXBwaW5nUHJvcHNcIiwgdGhpcy5kYXRhTWFwcGluZ1Byb3BzKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gIH1cbn1cblxubmV3IERhdGFVcGRhdGVBY3Rpb24oKTtcblxuY29uc3QgZ2V0Q29udGV4dFZhckJ5UGF0aCA9IChvYmo6IGFueSwgcGF0aDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgb2JqKTtcbn07XG5cbmludGVyZmFjZSBVcGRhdGVSZWNvcmQge1xuICBpZDogc3RyaW5nO1xuICByZWNvcmQ6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICB2YWx1ZTogYW55O1xuICAgIH07XG4gIH07XG59XG5cbmNvbnN0IGNsaWVudCA9IG5ldyBLaW50b25lUmVzdEFQSUNsaWVudCgpO1xuXG5jb25zdCBnZXRGcm9tVmFsdWU9KGl0ZW06TWFwcGluZyxjb250ZXh0OklDb250ZXh0KT0+e1xuICBpZiAoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIikge1xuICAgIGNvbnN0IHJmcm9tID1pdGVtLmZyb20gYXMgSVZhcjtcbiAgICByZXR1cm4gIGdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMscmZyb20ubmFtZS5uYW1lKTtcbiAgfWVsc2UgaWYoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwiZmllbGRcIil7XG4gICAgY29uc3QgZmllbGQgPSBpdGVtLmZyb20gYXMgSUZyb21GaWVsZDtcbiAgICByZXR1cm4gY29udGV4dC5yZWNvcmRbZmllbGQuY29kZV0udmFsdWU7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIGl0ZW0uZnJvbS5zaGFyZWRUZXh0O1xuICB9XG59XG5cbmNvbnN0IGRvVXBkYXRlID0gYXN5bmMgKFxuICBtYXBwaW5nRGF0YTogTWFwcGluZ1tdLFxuICBhcHBJZDogc3RyaW5nLFxuICBjb250ZXh0OiBJQ29udGV4dCxcbiAgbmVlZENyZWF0ZTogYm9vbGVhbixcbiAgbG9va3VwRml4ZWRGaWVsZENvZGVzOiBzdHJpbmdbXVxuKSA9PiB7XG4gIGNvbnN0IHRhcmdldEZpZWxkID0gYXdhaXQgZmluZFVwZGF0ZUZpZWxkKG1hcHBpbmdEYXRhLCBhcHBJZCwgY29udGV4dCk7XG4gIGNvbnNvbGUubG9nKHRhcmdldEZpZWxkKTtcbiAgaWYgKHRhcmdldEZpZWxkLnJlY29yZHMubGVuZ3RoID09PSAwICYmIG5lZWRDcmVhdGUpIHtcbiAgICBhd2FpdCBkb0NyZWF0ZShtYXBwaW5nRGF0YSwgYXBwSWQsIGNvbnRleHQsIGxvb2t1cEZpeGVkRmllbGRDb2Rlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8g44Oe44OD44OU44Oz44Kw44OH44O844K/44KS5Y2Y57SU44Gq44Kq44OW44K444Kn44Kv44OI44Gr5Yem55CG44GX44CB44K944O844K55YCk44GM5aSJ5pWw44Gu5aC05ZCI44Gv5aSJ5pWw44KS572u44GN5o+b44GI44G+44GZ44CCXG4gICAgY29uc3QgbWFwcGluZ1J1bGVzID0gbWFwcGluZ0RhdGFcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChtKSA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKG0uZnJvbSkubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICFsb29rdXBGaXhlZEZpZWxkQ29kZXMuaW5jbHVkZXMobS50by5maWVsZHNbMF0uY29kZSlcbiAgICAgIClcbiAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgaWYgKG0uZnJvbS5vYmplY3RUeXBlID09PSBcInZhcmlhYmxlXCIpIHtcbiAgICAgICAgICBjb25zdCByZnJvbSA9bS5mcm9tIGFzIElWYXI7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRDb250ZXh0VmFyQnlQYXRoKGNvbnRleHQudmFyaWFibGVzLHJmcm9tLm5hbWUubmFtZSksXG4gICAgICAgICAgICBjb2RlOiBtLnRvLmZpZWxkc1swXS5jb2RlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1lbHNlIGlmKG0uZnJvbS5vYmplY3RUeXBlID09PSBcImZpZWxkXCIpe1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbS5mcm9tIGFzIElGcm9tRmllbGQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBjb250ZXh0LnJlY29yZFtmaWVsZC5jb2RlXS52YWx1ZSxcbiAgICAgICAgICAgIGNvZGU6IG0udG8uZmllbGRzWzBdLmNvZGUsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG0uZnJvbS5zaGFyZWRUZXh0LFxuICAgICAgICAgICAgY29kZTogbS50by5maWVsZHNbMF0uY29kZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZVJlY29yZHM6IFVwZGF0ZVJlY29yZFtdID0gdGFyZ2V0RmllbGQucmVjb3Jkcy5tYXAoXG4gICAgICAodGFyZ2V0UmVjb3JkKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVJlY29yZDogVXBkYXRlUmVjb3JkW1wicmVjb3JkXCJdID0ge307XG5cbiAgICAgICAgLy8g44Oe44OD44OU44Oz44Kw5YaF44Gu44Or44O844Or44Gr44OS44OD44OI44GX44Gf44OV44Kj44O844Or44OJ44Gu44G/44GM5pu05paw44GV44KM44G+44GZ44CCXG4gICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBtYXBwaW5nUnVsZXMpIHtcbiAgICAgICAgICBpZiAodGFyZ2V0UmVjb3JkW21hcHBpbmcuY29kZV0pIHtcbiAgICAgICAgICAgIHVwZGF0ZVJlY29yZFttYXBwaW5nLmNvZGVdID0ge1xuICAgICAgICAgICAgICB2YWx1ZTogbWFwcGluZy52YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogdGFyZ2V0UmVjb3JkLiRpZC52YWx1ZSBhcyBzdHJpbmcsXG4gICAgICAgICAgcmVjb3JkOiB1cGRhdGVSZWNvcmQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnNvbGUubG9nKHVwZGF0ZVJlY29yZHMpO1xuICAgIGF3YWl0IGNsaWVudC5yZWNvcmQudXBkYXRlUmVjb3Jkcyh7XG4gICAgICBhcHA6IGFwcElkLFxuICAgICAgcmVjb3JkczogdXBkYXRlUmVjb3JkcyxcbiAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgbWFrZVF1ZXJ5PShmaWVsZDpGaWVsZEZvcm0sa2V5OmFueSk9PntcbiAgaWYoZmllbGQudHlwZT09PUZpZWxkVHlwZS5OVU1CRVIgfHwgZmllbGQudHlwZT09PUZpZWxkVHlwZS5SRUNPUkRfTlVNQkVSKXtcbiAgICByZXR1cm4gYCR7ZmllbGQuY29kZX0gPSAke051bWJlcihrZXkpfWBcbiAgfVxuICBpZih0eXBlb2Yga2V5PT09J3N0cmluZycpe1xuICAgIHJldHVybiBgJHtmaWVsZC5jb2RlfSA9IFwiJHtrZXl9XCJgXG4gIH1cbn1cblxuXG5jb25zdCBmaW5kVXBkYXRlRmllbGQgPSBhc3luYyAoXG4gIG1hcHBpbmdEYXRhOiBNYXBwaW5nW10sXG4gIGFwcElkOiBzdHJpbmcsXG4gIGNvbnRleHQ6IElDb250ZXh0XG4pID0+IHtcbiAgY29uc3QgcXVlcnlTdHIgPSBtYXBwaW5nRGF0YVxuICAgIC5maWx0ZXIoKG0pID0+IG0udG8uYXBwICYmIG0udG8uZmllbGRzICYmIG0udG8uZmllbGRzLmxlbmd0aCA+IDAgJiYgbS5pc0tleSlcbiAgICAubWFwKChtKSA9PiB7XG4gICAgICBpZiAobS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIikge1xuICAgICAgICBjb25zdCB2ZnJvbSA9IG0uZnJvbSBhcyBJVmFyO1xuICAgICAgICByZXR1cm4gbWFrZVF1ZXJ5KG0udG8uZmllbGRzWzBdLGdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMgLCB2ZnJvbS5uYW1lLm5hbWUpKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYobS5mcm9tLm9iamVjdFR5cGUgPT09IFwiZmllbGRcIil7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbS5mcm9tIGFzIElGcm9tRmllbGQ7XG4gICAgICAgIHJldHVybiBtYWtlUXVlcnkobS50by5maWVsZHNbMF0sY29udGV4dC5yZWNvcmRbZmllbGQuY29kZV0udmFsdWUpO1xuICAgICAgfSBcbiAgICAgIGVsc2V7XG4gICAgICAgIHJldHVybiBtYWtlUXVlcnkobS50by5maWVsZHNbMF0sbS5mcm9tLnNoYXJlZFRleHQpO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmpvaW4oXCImXCIpO1xuICAvLyDmpJzntKLmnaHku7bjgYznqbrjga7loLTlkIjjga/lhajjg6zjgrPjg7zjg4njgpLov5TjgZnjgZ/jgoHjgIHmpJzntKLlr77osaHjgYzopovjgaTjgYvjgonjgarjgYTloLTlkIjjga/mpJzntKLjga/ooYzjgo/jgozjgb7jgZvjgpPjgIJcbiAgaWYgKHF1ZXJ5U3RyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWNvcmRzOiBbXSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCBjbGllbnQucmVjb3JkLmdldFJlY29yZHMoe1xuICAgICAgYXBwOiBhcHBJZCxcbiAgICAgIC8vIHF1ZXJ5OiB1bmRlZmluZWRcbiAgICAgIHF1ZXJ5OiBxdWVyeVN0cixcbiAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgZG9DcmVhdGUgPSBhc3luYyAoXG4gIG1hcHBpbmdEYXRhOiBNYXBwaW5nW10sXG4gIGFwcElkOiBzdHJpbmcsXG4gIGNvbnRleHQ6IElDb250ZXh0LFxuICBsb29rdXBGaXhlZEZpZWxkQ29kZXM6IHN0cmluZ1tdXG4pID0+IHtcbiAgY29uc3QgZmlsdGVySGFuZGxlciA9ICAoaXRlbTpNYXBwaW5nKT0+e1xuICAgIGlmKCFpdGVtLnRvLmZpZWxkcyB8fCBpdGVtLnRvLmZpZWxkcy5sZW5ndGg9PT0wKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwidmFyaWFibGVcIiAmJiAoaXRlbS5mcm9tIGFzIElWYXIpLm5hbWUubmFtZSAgKXtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZihpdGVtLmZyb20ub2JqZWN0VHlwZSA9PT0gXCJmaWVsZFwiICYmIChpdGVtLmZyb20gYXMgSUZyb21GaWVsZCkuY29kZSl7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYoaXRlbS5mcm9tLm9iamVjdFR5cGUgPT09IFwidGV4dFwiICYmIGl0ZW0uZnJvbS5zaGFyZWRUZXh0IT09bnVsbCl7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlY29yZCA9IG1hcHBpbmdEYXRhXG4gICAgLmZpbHRlcihmaWx0ZXJIYW5kbGVyKVxuICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFsb29rdXBGaXhlZEZpZWxkQ29kZXMuaW5jbHVkZXMoaXRlbS50by5maWVsZHNbMF0uY29kZSkpXG4gICAgLnJlZHVjZSgoYWNjdW11bGF0b3IsIGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjY3VtdWxhdG9yLFxuICAgICAgICBbaXRlbS50by5maWVsZHNbMF0uY29kZV06IHtcbiAgICAgICAgICB2YWx1ZTogZ2V0RnJvbVZhbHVlKGl0ZW0sY29udGV4dCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sIHt9KTtcbiAgaWYgKHJlY29yZCAmJiBPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhyZWNvcmQpO1xuICAgIGF3YWl0IGNsaWVudC5yZWNvcmQuYWRkUmVjb3JkKHtcbiAgICAgIGFwcDphcHBJZCxcbiAgICAgIHJlY29yZDpyZWNvcmRcbiAgICB9KTtcbiAgICAvLyBhd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoXCIvay92MS9yZWNvcmQuanNvblwiLCB0cnVlKSwgXCJQT1NUXCIsIHtcbiAgICAvLyAgIGFwcDogYXBwSWQsXG4gICAgLy8gICByZWNvcmQ6IHJlY29yZCxcbiAgICAvLyB9KTtcbiAgfVxufTtcblxuY29uc3QgZ2V0TG9va3VwRml4ZWRGaWVsZENvZGVzID0gYXN5bmMgKGFwcElkOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGF3YWl0IGNsaWVudC5hcHBcbiAgICAuZ2V0Rm9ybUZpZWxkcyh7IGFwcDogYXBwSWQgfSlcbiAgICAudGhlbigocmVzcCkgPT5cbiAgICAgIE9iamVjdC52YWx1ZXMocmVzcC5wcm9wZXJ0aWVzKVxuICAgICAgICAuZmlsdGVyKChmKSA9PiAoZiBhcyBMb29rdXApLmxvb2t1cCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAuZmxhdE1hcCgoZikgPT4gKGYgYXMgTG9va3VwKS5sb29rdXAuZmllbGRNYXBwaW5ncy5tYXAoKG0pID0+IG0uZmllbGQpKVxuICAgICk7XG59O1xuIiwiaW1wb3J0IHtcbiAgSUFjdGlvbixcbiAgSUFjdGlvblJlc3VsdCxcbiAgSUFjdGlvbk5vZGUsXG4gIElBY3Rpb25Qcm9wZXJ0eSxcbiAgSUNvbnRleHQsXG4gIElGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuXG5cbmludGVyZmFjZSBJQ3VycmVudEZpZWxkR2V0UHJvcHMge1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBmaWVsZDogSUZpZWxkO1xuICB2ZXJOYW1lOiBWZXJOYW1lO1xufVxuXG5pbnRlcmZhY2UgVmVyTmFtZSB7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuXG5leHBvcnQgY2xhc3MgQ3VycmVudEZpZWxkR2V0QWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBwcm9wczogSUN1cnJlbnRGaWVsZEdldFByb3BzO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5hbWUgPSBcIuODleOCo+ODvOODq+ODieOBruWApOOCkuWPluW+l+OBmeOCi1wiO1xuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcbiAgICB0aGlzLnByb3BzID0ge30gYXMgSUN1cnJlbnRGaWVsZEdldFByb3BzO1xuICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3MoXG4gICAgYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsXG4gICAgZXZlbnQ6IGFueSxcbiAgICBjb250ZXh0OiBJQ29udGV4dFxuICApOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJQ3VycmVudEZpZWxkR2V0UHJvcHM7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG5cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgIHJlc3VsdDogJycsXG4gICAgfSBhcyBJQWN0aW9uUmVzdWx0O1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDjg5XjgqPjg7zjg6vjg4lbJHt0aGlzLnByb3BzLmZpZWxkLmNvZGV9XeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAgmApO1xuICAgICAgfVxuICAgICAgLy/lpInmlbDoqK3lrppcbiAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcbiAgICAgICAgY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdPXJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgfVxuICAgIH0gXG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgIHJlc3VsdC5jYW5OZXh0ID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gIH1cbn1cblxubmV3IEN1cnJlbnRGaWVsZEdldEFjdGlvbigpO1xuIiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7ICBJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCwgSUNvbnRleHR9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElSZWd1bGFyQ2hlY2tQcm9wc3tcbiAgICBmaWVsZDpJRmllbGQ7Ly/jg4Hjgqfjg4Pjgq/jgZnjgovjg5XjgqPjg7zjg6vjg4njga7lr77osaFcbiAgICBtZXNzYWdlOnN0cmluZzsvL+OCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgIHJlZ0V4cHJlc3Npb246c3RyaW5nOy8v5q2j6KaP6KGo54++5byPXG59XG4vKipcbiAqIOato+imj+ihqOePvuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgUmVndWxhckNoZWNrQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklSZWd1bGFyQ2hlY2tQcm9wcztcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLm5hbWU9XCLmraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBtZXNzYWdlOicnLFxuICAgICAgICAgICAgcmVnRXhwcmVzc2lvbjonJ1xuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3JlZ0V4cHJlc3Npb24naW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJUmVndWxhckNoZWNrUHJvcHM7XG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBruioiOeul+e1kOaenOOCkuWPluW+l1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLnByb3BzLnJlZ0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgaWYoIXJlZ2V4LnRlc3QodmFsdWUpKXtcbiAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvcj10aGlzLnByb3BzLm1lc3NhZ2U7IFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG4gICAgXG59XG5uZXcgUmVndWxhckNoZWNrQWN0aW9uKCk7XG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgSUFjdGlvbiwgSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElNYWlsQ2hlY2tQcm9wcyB7XG4gICAgZmllbGQ6IElGaWVsZDsvL+ODgeOCp+ODg+OCr+OBmeOCi+ODleOCo+ODvOODq+ODieOBruWvvuixoVxuICAgIG1lc3NhZ2U6IHN0cmluZzsvL+OCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgIGVtYWlsQ2hlY2s6c3RyaW5nO1xufVxuLyoqXG4gKiDjg6Hjg7zjg6vjgqLjg4njg6zjgrnjg4Hjgqfjg4Pjgq/jgqLjgq/jgrfjg6fjg7NcbiAqL1xuZXhwb3J0IGNsYXNzIE1haWxDaGVja0FjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gICAgcHJvcHM6IElNYWlsQ2hlY2tQcm9wcztcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gXCLjg6Hjg7zjg6vjgqLjg4njg6zjgrnjg4Hjgqfjg4Pjgq9cIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xuICAgICAgICB0aGlzLnByb3BzID0ge1xuICAgICAgICAgICAgZmllbGQ6IHsgY29kZTogJycgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgZW1haWxDaGVjazonJ1xuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsIGV2ZW50OiBhbnksY29udGV4dDpJQ29udGV4dCk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuXG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ21lc3NhZ2UnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ2VtYWlsQ2hlY2snIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSU1haWxDaGVja1Byb3BzO1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xuICAgICAgICAgICAgLy/lr77osaHjg5XjgqPjg7zjg6vjg4njga7lrZjlnKjjg4Hjgqfjg4Pjgq9cbiAgICAgICAgICAgIGlmKCEodGhpcy5wcm9wcy5maWVsZC5jb2RlIGluIHJlY29yZCkpe1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg44OV44Kj44O844Or44OJWyR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfV3jgYzopovjgaTjgYvjgorjgb7jgZvjgpPjgafjgZfjgZ/jgIJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0udmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmVtYWlsQ2hlY2sgPT09ICfljrPmoLwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEvXlthLXpBLVowLTlfLcKlLl0rQFthLXpBLVowLTlfLV0rKFxcLlthLXpBLVowLTlfLV0rKSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvciA9IHRoaXMucHJvcHMubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDsgXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQ9dHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZW1haWxDaGVjayA9PT0gJ+OChuOCi+OCgScpIHtcbiAgICAgICAgICAgICAgICBpZiAoIS9eW15AXStAW15AXSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvciA9IHRoaXMucHJvcHMubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDsgXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQ9dHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgfVxuXG59XG5uZXcgTWFpbENoZWNrQWN0aW9uKCk7XG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSVN0ckNvdW50Q2hlY2tQcm9wc3tcbiAgICBmaWVsZDpJRmllbGQ7Ly/jg4Hjgqfjg4Pjgq/jgZnjgovjg5XjgqPjg7zjg6vjg4njga7lr77osaFcbiAgICBtZXNzYWdlOnN0cmluZzsvL+OCqOODqeODvOODoeODg+OCu+ODvOOCuFxuICAgIG1heExlbmd0aDpudW1iZXI7Ly9cbn1cbi8qKlxuICog5q2j6KaP6KGo54++44OB44Kn44OD44Kv44Ki44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJDb3VudENoZWNrQWNpdG9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklTdHJDb3VudENoZWNrUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5paH5a2X5pWw44OB44Kn44OD44KvXCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxuICAgICAgICAgICAgbWVzc2FnZTonJyxcbiAgICAgICAgICAgIG1heExlbmd0aDowXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnbWVzc2FnZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnc3RyRXhwcmVzc2lvbidpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSVN0ckNvdW50Q2hlY2tQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy5wcm9wcy5tYXhMZW5ndGg7XG4gICAgICAgICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJyApe1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9ZWxzZSBpZihtYXhMZW5ndGggPCB2YWx1ZS5sZW5ndGgpe1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gdGhpcy5wcm9wcy5tZXNzYWdlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3IgPSBudWxsOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgXG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxuICAgIFxufVxubmV3IFN0ckNvdW50Q2hlY2tBY2l0b24oKTtcbiIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElBY3Rpb24sIElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCAsSUNvbnRleHQsIElWYXJOYW1lfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcclxuLyoqXHJcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxyXG4gKi9cclxuaW50ZXJmYWNlIElEYXRldGltZUdldHRlclByb3BzIHtcclxuICAgIC8qKuWkieaVsOOBruWQjeWJjSAqL1xyXG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcclxufVxyXG4vKipcclxuICog54++5Zyo5pel5pmC44KS5Y+W5b6X44GZ44KL44Ki44Kv44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGF0ZXRpbWVHZXR0ZXJBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIHByb3BzOiBJRGF0ZXRpbWVHZXR0ZXJQcm9wcztcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwi54++5Zyo5pel5pmCXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xyXG4gICAgICAgIHRoaXMucHJvcHMgPSB7XHJcbiAgICAgICAgICAgIHZlck5hbWU6e25hbWU6Jyd9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcclxuICAgICAqIEBwYXJhbSBldmVudCBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLCBldmVudDogYW55LGNvbnRleHQ6SUNvbnRleHQpOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICBjYW5OZXh0OiB0cnVlLFxyXG4gICAgICAgICAgICByZXN1bHQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcblxyXG4gICAgICAgICAgICBpZiAoISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSURhdGV0aW1lR2V0dGVyUHJvcHM7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT10b2RheS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcclxuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG5cclxufVxyXG5uZXcgRGF0ZXRpbWVHZXR0ZXJBY3Rpb24oKTtcclxuIiwiXG5cbmltcG9ydCB7IGVhY2ggfSBmcm9tIFwianF1ZXJ5XCI7XG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uVHJlZSB9IGZyb20gJy4uL3R5cGVzL0NvbmRpdGlvbnMnO1xuXG5cblxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElJbnNlcnRWYWx1ZVByb3Bze1xuICAgIGZpZWxkOklGaWVsZDtcbiAgICBjb25kaXRpb246c3RyaW5nO1xuICAgIHZhbHVlOnN0cmluZztcbiAgICBzaG93OnN0cmluZztcbn1cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEluc2VydFZhbHVlQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklJbnNlcnRWYWx1ZVByb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuWApOOCkuaMv+WFpeOBmeOCi1wiOy8vIERC44Gr55m76Yyy44GX44Gf44Ki44Kv44K344On44Oz5ZCNXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgIC8v44OX44Ot44OR44OG44Kj5bGe5oCn44Gu5Yid5pyf5YyWXG4gICAgICAgIHRoaXMucHJvcHM9e1xuICAgICAgICAgICAgZmllbGQ6e2NvZGU6Jyd9LFxuICAgICAgICAgICAgY29uZGl0aW9uOicnLFxuICAgICAgICAgICAgdmFsdWU6JycsXG4gICAgICAgICAgICBzaG93OicnXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOepuueZveaWh+Wtl+OCkuepuueZveaWh+Wtl+OBjOmdnuWvvuW/nOOBruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOBquOBhOOBi+OAgeW/hemgiOmgheebruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOBquOBhOOBi+ODgeOCp+ODg+OCr+OBmeOCi1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLeWFpeWKm+WApOOBjOacieWKueOBquaXpeS7mOW9ouW8j+OBruWgtOWQiOOBr3RydWXjgpLov5TjgZfjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga/kvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgKi9cbiAgICBjaGVja0lucHV0VmFsdWVCbGFuayhmaWVsZFR5cGUgOnN0cmluZyB8IHVuZGVmaW5lZCxpbnB1dFZhbHVlIDpzdHJpbmcsZmllbGRDb2RlIDpzdHJpbmcsZmllbGRSZXF1aXJlZCA6Ym9vbGVhbiB8IHVuZGVmaW5lZCxldmVudCA6YW55KTogYm9vbGVhbntcblxuICAgICAgICBsZXQgdmFsdWVIYXNCbGFuaztcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgdmFsdWVIYXNCbGFuayA9IGlucHV0VmFsdWUubWF0Y2goL14oXFxzfOOAgCkqJC8pOy8v5YCk44GM5Y2K6KeS44K544Oa44O844K544O744K/44OW5paH5a2X44O75pS56KGM44O75pS544Oa44O844K444O75YWo6KeS44K544Oa44O844K544Gu44G/44Gn44GC44KL44GLXG5cblxuICAgICAgICAvL+WApOOBq+epuueZveaWh+Wtl+OBjOWFpeOBo+OBpuOBhOOCi+OAgW51bGzjga7jgajjgY3jga/jgIHjgqjjg6njg7zjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgICAgaWYodmFsdWVIYXNCbGFuayAhPT0gbnVsbCB8fCBpbnB1dFZhbHVlID09PSBudWxsIHx8IGlucHV0VmFsdWUgPT09ICcnKXtcbiAgICAgICAgICAgIC8v56m655m95paH5a2X44KS56m655m95paH5a2X44GM6Z2e5a++5b+c44Gu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44KL5aC05ZCI44CB5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICAgICAgICBpZihmaWVsZFR5cGUgPT09IFwiTlVNQkVSXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVcIiB8fCBmaWVsZFR5cGUgPT09IFwiREFURVRJTUVcIiB8fCBmaWVsZFR5cGUgPT09IFwiVElNRVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJVU0VSX1NFTEVDVFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWVsZFR5cGUgPT09IFwiT1JHQU5JWkFUSU9OX1NFTEVDVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJHUk9VUF9TRUxFQ1RcIiB8fCBmaWVsZFR5cGUgPT09IFwiUkFESU9fQlVUVE9OXCIgfHwgZmllbGRUeXBlID09PSBcIkRST1BfRE9XTlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJDSEVDS19CT1hcIiB8fCBmaWVsZFR5cGUgPT09IFwiTVVMVElfU0VMRUNUXCIpe1xuICAgICAgICAgICAgICAgIGV2ZW50LnJlY29yZFtmaWVsZENvZGVdWydlcnJvciddID0gXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OAgeWApOOBr+epuueZveaWh+Wtl+OBp+OBmeOAglwiOyAvL+ODrOOCs+ODvOODieOBq+OCqOODqeODvOOCkuihqOekulxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf44CB5YCk44Gv56m655m95paH5a2X44Gn44GZ44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuXG4gICAgICAgICAgICAvL+epuueZveaWh+Wtl+OCkuW/hemgiOmgheebruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOCi+WgtOWQiOOAgeS+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRSZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gv5b+F6aCI6aCF55uu44Gu44Gf44KB44CB56m655m95paH5a2X44Gv5oy/5YWl44Gn44GN44G+44Gb44KT44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njga/lv4XpoIjpoIXnm67jga7jgZ/jgoHjgIHnqbrnmb3mloflrZfjga/mjL/lhaXjgafjgY3jgb7jgZvjgpPjgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnqbrnmb3mloflrZfjga7lpInmlbDjgpLpnZ7lr77lv5zjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgarjgYTjgYvjgIHlv4XpoIjpoIXnm67jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgarjgYTjgYvjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRWYWx1ZSAtIOaMv+WFpeOBmeOCi+WApFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC3lhaXlipvlgKTjgYzmnInlirnjgarml6Xku5jlvaLlvI/jga7loLTlkIjjga90cnVl44KS6L+U44GX44CB44Gd44GG44Gn44Gq44GE5aC05ZCI44Gv5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICovXG4gICAgY2hlY2tWYXJpYWJsZVZhbHVlQmxhbmsoZmllbGRUeXBlIDpzdHJpbmcgfCB1bmRlZmluZWQsaW5wdXRWYWx1ZUFycmF5IDphbnksZmllbGRDb2RlIDpzdHJpbmcsZmllbGRSZXF1aXJlZCA6Ym9vbGVhbiB8IHVuZGVmaW5lZCxldmVudCA6YW55KTogYm9vbGVhbntcblxuICAgICAgICBsZXQgdmFyaWFibGVIYXNCbGFuaztcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgZm9yKGxldCBpID0wO2k8aW5wdXRWYWx1ZUFycmF5Lmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgLy/phY3liJfjga7opoHntKDjgatudWxs44GM44Gq44GE44GL44CB56m655m95paH5a2X44GM5YCk44Gr5ZCr44G+44KM44Gm44GE44Gq44GE44GL44OB44Kn44OD44Kv44GZ44KLXG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0VmFsdWVBcnJheVtpXSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICB2YXJpYWJsZUhhc0JsYW5rID0gaW5wdXRWYWx1ZUFycmF5W2ldLm1hdGNoKC9eKFxcc3zjgIApKiQvKTsvL+WApOOBjOWNiuinkuOCueODmuODvOOCueODu+OCv+ODluaWh+Wtl+ODu+aUueihjOODu+aUueODmuODvOOCuOODu+WFqOinkuOCueODmuODvOOCueOBruOBv+OBp+OBguOCi+OBi1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/lpInmlbDjga7lgKTjgavnqbrnmb3mloflrZfjgYzlhaXjgaPjgabjgYTjgovjgIHphY3liJfjgavopoHntKDjgYzjgarjgYTjgajjgY3jga/jgIHjgqjjg6njg7zjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgICAgaWYodmFyaWFibGVIYXNCbGFuayAhPT0gbnVsbCAmJiB2YXJpYWJsZUhhc0JsYW5rICE9PSB1bmRlZmluZWQgJiYgIHZhcmlhYmxlSGFzQmxhbmsgIT09IFwiXCIgJiYgaW5wdXRWYWx1ZUFycmF5Lmxlbmd0aCA9PT0gMCl7XG4gICAgICAgICAgICAvL+epuueZveaWh+Wtl+OCkuepuueZveaWh+Wtl+OBjOmdnuWvvuW/nOOBruODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBpuOBhOOCi+WgtOWQiOOAgeS+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAgICAgICAgaWYoZmllbGRUeXBlID09PSBcIk5VTUJFUlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVUSU1FXCIgfHwgZmllbGRUeXBlID09PSBcIlRJTUVcIiB8fCBmaWVsZFR5cGUgPT09IFwiVVNFUl9TRUxFQ1RcIlxuICAgICAgICAgICAgICAgIHx8IGZpZWxkVHlwZSA9PT0gXCJPUkdBTklaQVRJT05fU0VMRUNUXCIgfHwgZmllbGRUeXBlID09PSBcIkdST1VQX1NFTEVDVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJSQURJT19CVVRUT05cIiB8fCBmaWVsZFR5cGUgPT09IFwiRFJPUF9ET1dOXCIgfHwgZmllbGRUeXBlID09PSBcIkNIRUNLX0JPWFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJNVUxUSV9TRUxFQ1RcIil7XG4gICAgICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf44CB5aSJ5pWw44Gu5YCk44Gv56m655m95paH5a2X44Gn44GZ44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/jgIHlpInmlbDjga7lgKTjga/nqbrnmb3mloflrZfjgafjgZnjgILjgIzlgKTjgpLmjL/lhaXjgZnjgovjgI3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG5cbiAgICAgICAgICAgIC8v56m655m95paH5a2X44KS5b+F6aCI6aCF55uu44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gm44GE44KL5aC05ZCI44CB5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXSA9IFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njga/lv4XpoIjpoIXnm67jgafjgYLjgorjgIHnqbrnmb3jg7vnqbrnmb3mloflrZfjga7lgKTjga7lpInmlbDjga/jgIHmjL/lhaXjgafjgY3jgb7jgZvjgpPjgIJcIjsgLy/jg6zjgrPjg7zjg4njgavjgqjjg6njg7zjgpLooajnpLpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBr+W/hemgiOmgheebruOBp+OBguOCiuOAgeepuueZveODu+epuueZveaWh+Wtl+OBruWApOOBruWkieaVsOOBr+OAgeaMv+WFpeOBp+OBjeOBvuOBm+OCk+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOWNiuinkuaVsOWtl+OBi+ODgeOCp+ODg+OCr+OBmeOCi+mWouaVsFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gLeWFpeWKm+WApOOBjOacieWKueOBquaVsOWApOOBruWgtOWQiOOBr3RydWXjgpLov5TjgZfjgIHjgZ3jgYbjgafjgarjgYTloLTlkIjjga/kvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgKi9cbiAgICBjaGVja0lucHV0TnVtYmVyKGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxldmVudCA6YW55KTogYm9vbGVhbntcbiAgICAgICAgbGV0IGlucHV0TnVtYmVyVmFsdWUgPSBOdW1iZXIoaW5wdXRWYWx1ZSk7Ly/mlbDlgKTlnovjgavlpInmj5tcblxuICAgICAgICAvL+aciemZkOaVsOOBi+OBqeOBhuOBi+WIpOWumlxuICAgICAgICBpZighaXNGaW5pdGUoaW5wdXROdW1iZXJWYWx1ZSkpe1xuICAgICAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pel5LuY5b2i5byP44Gn44GZ44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeacieWKueOBquaVsOWApOOBp+OBr+OBguOCiuOBvuOBm+OCk+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiog5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pel5LuY5b2i5byP44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pel5LuY5b2i5byP44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAqL1xuICAgIGNoZWNrSW5wdXREYXRlKGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxldmVudCA6YW55KTogYm9vbGVhbntcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgbGV0IHR3b0RpZ2l0TW9udGhEYXkgPSBpbnB1dFZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvKTsvLzTmoYHjga7mlbDlrZctMuahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XXG4gICAgICAgIGxldCBzaW5nbGVEaWdpdE1vbnRoRGF5ID0gaW5wdXRWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsxfSktKFxcZHsxfSkkLyk7Ly805qGB44Gu5pWw5a2XLTHmoYHjga7mlbDlrZctMuahgeOBruaVsOWtl1xuICAgICAgICBsZXQgc2luZ2xlRGlnaXRNb250aCA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7MX0pLShcXGR7Mn0pJC8pOy8vNOahgeOBruaVsOWtly0x5qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZdcbiAgICAgICAgbGV0IHNpbmdsZURpZ2l0RGF5ID0gaW5wdXRWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsxfSkkLyk7Ly805qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZctMeahgeOBruaVsOWtl1xuICAgICAgICBsZXQgZGF0ZVRpbWVNaWxsaVNlY29uZCA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pLihcXGR7MiwzfSlaJC8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPKOODn+ODquenkilcbiAgICAgICAgbGV0IGRhdGVUaW1lID0gaW5wdXRWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlUKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSlaJC8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPXG4gICAgICAgIGxldCBkYXRlO1xuICAgICAgICAvL2RhdGXlnovjgavlpInmj5tcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGlucHV0VmFsdWUpO1xuXG4gICAgICAgIC8vZGF0ZeWei+WkieaPm+OBp+OBjeOBn+OBi+eiuuiqjVxuICAgICAgICBpZihkYXRlICE9PSB1bmRlZmluZWQgJiYgIWlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7XG4gICAgICAgICAgICAvL+ato+imj+ihqOePvuODgeOCp+ODg+OCr+eiuuiqjVxuICAgICAgICAgICAgaWYodHdvRGlnaXRNb250aERheSA9PT0gbnVsbCAmJiBzaW5nbGVEaWdpdE1vbnRoID09PSBudWxsICYmIHNpbmdsZURpZ2l0RGF5ID09PSBudWxsICYmIHNpbmdsZURpZ2l0TW9udGhEYXkgPT09IG51bGwgJiYgZGF0ZVRpbWUgPT09IG51bGwgJiYgZGF0ZVRpbWVNaWxsaVNlY29uZCA9PT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnJlY29yZFtmaWVsZENvZGVdWydlcnJvciddID0gXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeeEoeWKueOBquaXpeS7mOW9ouW8j+OBp+OBmeOAglwiOyAvL+ODrOOCs+ODvOODieOBq+OCqOODqeODvOOCkuihqOekulxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WApOOBr+OAgeeEoeWKueOBquaXpeS7mOW9ouW8j+OBp+OBmeOAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiog5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pmC5Yi75b2i5byP44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5pel5LuY5b2i5byP44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAqL1xuICAgIGNoZWNrSW5wdXRUaW1lKGlucHV0VmFsdWUgOnN0cmluZyxmaWVsZENvZGUgOnN0cmluZyxldmVudCA6YW55KTogYm9vbGVhbntcbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgbGV0IHRpbWVGb3JtYXQgPWlucHV0VmFsdWUubWF0Y2goL14oWzAtOV18MFswLTldfDFbMC05XXwyWzAtM10pOlswLTVdWzAtOV0kLyk7XG5cbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq/norroqo1cbiAgICAgICAgaWYodGltZUZvcm1hdCA9PT0gbnVsbCl7XG4gICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXSA9IFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lgKTjga/jgIHnhKHlirnjgarmmYLliLvlvaLlvI/jgafjgZnjgIJcIjsgLy/jg6zjgrPjg7zjg4njgavjgqjjg6njg7zjgpLooajnpLpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pmC5Yi75b2i5byP44Gn44GZ44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CC44CMMe+9njLmoYEgOiAy5qGB44CN44Gu5YCk44KS5oyH5a6a44GX44Gm44GP44Gg44GV44GE44CCXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBruODleOCo+ODvOODq+ODieOCv+OCpOODl+OBjERBVEVUSU1F44Gn44GC44KM44Gw44CB5pmC5Yi744GC44KK44Gu5pel5LuY5b2i5byP5aSJ5o+b44GX44CBREFUReOBp+OBguOCjOOBsOaZguWIu+OBquOBl+OBruaXpeS7mOW9ouW8j+WkieaPm+OBmeOCi+mWouaVsFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC3mjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGRUeXBlICAt44OV44Kj44O844Or44OJ44K/44Kk44OXXG4gICAgICogQHJldHVybiB7c3RyaW5nfSAt5YWl5Yqb5YCk44GM5pel5LuY5b2i5byP44Gr5aSJ5o+b44Gn44GN44Gf5aC05ZCI44Gv5paH5a2X5YiX44KS6L+U44GX44CB44Gd44GG44Gn44Gq44GE5aC05ZCI44Gv5L6L5aSW44KS55m655Sf44GV44Gb44KLXG4gICAgICovXG4gICAgY2hhbmdlRGF0ZUZvcm1hdChpbnB1dFZhbHVlIDpzdHJpbmcsIGZpZWxkVHlwZSA6c3RyaW5nLGZpZWxkQ29kZSA6c3RyaW5nLGV2ZW50IDphbnkpOiBzdHJpbmd7XG4gICAgICAgIGxldCBkYXRlVGltZTtcbiAgICAgICAgbGV0IGRhdGU7XG5cbiAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgpJkYXRl5Z6L44Gr5aSJ5o+bXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShpbnB1dFZhbHVlKTtcbiAgICAgICAgLy9kYXRl5Z6L5aSJ5o+b44Gn44GN44Gf44GL56K66KqNXG4gICAgICAgIGlmKGRhdGUgIT09IHVuZGVmaW5lZCAmJiAhaXNOYU4oZGF0ZS5nZXREYXRlKCkpKXtcblxuICAgICAgICAgICAgLy/ml6XmmYLjg5XjgqPjg7zjg6vjg4njga7loLTlkIjjgIHmmYLliLvjgYLjgorjga7ml6Xku5jlvaLlvI/lpInmj5tcbiAgICAgICAgICAgIGlmKGZpZWxkVHlwZSA9PT0gXCJEQVRFVElNRVwiKXtcbiAgICAgICAgICAgICAgICBkYXRlVGltZSA9ZGF0ZS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlVGltZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/ml6Xku5jjg5XjgqPjg7zjg6vjg4njga7loLTlkIjjgIHmmYLliLvjgarjgZfjga7ml6Xku5jjgavlvaLlvI/lpInmj5tcbiAgICAgICAgICAgIC8vVVRD44Gu5pmC5Yi744KS5oy/5YWl44GX44Gf44GE5aC05ZCI44CBSlNU44Gr5aSJ5o+b44GZ44KLXG4gICAgICAgICAgICBsZXQgZGF0ZVRpbWVNaWxsaVNlY29uZCA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pLihcXGR7MiwzfSlaJC8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPKOODn+ODquenkilcbiAgICAgICAgICAgIGxldCBkYXRlVGltZU5vdEluY2x1ZGluZ01pbGxpU2Vjb25kcyA9IGlucHV0VmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pWiQvKTsvL+aZguWIu+WFpeOCiuOBrlVUQ+OBruaXpeS7mOW9ouW8j1xuXG4gICAgICAgICAgICBpZihkYXRlVGltZU1pbGxpU2Vjb25kICE9PSBudWxsIHx8IGRhdGVUaW1lTm90SW5jbHVkaW5nTWlsbGlTZWNvbmRzICE9PSBudWxsKXtcbiAgICAgICAgICAgICAgICAvL0pTVOOBq+WkieaPm1xuICAgICAgICAgICAgICAgIGxldCBqc3REYXRlPWRhdGUudG9Mb2NhbGVTdHJpbmcoXCJqYS1KUFwiLCB7IHRpbWVab25lOiBcIkFzaWEvVG9reW9cIiB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhqc3REYXRlKTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZUFycmF5PWpzdERhdGUubWF0Y2goLyhcXGR7NH0pXFwvKFxcZHsxLDJ9KVxcLyhcXGR7MSwyfSkvKTsvLzTmoYHjga7mlbDlrZctMe+9njLmoYHjga7mlbDlrZctMe+9njLmoYHjga7mlbDlrZdcbiAgICAgICAgICAgICAgICBpZihkYXRlQXJyYXkgIT09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgeWVhckluZGV4ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vbnRoSW5kZXggPSAyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF5SW5kZXggPSAzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZUZvcm1hdHRlZD1gJHtkYXRlQXJyYXlbeWVhckluZGV4XX0tJHtkYXRlQXJyYXlbbW9udGhJbmRleF19LSR7ZGF0ZUFycmF5W2RheUluZGV4XX1gXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlRm9ybWF0dGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9VVEPmmYLliLvjgafjgarjgYTlgKTjgpLmjL/lhaXjgZfjgZ/jgYTloLTlkIjjgIHlubTjgIHmnIjjgIHml6XjgpLmir3lh7rjgZfjgIHmnIgt5bm0LeaXpeOBruW9ouW8j+WkieaPm1xuICAgICAgICAgICAgbGV0IGRhdGVBcnJheT1pbnB1dFZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezEsMn0pLShcXGR7MSwyfSkkLyk7Ly805qGB44Gu5pWw5a2XLTHvvZ4y5qGB44Gu5pWw5a2XLTHvvZ4y5qGB44Gu5pWw5a2XXG4gICAgICAgICAgICBpZihkYXRlQXJyYXkgIT09IG51bGwpe1xuICAgICAgICAgICAgICAgIGxldCB5ZWFySW5kZXggPSAxO1xuICAgICAgICAgICAgICAgIGxldCBtb250aEluZGV4ID0gMjtcbiAgICAgICAgICAgICAgICBsZXQgZGF5SW5kZXggPSAzO1xuICAgICAgICAgICAgICAgIGxldCBkYXRlRm9ybWF0dGVkPWAke2RhdGVBcnJheVt5ZWFySW5kZXhdfS0ke2RhdGVBcnJheVttb250aEluZGV4XX0tJHtkYXRlQXJyYXlbZGF5SW5kZXhdfWBcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZUZvcm1hdHRlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ10gPSBcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pel5LuY5b2i5byP44Gn44GZ44CCXCI7IC8v44Os44Kz44O844OJ44Gr44Ko44Op44O844KS6KGo56S6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5YWl44KM44KI44GG44Go44GX44Gf5YCk44Gv44CB54Sh5Yq544Gq5pel5LuY5b2i5byP44Gn44GZ44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOODleOCo+ODvOODq+ODieOCv+OCpOODlyjjg6njgrjjgqrjg5zjgr/jg7Pjg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg7vopIfmlbDpgbjmip7jg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Mp44Gu6YG45oqe6IKi44Gr5a2Y5Zyo44GZ44KL5YCk44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAt5YWl5Yqb5YCk44GM5pyJ5Yq544Gq5YCk44Gu5aC05ZCI44GvdHJ1ZeOCkui/lOOBl+OAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr+S+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAqL1xuICAgIGNoZWNrSW5wdXRPcHRpb24oaW5wdXRWYWx1ZSA6c3RyaW5nLGZpZWxkT3B0aW9ucyA6c3RyaW5nIHwgdW5kZWZpbmVkLGZpZWxkQ29kZSA6c3RyaW5nLGV2ZW50IDphbnkpOiBib29sZWFuIHtcblxuICAgICAgICAvL+WFpeWKm+WApOOBjOmBuOaKnuiCouOBq+WtmOWcqOOBmeOCi+WApOOBi+ODgeOCp+ODg+OCr+OBl+OAgeWtmOWcqOOBl+OBn+OCiXRydWXjgpLov5TjgZlcbiAgICAgICAgaWYoZmllbGRPcHRpb25zICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBPYmplY3Qua2V5cyhmaWVsZE9wdGlvbnMpO1xuICAgICAgICAgICAgZm9yKHZhciBvcHRpb25zSW5kZXggaW4gb3B0aW9ucyl7XG4gICAgICAgICAgICAgICAgaWYob3B0aW9uc1tvcHRpb25zSW5kZXhdID09PSBpbnB1dFZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV1bJ2Vycm9yJ109XCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuOBq+OBr+OAgeWtmOWcqOOBl+OBquOBhOWApOOCkuaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuOBq+OBr+OAgeWtmOWcqOOBl+OBquOBhOWApOOCkuaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhaXlipvlgKTjgYzjg5XjgqPjg7zjg6vjg4njgr/jgqTjg5co44Om44O844K244O86YG45oqeKeOBp+OAgeODpuODvOOCtuODvOaDheWgseOBq+WtmOWcqOOBmeOCi+WApOOBi+ODgeOCp+ODg+OCr+OBmeOCi+mWouaVsFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFZhbHVlIC0g5oy/5YWl44GZ44KL5YCkXG4gICAgICogQHJldHVybiB7c3RyaW5nIHwgYm9vbGVhbn0g5YWl5Yqb5YCk44GM55m76Yyy44GV44KM44Gm44GE44KL44Om44O844K244O85oOF5aCx44GL44KJ6KaL44Gk44GL44Gj44Gf5aC05ZCI44CBdHJ1ZeOCkui/lOOBl+OAgeimi+OBpOOBi+OCieOBquOBi+OBo+OBn+WgtOWQiOOAgWZhbHNl44KS6L+U44GZXG4gICAgICovXG4gICAgYXN5bmMgc2V0SW5wdXRVc2VyKGlucHV0VmFsdWUgOmFueSk6IFByb21pc2U8YW55IHwgYm9vbGVhbj57XG5cbiAgICAgICAgLy/jg6bjg7zjgrbjg7zlkI3jgpLmoLzntI3jgZnjgovlpInmlbBcbiAgICAgICAgbGV0IHVzZXJzTmFtZSA9IFtdO1xuXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8vQVBJ44Gn44Om44O844K244O85oOF5aCx44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICBjb25zdCByZXNwID1hd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoJy92MS91c2VycycsIHRydWUpLCAnR0VUJywge2NvZGVzOiBpbnB1dFZhbHVlLmpvaW4oJywnKX0pXG4gICAgICAgICAgICBsZXQgdXNlcnNJbmZvID0gcmVzcC51c2VycztcblxuICAgICAgICAgICAgaWYgKHVzZXJzSW5mby5sZW5ndGggIT09IGlucHV0VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8v5YWl5Yqb44GV44KM44Gf44Ot44Kw44Kk44Oz5ZCN44GM44Om44O844K244O85oOF5aCx44Gr55m76Yyy44GV44KM44Gm44GE44KL5aC05ZCI44CB44Gd44Gu44Om44O844K244O85ZCN44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleFVzZXJzSW5mbyBpbiB1c2Vyc0luZm8pIHtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGluZGV4SW5wdXRVc2VyIGluIGlucHV0VmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICBpZih1c2Vyc0luZm9baW5kZXhVc2Vyc0luZm9dLmNvZGUgPT09IGlucHV0VmFsdWVbaW5kZXhJbnB1dFVzZXJdKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzTmFtZS5wdXNoKHVzZXJzSW5mb1tpbmRleFVzZXJzSW5mb10ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8v44Om44O844K244O85ZCN44GM5Y+W5b6X44Gn44GN44Gf5aC05ZCI44CB44Ot44Kw44Kk44Oz5ZCN44Go44Om44O844K244O85ZCN44KS44OV44Kj44O844Or44OJ44Gr44K744OD44OI44GZ44KLXG4gICAgICAgICAgICBpZih1c2Vyc05hbWUgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNlcnNOYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOODleOCo+ODvOODq+ODieOCv+OCpOODlyjntYTnuZTpgbjmip4p44Gn44CB57WE57mU5oOF5aCx44Gr5a2Y5Zyo44GZ44KL5YCk44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBib29sZWFufSDlhaXlipvlgKTjgYznmbvpjLLjgZXjgozjgabjgYTjgovntYTnuZTmg4XloLHjgYvjgonopovjgaTjgYvjgaPjgZ/loLTlkIjjgIF0cnVl44KS6L+U44GX44CB6KaL44Gk44GL44KJ44Gq44GL44Gj44Gf5aC05ZCI44CBZmFsc2XjgpLov5TjgZlcbiAgICAgKi9cbiAgICBhc3luYyBzZXRJbnB1dE9yZ2FuaXphdGlvbihpbnB1dFZhbHVlIDpzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IGJvb2xlYW4+e1xuXG4gICAgICAgIC8v57WE57mU5ZCN44KS5qC857SN44GZ44KL5aSJ5pWwXG4gICAgICAgIGxldCBvcmdhbml6YXRpb25OYW1lO1xuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25zSW5mb0NvbHVtbkluZGV4PTA7XG5cbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy9BUEnjgafntYTnuZTmg4XloLHjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPWF3YWl0IGtpbnRvbmUuYXBpKGtpbnRvbmUuYXBpLnVybCgnL3YxL29yZ2FuaXphdGlvbnMuanNvbicsIHRydWUpLCAnR0VUJywge2NvZGVzOltpbnB1dFZhbHVlIF19KVxuXG4gICAgICAgICAgICAvL+WFpeWKm+OBleOCjOOBn+e1hOe5lOOCs+ODvOODieOBjOe1hOe5lOaDheWgseOBq+eZu+mMsuOBleOCjOOBpuOBhOOCi+WgtOWQiOOAgeOBneOBrue1hOe5lOWQjeOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgICAgIGlmIChyZXNwLm9yZ2FuaXphdGlvbnNbb3JnYW5pemF0aW9uc0luZm9Db2x1bW5JbmRleF0uY29kZSA9PT0gaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25OYW1lPXJlc3Aub3JnYW5pemF0aW9uc1tvcmdhbml6YXRpb25zSW5mb0NvbHVtbkluZGV4XS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/ntYTnuZTlkI3jgYzlj5blvpfjgafjgY3jgZ/loLTlkIjjgIHntYTnuZTjgrPjg7zjg4njgajntYTnuZTlkI3jgpLjg5XjgqPjg7zjg6vjg4njgavjgrvjg4Pjg4jjgZnjgotcbiAgICAgICAgICAgIGlmKG9yZ2FuaXphdGlvbk5hbWUgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmdhbml6YXRpb25OYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WApOOBjOODleOCo+ODvOODq+ODieOCv+OCpOODlyjjgrDjg6vjg7zjg5fpgbjmip4p44Gn44CB44Kw44Or44O844OX5oOF5aCx44Gr5a2Y5Zyo44GZ44KL5YCk44GL44OB44Kn44OD44Kv44GZ44KL6Zai5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLSDmjL/lhaXjgZnjgovlgKRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCBib29sZWFufSDlhaXlipvlgKTjgYznmbvpjLLjgZXjgozjgabjgYTjgovjgrDjg6vjg7zjg5fmg4XloLHjgYvjgonopovjgaTjgYvjgaPjgZ/loLTlkIjjgIF0cnVl44KS6L+U44GX44CB6KaL44Gk44GL44KJ44Gq44GL44Gj44Gf5aC05ZCI44CBZmFsc2XjgpLov5TjgZlcbiAgICAgKi9cbiAgICBhc3luYyBzZXRJbnB1dEdyb3VwKGlucHV0VmFsdWUgOnN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgYm9vbGVhbj57XG5cbiAgICAgICAgLy/jgrDjg6vjg7zjg5flkI3jgpLmoLzntI3jgZnjgovlpInmlbBcbiAgICAgICAgbGV0IGdyb3Vwc05hbWU7XG4gICAgICAgIGNvbnN0IGdyb3Vwc0luZm9Db2x1bW5JbmRleD0wO1xuXG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8vQVBJ44Gn44Kw44Or44O844OX5oOF5aCx44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICBjb25zdCByZXNwID1hd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoJy92MS9ncm91cHMuanNvbicsIHRydWUpLCAnR0VUJywge2NvZGVzOltpbnB1dFZhbHVlIF19KVxuXG4gICAgICAgICAgICAvL+WFpeWKm+OBleOCjOOBn+OCsOODq+ODvOODl+OCs+ODvOODieOBjOOCsOODq+ODvOODl+aDheWgseOBq+eZu+mMsuOBleOCjOOBpuOBhOOCi+WgtOWQiOOAgeOBneOBruOCsOODq+ODvOODl+WQjeOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgaWYgKHJlc3AuZ3JvdXBzW2dyb3Vwc0luZm9Db2x1bW5JbmRleF0uY29kZSA9PT0gaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGdyb3Vwc05hbWU9cmVzcC5ncm91cHNbZ3JvdXBzSW5mb0NvbHVtbkluZGV4XS5uYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+OCsOODq+ODvOODl+WQjeOBjOWPluW+l+OBp+OBjeOBn+WgtOWQiOOAgeOCsOODq+ODvOODl+OCs+ODvOODieOBqOOCsOODq+ODvOODl+WQjeOCkuODleOCo+ODvOODq+ODieOBq+OCu+ODg+ODiOOBmeOCi1xuICAgICAgICAgICAgaWYoZ3JvdXBzTmFtZSA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWNhdGNoe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyb3Vwc05hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Om44O844K244O844Kq44OW44K444Kn44Kv44OI44KS5oy/5YWl44GZ44KL5aC05ZCI44CB5oy/5YWl5YWI44OV44Kj44O844Or44OJ44Gr44KI44Gj44Gm44CB6YGp5YiH44Gq44Kq44OW44K444Kn44Kv44OI44Gu5YCk44KS5Y+W5b6X44GX44CB44K744OD44OI44GZ44KLXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlucHV0VmFsdWUgLeWFpeWKm+OBleOCjOOBn+WApFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3RWYWx1ZSAt44Kq44OW44K444Kn44Kv44OI5aSJ5pWwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkVHlwZSAt5oy/5YWl5YWI44OV44Kj44O844Or44OJ44K/44Kk44OXXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkQ29kZSAt5oy/5YWl5YWI44OV44Kj44O844Or44OJ44K/44Kk44OXXG4gICAgICogQHJldHVybiB7c3RyaW5nfSAt5oy/5YWl5YWI44OV44Kj44O844Or44OJ44Gr44KI44Gj44Gm44CB44Ot44Kw44Kk44Oz44Om44O844K244O844Kq44OW44K444Kn44Kv44OI44Gu5L2V44Gu5YCk44KS6L+U44GZ44GL44CB5aSJ44KP44KLXG4gICAgICovXG4gICAgc2V0VmFsdWVPZlVzZXJPYmplY3QoaW5wdXRWYWx1ZSA6YW55LG9iamVjdFZhbHVlIDphbnksZmllbGRUeXBlIDogYW55LGZpZWxkQ29kZSA6IGFueSk6IGFueXtcblxuICAgICAgICAvL+WkieaVsOOBruWApFxuICAgICAgICBsZXQgdmFyaWFibGVWYWx1ZSA9IFtdO1xuXG4gICAgICAgIC8v44Om44O844K244O844Kq44OW44K444Kn44Kv44OI5oy/5YWl44Gn44GN44Gq44GE44OV44Kj44O844Or44OJ77yI5pel5LuY44CB5pWw5YCk77yJ44KS6YG45oqe44GX44Gm44GE44KL5aC05ZCI44CB44Ko44Op44O844KS5Ye644GZXG4gICAgICAgIGlmKGZpZWxkVHlwZSA9PT0gXCJOVU1CRVJcIiB8fCBmaWVsZFR5cGUgPT09IFwiREFURVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFVElNRVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJUSU1FXCIpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavjga/jgIHjg6bjg7zjgrbjg7zmg4XloLHjgpLmjL/lhaXjgafjgY3jgb7jgZvjgpPjgILlh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvL+ODpuODvOOCtuODvOmBuOaKnuODleOCo+ODvOODq+ODieOBq+aMv+WFpeaZguOAgeODpuODvOOCtuODvOOCquODluOCuOOCp+OCr+ODiOOBrmNvZGXjgpLku6PlhaXjgZnjgotcbiAgICAgICAgaWYoZmllbGRUeXBlID09PSAnVVNFUl9TRUxFQ1QnKXtcbiAgICAgICAgICAgIC8v5aSJ5pWw44Gu5YCk5Y+W5b6XXG4gICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheShvYmplY3RWYWx1ZSkpe1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZS5jb2RlKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8b2JqZWN0VmFsdWUubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZVtpXS5jb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAvL+ODpuODvOOCtuODvOmBuOaKnuODleOCo+ODvOODq+ODieS7peWkluOBq+aMv+WFpeaZguOAgeODpuODvOOCtuODvOOCquODluOCuOOCp+OCr+ODiOOBruWApOOBruaMh+WumuOBjOOBguOCjOOBsOOAgeOBneOBruWApOOCkuS7o+WFpeOBmeOCi1xuICAgICAgICAgICAgaWYoaW5wdXRWYWx1ZS5pbmNsdWRlcygnLm5hbWUnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuZW1haWwnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuZW1wbG95ZWVOdW1iZXInKVxuICAgICAgICAgICAgICAgIHx8IGlucHV0VmFsdWUuaW5jbHVkZXMoJy5leHRlbnNpb25OdW1iZXInKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuaWQnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuaXNHdWVzdCcpfHwgaW5wdXRWYWx1ZS5pbmNsdWRlcygnLnRpbWV6b25lJylcbiAgICAgICAgICAgICAgICB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcubGFuZ3VhZ2UnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcubW9iaWxlUGhvbmUnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcucGhvbmUnKSB8fCBpbnB1dFZhbHVlLmluY2x1ZGVzKCcudXJsJykpe1xuXG4gICAgICAgICAgICAgICAgLy/lgKTjgpLmjL/lhaXjgZnjgovlpInmlbDlkI3lj5blvpdcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0UHJvcGVydHlOYW1lID0gaW5wdXRWYWx1ZS5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgICAgICAgIGlmKCFBcnJheS5pc0FycmF5KG9iamVjdFZhbHVlKSl7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZVtvYmplY3RQcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxvYmplY3RWYWx1ZS5sZW5ndGg7aSsrKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUucHVzaChvYmplY3RWYWx1ZVtpXVtvYmplY3RQcm9wZXJ0eU5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/jg6bjg7zjgrbjg7zpgbjmip7jg5XjgqPjg7zjg6vjg4nku6XlpJbjgavmjL/lhaXmmYLjgIHjg6bjg7zjgrbjg7zjgqrjg5bjgrjjgqfjgq/jg4jjga7lgKTjga7mjIflrprjgYzjgarjgZHjgozjgbDjgIFjb2Rl44KS5Luj5YWl44GZ44KLXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZighQXJyYXkuaXNBcnJheShvYmplY3RWYWx1ZSkpe1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlLnB1c2gob2JqZWN0VmFsdWUuY29kZSk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8b2JqZWN0VmFsdWUubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlLnB1c2gob2JqZWN0VmFsdWVbaV0uY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZih2YXJpYWJsZVZhbHVlID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavlhaXjgozjgojjgYbjgajjgZfjgZ/lpInmlbDjga/jgIHnhKHlirnjgarlhaXlipvlvaLlvI/jgafjgZnjgIJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFyaWFibGVWYWx1ZTtcbiAgICB9XG5cblxuXG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGVcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG5cbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2ZpZWxkJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSAmJiAhKCd2YWx1ZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkQ29sdW1uSW5kZXg9MTtcblxuICAgICAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPjgafpgbjmip7jgZXjgozjgZ/jg5XjgqPjg7zjg6vjg4lcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkPXRoaXMuYWN0aW9uUHJvcHNbZmllbGRDb2x1bW5JbmRleF0ucHJvcHMubW9kZWxWYWx1ZS50eXBlO1xuXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+OBruWApOOCkuaMv+WFpeOBmeOCi+ODleOCo+ODvOODq+ODieOBjOacqumBuOaKnuOBruWgtOWQiOOAgeS+i+WkluOCkueZuueUn+OBleOBm+OCi1xuICAgICAgICAgICAgaWYoZmllbGQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBp+OAgeWApOOCkuaMv+WFpeOBmeOCi+ODleOCo+ODvOODq+ODieOBjOaMh+WumuOBleOCjOOBpuOBhOOBquOBi+OBo+OBn+OBn+OCgeOAgeWHpueQhuOBjOS4reaWreOBleOCjOOBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPjga7lgKTjgpLmjL/lhaXjgZnjgovjg5XjgqPjg7zjg6vjg4njgYzpnZ7lr77lv5zjg5XjgqPjg7zjg6vjg4njga7loLTlkIjjgIHkvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgICAgICAgIC8v5re75LuY44OV44Kh44Kk44Or44O744OG44O844OW44Or44O744Kr44OG44K044Oq44O844O744K544OG44O844K/44K544O75L2c5oiQ6ICF44O75pu05paw6ICF44O75L2c5qWt6ICF44O744Oq44OT44K444On44Oz55Wq5Y+344O744Os44Kz44O844OJ55Wq5Y+344O744Os44Kz44O844OJSUTjg7voqIjnrpfjg7vkvZzmiJDml6XmmYLjg7vmm7TmlrDml6XmmYLjg5XjgqPjg7zjg6vjg4njgYzpgbjmip7jgZXjgozjgabjgYTjgovloLTlkIjjgIHkvovlpJbjgpLnmbrnlJ/jgZXjgZvjgotcbiAgICAgICAgICAgIGlmKGZpZWxkID09PSBcIkZJTEVcIiB8fCBmaWVsZCA9PT0gXCJTVUJUQUJMRVwiIHx8IGZpZWxkID09PSBcIkNBVEVHT1JZXCIgfHwgZmllbGQgPT09IFwiU1RBVFVTXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgZmllbGQgPT09IFwiU1RBVFVTX0FTU0lHTkVFXCIgfHwgZmllbGQgPT09IFwiQ1JFQVRPUlwiIHx8IGZpZWxkID09PSBcIk1PRElGSUVSXCIgfHwgZmllbGQgPT09IFwiX19SRVZJU0lPTl9fXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZpZWxkID09PSBcIlJFQ09SRF9OVU1CRVJcInx8IGZpZWxkID09PSBcIl9fSURfX1wiIHx8IGZpZWxkID09PVwiQ0FMQ1wiIHx8IGZpZWxkID09PSBcIkNSRUFURURfVElNRVwiIHx8IGZpZWxkID09PSBcIlVQREFURURfVElNRVwiICl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gn44CB6YG45oqe44GV44KM44Gf44OV44Kj44O844Or44OJ44Gv44CB5YCk44KS5oy/5YWl44GZ44KL44Kz44Oz44Od44O844ON44Oz44OI44Gn44Gv6Z2e5a++5b+c44Gu44OV44Kj44O844Or44OJ44Gu44Gf44KB44CB5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+aXouWumuOBruODl+ODreODkeODhuOCo+OBruOCpOODs+OCv+ODvOODleOCp+ODvOOCueOBuOWkieaPm+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUluc2VydFZhbHVlUHJvcHM7XG5cbiAgICAgICAgICAgIC8v44OX44Ot44OR44OG44Kj44Gu5oy/5YWl44GZ44KL5YCk44KS5Y+W5b6XXG4gICAgICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IHRoaXMucHJvcHMudmFsdWU7XG4gICAgICAgICAgICAvL+ODleOCo+ODvOODq+ODieOBrueorumhnuOCkuWPluW+l1xuICAgICAgICAgICAgY29uc3QgZmllbGRUeXBlID0gdGhpcy5wcm9wcy5maWVsZC50eXBlO1xuICAgICAgICAgICAgLy/jg5XjgqPjg7zjg6vjg4njgYzlv4XpoIjpoIXnm67jgarjga7jgYvlj5blvpdcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVxdWlyZWQ9dGhpcy5wcm9wcy5maWVsZC5yZXF1aXJlZDtcbiAgICAgICAgICAgIC8v5oy/5YWl44GZ44KL44OV44Kj44O844Or44OJ44Gu44Kz44O844OJ44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCBmaWVsZENvZGU9dGhpcy5wcm9wcy5maWVsZC5jb2RlO1xuICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjga7lvaLlvI/vvIjmiYvlhaXlipvjgYvlpInmlbDvvInjgpLlj5blvpdcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFZhbHVlVHlwZT10aGlzLnByb3BzLnNob3c7XG4gICAgICAgICAgICAvL+ODqeOCuOOCquODnOOCv+ODs+ODu+ODgeOCp+ODg+OCr+ODnOODg+OCr+OCueODu+ikh+aVsOmBuOaKnuODu+ODieODreODg+ODl+ODgOOCpuODs+OBrumBuOaKnuiCouOCkuWPluW+l1xuICAgICAgICAgICAgbGV0IGZpZWxkT3B0aW9ucyA9dGhpcy5wcm9wcy5maWVsZC5vcHRpb25zO1xuICAgICAgICAgICAgLy/lpInmlbDjga7lgKTjgpLmoLzntI3jgZnjgotcbiAgICAgICAgICAgIGxldCB2YXJpYWJsZVZhbHVlIDphbnk7XG4gICAgICAgICAgICAvL+aMv+WFpeOBmeOCi+WApOOCkuagvOe0jeOBmeOCi1xuICAgICAgICAgICAgbGV0IGZpZWxkVmFsdWVBcnJheSA9IFtdO1xuICAgICAgICAgICAgbGV0IG5vdElucHV0RXJyb3I7XG4gICAgICAgICAgICAvL2NvbnRleHTjgavlrZjlnKjjgZnjgovlpInmlbDlkI3jgpLmoLzntI3jgZnjgotcbiAgICAgICAgICAgIGxldCBjb250ZXh0SGFzVmFyaWFibGVzTmFtZXM7XG5cbiAgICAgICAgICAgIC8v5aSJ5pWw44Gu5aC05ZCI44CB5YCk44GM5Y+W5b6X44Gn44GN44KL44GL44OB44Kn44OD44KvXG4gICAgICAgICAgICBpZihpbnNlcnRWYWx1ZVR5cGUgPT09IFwi5aSJ5pWwXCIpe1xuXG4gICAgICAgICAgICAgICAgLy/lpInmlbDjga7lgKTjgpLlkbzjgbPlh7rjgZfjgabku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICBjb25zdCBnZXRDb250ZXh0VmFyQnlQYXRoID0gKG9iajogYW55LCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoXCIuXCIpLnJlZHVjZSgobywgaykgPT4gKG8gfHwge30pW2tdLCBvYmopO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvL2NvbnRleHTjgavlrZjlnKjjgZnjgovlpInmlbDlkI3jgpLlhajjgablj5blvpfjgZnjgotcbiAgICAgICAgICAgICAgICBjb250ZXh0SGFzVmFyaWFibGVzTmFtZXMgPSBPYmplY3Qua2V5cyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgICAgICAgLy9jb250ZXh044Gr5aSJ5pWw44GMMeOBpOOCguWtmOWcqOOBl+OBquOBhOWgtOWQiOOAgeOCqOODqeODvOOCkuWHuuOBmVxuICAgICAgICAgICAgICAgIGlmKGNvbnRleHRIYXNWYXJpYWJsZXNOYW1lcy5sZW5ndGggPT09IDApe1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+aMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+WkieaVsOOBr+OAgeWtmOWcqOOBl+OBquOBhOOBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgaW5wdXRWYXJpYWJsZXNOYW1lO1xuICAgICAgICAgICAgICAgIC8v5YWl5Yqb5YCk44GM44Kq44OW44K444Kn44Kv44OI5aSJ5pWw44Gu5aSJ5pWw5ZCN44Gn44GC44KK44CB44OX44Ot44OR44OG44Kj44Gu5oyH5a6a44GM44GC44KL5aC05ZCI44CB5aSJ5pWw5ZCN44Gu44G/5Y+W5b6XXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAnLifjgojjgorliY3jga7mloflrZfjgpLmir3lh7pcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYXJpYWJsZXNOYW1lID0gZmllbGRWYWx1ZS5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICcuJ+OBjOWQq+OBvuOCjOOBpuOBhOOBquOBhOWgtOWQiOOAgeOBneOBruOBvuOBvui/lOOBmVxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhcmlhYmxlc05hbWUgPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBpbnB1dFZhcmlhYmxlc0V4aXN0O1xuICAgICAgICAgICAgICAgIC8v5YWl5Yqb44GV44KM44Gf5aSJ5pWw5ZCN44GM44CBY29udGV4dOOBruWkieaVsOOBq+WtmOWcqOOBmeOCi+WgtOWQiOOAgWlucHV0VmFyaWFibGVzRXhpc3Tjgat0cnVl44Gr5Luj5YWl44GZ44KLXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTwgY29udGV4dEhhc1ZhcmlhYmxlc05hbWVzLmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZihpbnB1dFZhcmlhYmxlc05hbWUgPT09IGNvbnRleHRIYXNWYXJpYWJsZXNOYW1lc1tpXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhcmlhYmxlc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v5YWl5Yqb44GV44KM44Gf5aSJ5pWw5ZCN44GM44CBY29udGV4dOOBruWkieaVsOOBq+WtmOWcqOOBl+OBquOBhOWgtOWQiOOAgeOCqOODqeODvOOCkuihqOekuuOBmeOCi1xuICAgICAgICAgICAgICAgIGlmKCFpbnB1dFZhcmlhYmxlc0V4aXN0KXtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44CMXCIrZmllbGRDb2RlK1wi44CNXCIrXCLjg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/lpInmlbDjga/jgIHlrZjlnKjjgZfjgarjgYTjgZ/jgoHjgIHlh6bnkIbjgpLkuK3mlq3jgZfjgb7jgZfjgZ/jgIJcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoaW5wdXRWYXJpYWJsZXNOYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgLy/lhaXlipvjgZXjgozjgZ/lpInmlbDlkI3jga7lgKTjgpLlj5blvpdcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IGdldENvbnRleHRWYXJCeVBhdGgoY29udGV4dC52YXJpYWJsZXMsaW5wdXRWYXJpYWJsZXNOYW1lKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v5paH5a2X5YiX5Z6L44Gu44OV44Kj44O844Or44OJ5Lul5aSW44Gr44CB56m655m95paH5a2X44Gu5aSJ5pWw44Gu5YCk44KS5oy/5YWl44GZ44KL5aC05ZCI44CB44Ko44Op44O844KS5Ye644GZXG4gICAgICAgICAgICAgICAgaWYodmFyaWFibGVWYWx1ZSA9PT0gXCJcIiB8fCB2YXJpYWJsZVZhbHVlID09PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoZmllbGRUeXBlID09PSBcIk5VTUJFUlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFXCIgfHwgZmllbGRUeXBlID09PSBcIkRBVEVUSU1FXCIgfHwgZmllbGRUeXBlID09PSBcIlRJTUVcIiB8fCBmaWVsZFR5cGUgPT09IFwiVVNFUl9TRUxFQ1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmllbGRUeXBlID09PSBcIk9SR0FOSVpBVElPTl9TRUxFQ1RcIiB8fCBmaWVsZFR5cGUgPT09IFwiR1JPVVBfU0VMRUNUXCIgfHwgZmllbGRUeXBlID09PSBcIlJBRElPX0JVVFRPTlwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEUk9QX0RPV05cIiB8fCBmaWVsZFR5cGUgPT09IFwiQ0hFQ0tfQk9YXCIgfHwgZmllbGRUeXBlID09PSBcIk1VTFRJX1NFTEVDVFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIuOAjFwiK2ZpZWxkQ29kZStcIuOAjVwiK1wi44OV44Kj44O844Or44OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf5aSJ5pWw44Gv44CB5YCk44GMbnVsbOOBruOBn+OCgeOAgeWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgLy/lpInmlbDjgYzjgqrjg5bjgrjjgqfjgq/jg4jjga7loLTlkIjjgIHjg5fjg63jg5Hjg4bjgqPjgpLlj5blvpfjgZfjgIHkvZXjga7jgqrjg5bjgrjjgqfjgq/jg4jjgYvliKTmlq3jgZnjgotcbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFyaWFibGVWYWx1ZSA9PT0gJ29iamVjdCcpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0UHJvcGVydGllcz1bXVxuXG4gICAgICAgICAgICAgICAgICAgIGlmKHZhcmlhYmxlVmFsdWUubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RQcm9wZXJ0aWVzPU9iamVjdC5rZXlzKHZhcmlhYmxlVmFsdWVbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyh2YXJpYWJsZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vKOODreOCsOOCpOODs+ODpuODvOOCtuODvOODu+WApOWPluW+l+OBruOCs+ODs+ODneODvOODjeODs+ODiOOBi+OCieOBrinjg6bjg7zjgrbjg7zjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjL/lhaXmmYLjgIHmjL/lhaXlhYjjg5XjgqPjg7zjg6vjg4njgavjgojjgaPjgabjgIHlgKTjgpLmjIflrprjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgaWYob2JqZWN0UHJvcGVydGllcy5pbmNsdWRlcygnY29kZScpICYmIG9iamVjdFByb3BlcnRpZXMuaW5jbHVkZXMoJ25hbWUnKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlPXRoaXMuc2V0VmFsdWVPZlVzZXJPYmplY3QoZmllbGRWYWx1ZSx2YXJpYWJsZVZhbHVlLGZpZWxkVHlwZSxmaWVsZENvZGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+ODpuODvOOCtuODvOOCquODluOCuOOCp+OCr+ODiOOBi+OCieWPluW+l+OBl+OBn+WApOOCkuOAgWZpZWxkVmFsdWVBcnJheeOBq+S7o+WFpVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YXJpYWJsZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZUFycmF5LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIC8v44Kq44OW44K444Kn44Kv44OI5aSJ5pWw44Gn44Gq44GE5aC05ZCI44CB5aSJ5pWw44KSZmllbGRWYWx1ZUFycmF544Gr5Luj5YWlXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlVmFsdWUgPSBjb250ZXh0LnZhcmlhYmxlc1tmaWVsZFZhbHVlXVxuICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlQXJyYXlbMF0gPSB2YXJpYWJsZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v5aSJ5pWw44GMZmllbGRWYWx1ZUFycmF544Gr5Luj5YWl44Gn44GN44Gq44GL44Gj44Gf5aC05ZCI44CB44Ko44Op44O844KS5Ye644GZXG4gICAgICAgICAgICAgICAgaWYoZmllbGRWYWx1ZUFycmF5ID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCLjgIxcIitmaWVsZENvZGUrXCLjgI1cIitcIuODleOCo+ODvOODq+ODieOBq+WFpeOCjOOCiOOBhuOBqOOBl+OBn+WkieaVsOOBr+OAgeeEoeWKueOBquWFpeWKm+W9ouW8j+OBp+OBmeOAglwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL+WkieaVsOOBruWApOOBq+OCqOODqeODvO+8iOepuuaWh+Wtl+ODu+epuueZveaWh+Wtl+OBrua3t+WFpe+8ieOBjOOBquOBhOOBk+OBqOOCkuODgeOCp+ODg+OCr+OBmeOCi1xuICAgICAgICAgICAgICAgIG5vdElucHV0RXJyb3I9dGhpcy5jaGVja1ZhcmlhYmxlVmFsdWVCbGFuayhmaWVsZFR5cGUsZmllbGRWYWx1ZUFycmF5LGZpZWxkQ29kZSxmaWVsZFJlcXVpcmVkLGV2ZW50KTtcblxuICAgICAgICAgICAgLy/miYvlhaXlipvjga7lgKTjgpLmjL/lhaXjgZnjgovloLTlkIjjgIHmjL/lhaXjgZnjgovlgKTjgpJmaWVsZEFycmF544Gr5Luj5YWlXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlQXJyYXkucHVzaChmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAvL+WFpeWKm+OCqOODqeODvO+8iOepuueZveaWh+Wtl+OBrua3t+WFpe+8ieOBjOOBquOBhOOBk+OBqOOCkuODgeOCp+ODg+OCr1xuICAgICAgICAgICAgICAgIG5vdElucHV0RXJyb3I9dGhpcy5jaGVja0lucHV0VmFsdWVCbGFuayhmaWVsZFR5cGUsZmllbGRWYWx1ZSxmaWVsZENvZGUsZmllbGRSZXF1aXJlZCxldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8v5b2i5byP5aSJ5o+b44CB5Z6L5aSJ5o+b44GX44Gf5YCk44KS5qC857SN44GZ44KL5aSJ5pWwXG4gICAgICAgICAgICBsZXQgY29ycmVjdEZvcm1hdHRlZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy/lvaLlvI/lpInmj5vjgIHlnovlpInmj5vjgZfjgZ/lgKTjgpLmoLzntI3jgZnjgovphY3liJdcbiAgICAgICAgICAgIGxldCBjb3JyZWN0VmFsdWVzIDphbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAvL+adoeS7tuW8j+OBrue1kOaenOOBjHRydWXjgIHlhaXlipvjgqjjg6njg7zvvIjnqbrnmb3mloflrZfjga7mt7flhaXvvInjgYzjgarjgYTloLTlkIjjgIHmjL/lhaXjgZnjgovlgKTjgpLjg5XjgqPjg7zjg6vjg4njgr/jgqTjg5fliKXjgavjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgICAgICAgIGlmKG5vdElucHV0RXJyb3Ipe1xuXG4gICAgICAgICAgICAgICAgLy/mloflrZfliJflnovjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICBpZihmaWVsZFR5cGUgPT09IFwiU0lOR0xFX0xJTkVfVEVYVFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJNVUxUSV9MSU5FX1RFWFRcIiB8fCBmaWVsZFR5cGUgPT09IFwiUklDSF9URVhUXCIgfHwgZmllbGRUeXBlID09PSBcIkxJTktcIiApe1xuICAgICAgICAgICAgICAgICAgICBjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgPSBmaWVsZFZhbHVlQXJyYXkuam9pbignLCcpO1xuXG4gICAgICAgICAgICAgICAgLy/mlbDlgKTlnovjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIHmlbDlgKTlnovjgavlnovlpInmj5vjgZfjgaZjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiTlVNQkVSXCIgKXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0TnVtYmVyKGZpZWxkVmFsdWVBcnJheVswXSxmaWVsZENvZGUsZXZlbnQpKXsvL+WFpeWKm+WApOODgeOCp+ODg+OCr1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdEZvcm1hdHRlZFZhbHVlID0gTnVtYmVyKGZpZWxkVmFsdWVBcnJheVswXSk7Ly/lnovlpInmj5tcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/ml6Xku5jjg7vml6XmmYLlnovjga7jg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIHmjIflrprjga7ml6Xku5jjg7vml6XmmYLjgavlvaLlvI/lpInmj5vjgZfjgaZjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiREFURVwiIHx8IGZpZWxkVHlwZSA9PT0gXCJEQVRFVElNRVwiICl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuY2hlY2tJbnB1dERhdGUoZmllbGRWYWx1ZUFycmF5WzBdLGZpZWxkQ29kZSxldmVudCkpey8v5YWl5Yqb5YCk44OB44Kn44OD44KvXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuY2hhbmdlRGF0ZUZvcm1hdChmaWVsZFZhbHVlQXJyYXlbMF0sZmllbGRUeXBlLGZpZWxkQ29kZSxldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1hdHRlZERhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdHRlZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/mmYLliLvjg5XjgqPjg7zjg6vjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgabjgYTjgovlgKTjgYzpganliIfjga7loLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiVElNRVwiKXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0VGltZShmaWVsZFZhbHVlQXJyYXlbMF0sZmllbGRDb2RlLGV2ZW50KSl7Ly/lhaXlipvlgKTjg4Hjgqfjg4Pjgq9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZpZWxkVmFsdWVBcnJheVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/jg6njgrjjgqrjg5zjgr/jg7Pjg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Pjga7jg5XjgqPjg7zjg6vjg4njga7pgbjmip7ogqLjgajlhaXlipvlgKTjgYzkuIDoh7TjgZfjgZ/loLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiUkFESU9fQlVUVE9OXCIgfHwgZmllbGRUeXBlID09PSBcIkRST1BfRE9XTlwiKXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jaGVja0lucHV0T3B0aW9uKGZpZWxkVmFsdWVBcnJheVswXSxmaWVsZE9wdGlvbnMsZmllbGRDb2RlLGV2ZW50KSl7Ly/lhaXlipvlgKTjg4Hjgqfjg4Pjgq9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSA9IGZpZWxkVmFsdWVBcnJheVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/jg4Hjgqfjg4Pjgq/jg5zjg4Pjgq/jgrnjg7vopIfmlbDpgbjmip7jga7jg5XjgqPjg7zjg6vjg4njga7pgbjmip7ogqLjgajlhaXlipvlgKTjgYzkuIDoh7TjgZfjgZ/loLTlkIjjgIFjb3JyZWN0VmFsdWVz44Gu6YWN5YiX44Gr5Luj5YWl44GZ44KLXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIkNIRUNLX0JPWFwiIHx8IGZpZWxkVHlwZSA9PT0gXCJNVUxUSV9TRUxFQ1RcIiApe1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrSW5wdXRPcHRpb24oZmllbGRWYWx1ZUFycmF5WzBdLGZpZWxkT3B0aW9ucyxmaWVsZENvZGUsZXZlbnQpKXsvL+WFpeWKm+WApOODgeOCp+ODg+OCr1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdFZhbHVlc1swXSA9IGZpZWxkVmFsdWVBcnJheVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/jg6bjg7zjgrbjg7zmg4XloLHjg5XjgqPjg7zjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/lgKTjgYzpganliIfjgarloLTlkIjjgIFjb3JyZWN0VmFsdWVzKOmFjeWIlynjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiVVNFUl9TRUxFQ1RcIil7XG4gICAgICAgICAgICAgICAgICAgIC8v5oy/5YWl44GZ44KL5YCk44GM44Om44O844K244O85oOF5aCx44GL44KJ6KaL44Gk44GL44KM44Gw44CB44Om44O844K244O85ZCN44KS5qC857SNXG4gICAgICAgICAgICAgICAgICAgIGxldCB1c2Vyc05hbWU9YXdhaXQgdGhpcy5zZXRJbnB1dFVzZXIoZmllbGRWYWx1ZUFycmF5KTtcblxuICAgICAgICAgICAgICAgICAgICAvL+ODpuODvOOCtuODvOWQjeOBjOagvOe0jeOBp+OBjeOBpuOBhOOCi+WgtOWQiOOAgeODreOCsOOCpOODs+WQjeOBqOODpuODvOOCtuODvOWQjeOCkmNvcnJlY3RWYWx1ZXPvvIjphY3liJfvvInjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgaWYoIXVzZXJzTmFtZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXT1cIuODpuODvOOCtuODvOmBuOaKnuOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+ODpuODvOOCtuODvOaDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44Om44O844K244O86YG45oqe44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf44Om44O844K244O85oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpbmRleElucHV0VXNlciBpbiBmaWVsZFZhbHVlQXJyYXkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdFZhbHVlcy5wdXNoKHsgY29kZTogZmllbGRWYWx1ZUFycmF5W2luZGV4SW5wdXRVc2VyXSwgbmFtZTogdXNlcnNOYW1lW2luZGV4SW5wdXRVc2VyXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy/ntYTnuZTmg4XloLHjg5XjgqPjg7zjg4njgavmjL/lhaXjgZfjgojjgYbjgajjgZfjgZ/lgKTjgYzpganliIfjgarloLTlkIjjgIFjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihmaWVsZFR5cGUgPT09IFwiT1JHQU5JWkFUSU9OX1NFTEVDVFwiKXtcbiAgICAgICAgICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgYzntYTnuZTmg4XloLHjgYvjgonopovjgaTjgYvjgozjgbDjgIHntYTnuZTlkI3jgpLmoLzntI1cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9yZ2FuaXphdGlvbnM9YXdhaXQgdGhpcy5zZXRJbnB1dE9yZ2FuaXphdGlvbihmaWVsZFZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL+e1hOe5lOWQjeOBjOagvOe0jeOBp+OBjeOBpuOBhOOCi+WgtOWQiOOAgee1hOe5lOOCs+ODvOODieOBqOe1hOe5lOWQjeOCkmNvcnJlY3RGb3JtYXR0ZWRWYWx1ZeOBq+S7o+WFpeOBmeOCi1xuICAgICAgICAgICAgICAgICAgICBpZighb3JnYW5pemF0aW9ucyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXT1cIue1hOe5lOmBuOaKnuODleOCo+ODvOODq+ODieOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+e1hOe5lOaDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi57WE57mU6YG45oqe44OV44Kj44O844Or44OJ44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf57WE57mU5oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZT1beyBjb2RlOiBmaWVsZFZhbHVlLCBuYW1lOiBvcmdhbml6YXRpb25zfV07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8v44Kw44Or44O844OX5oOF5aCx44OV44Kj44O844OJ44Gr5oy/5YWl44GX44KI44GG44Go44GX44Gf5YCk44GM6YGp5YiH44Gq5aC05ZCI44CBY29ycmVjdEZvcm1hdHRlZFZhbHVl44Gr5Luj5YWl44GZ44KLXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZmllbGRUeXBlID09PSBcIkdST1VQX1NFTEVDVFwiKXtcbiAgICAgICAgICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgYzjgrDjg6vjg7zjg5fmg4XloLHjgYvjgonopovjgaTjgYvjgozjgbDjgIHjgrDjg6vjg7zjg5flkI3jgpLmoLzntI1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3Vwcz1hd2FpdCB0aGlzLnNldElucHV0R3JvdXAoZmllbGRWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy/jgrDjg6vjg7zjg5flkI3jgYzmoLzntI3jgafjgY3jgabjgYTjgovloLTlkIjjgIHjgrDjg6vjg7zjg5fjgrPjg7zjg4njgajjgrDjg6vjg7zjg5flkI3jgpJjb3JyZWN0Rm9ybWF0dGVkVmFsdWXjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgaWYoIWdyb3Vwcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXVsnZXJyb3InXT1cIuOCsOODq+ODvOODl+mBuOaKnuODleOCo+ODvOODq+ODieOBq+OAgeaMv+WFpeOBl+OCiOOBhuOBqOOBl+OBn+OCsOODq+ODvOODl+aDheWgseOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAguOAjOWApOOCkuaMv+WFpeOBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi44Kw44Or44O844OX6YG45oqe44OV44Kj44O844Or44OJ44Gr44CB5oy/5YWl44GX44KI44GG44Go44GX44Gf44Kw44Or44O844OX5oOF5aCx44Gv6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44Gf44CC44CM5YCk44KS5oy/5YWl44GZ44KL44CN44Kz44Oz44Od44O844ON44Oz44OI44Gu5Yem55CG44KS5Lit5pat44GX44G+44GX44Gf44CCXCIpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZT1beyBjb2RlOiBmaWVsZFZhbHVlLCBuYW1lOiBncm91cHN9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0ID0gdGhpcy5nZXRDb25kaXRpb25SZXN1bHQoY29udGV4dCk7XG4gICAgICAgICAgICAvL+S/neWtmOaIkOWKn+OCpOODmeODs+ODiOOBruWgtOWQiOOAgWtpbnRvbmUgYXN5bmMvYXdhaXQg44Gr44KI44KL6Z2e5ZCM5pyf5Yem55CG44Gn44OV44Kj44O844Or44OJ44Gr5YCk44KS5oy/5YWl44GZ44KLXG4gICAgICAgICAgICBpZighZXZlbnQudHlwZT8uaW5jbHVkZXMoJ3N1Y2Nlc3MnKSl7XG5cbiAgICAgICAgICAgICAgICAvL+adoeS7tuW8j+OBrue1kOaenOOBjHRydWXjgYvjgaTmjL/lhaXjgZnjgovlgKTjgYzlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4nvvIjjg6njgrjjgqrjg5zjgr/jg7Pjg7vjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg7vjg4Hjgqfjg4Pjgq/jg5zjg4Pjgq/jgrnjg7vopIfmlbDpgbjmip7jg7vmloflrZfliJfkuIDooYzjg7vmloflrZfliJfopIfmlbDooYzjg7vjg6rjg4Pjg4Hjgqjjg4fjgqPjgr/jg7vmlbDlgKTjg7vml6Xku5jjg7vml6XmmYLjg7vmmYLliLvvvInjgavjgrvjg4Pjg4hcbiAgICAgICAgICAgICAgICBpZihjb25kaXRpb25SZXN1bHQpe1xuICAgICAgICAgICAgICAgICAgICAvL+WApOOCkuato+OBl+OBhOW9ouW8j+OBq+WkieaPm+OBp+OBjeOBn+WgtOWQiOOAgeODleOCo+ODvOODq+ODieOBq+WApOOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAgICAgICAgICAgICAgICBpZihjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy/lgKTjgpLmraPjgZfjgYTlvaLlvI/vvIjphY3liJfvvInjgavlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4njgavlgKTvvIjphY3liJfvvInjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RWYWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1lbHNle1xuXG4gICAgICAgICAgICAgICAgLy/mjL/lhaXjgZnjgovlgKTjgpLmjL/lhaXlhYjjg5XjgqPjg7zjg6vjg4njgavlgKTjgpLjgrvjg4Pjg4jjgZfjgIFraW50b25lQVBJ44Gr44KI44Gj44Gm44Os44Kz44O844OJ5pu05paw44KS6KGM44GGXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gc2V0VXBkYXRlRGF0YShjb25kaXRpb25SZXN1bHQ6Ym9vbGVhbixmaWVsZENvZGU6c3RyaW5nLGV2ZW50OmFueSxjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgOmFueSxjb3JyZWN0VmFsdWVzIDphbnkpIHtcblxuICAgICAgICAgICAgICAgICAgICAvL+WApOOCkuato+OBl+OBhOW9ouW8j+OBq+WkieaPm+OBp+OBjeOBn+WgtOWQiOOAgeODleOCo+ODvOODq+ODieOBq+WApOOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAgICAgICAgICAgICAgICBpZihjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy/lgKTjgpLmraPjgZfjgYTlvaLlvI/vvIjphY3liJfvvInjgavlpInmj5vjgafjgY3jgZ/loLTlkIjjgIHjg5XjgqPjg7zjg6vjg4njgavlgKTvvIjphY3liJfvvInjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZSA9IGNvcnJlY3RWYWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyDmnaHku7bjgYznnJ/jga7loLTlkIjjga7lh6bnkIbjgIFraW50b25lQVBJ44Gr44KI44KL6Z2e5ZCM5pyf5Yem55CG77yI44Os44Kz44O844OJ5pu05paw77yJXG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjb3JyZWN0Rm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlRGF0YShmaWVsZENvZGUsZXZlbnQsY29ycmVjdEZvcm1hdHRlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZURhdGEoZmllbGRDb2RlLGV2ZW50LGNvcnJlY3RWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9raW50b25lIGFzeW5jL2F3YWl0IOOBq+OCiOOCi+mdnuWQjOacn+WHpueQhu+8iOODrOOCs+ODvOODieabtOaWsO+8iVxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhdGEoZmllbGRDb2RlOnN0cmluZyxldmVudDphbnksaW5zZXJ0VmFsdWU6YW55KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkUmVjb3JkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogZXZlbnQuYXBwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICBldmVudC5yZWNvcmRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IHtbZmllbGRDb2RlXTp7XCJ2YWx1ZVwiOmluc2VydFZhbHVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0FQSeOBp+ODpuODvOOCtuODvOaDheWgseOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcCA9YXdhaXQga2ludG9uZS5hcGkoa2ludG9uZS5hcGkudXJsKCcvay92MS9yZWNvcmQnLCB0cnVlKSwgJ1BVVCcsIHVwZGF0ZWRSZWNvcmQpXG5cbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8g6Zai5pWw44Gu5ZG844Gz5Ye644GXXG4gICAgICAgICAgICAgICAgc2V0VXBkYXRlRGF0YShjb25kaXRpb25SZXN1bHQsZmllbGRDb2RlLGV2ZW50LGNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSxjb3JyZWN0VmFsdWVzKTtcblxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzdWx0PSB7XG4gICAgICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9Y2F0Y2goZXJyb3I6YW55KXtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9dHJ1ZTsvL+asoeOBruODjuODvOODieOBr+WHpueQhuOCkue2muOBkeOCi1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQg5p2h5Lu25byP44KS5a6f6KGM44GZ44KLXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDphbnkpOmJvb2xlYW57XG4gICAgICAgIC8v44OX44Ot44OR44OG44KjYGNvbmRpdGlvbmDjgYvjgonmnaHku7bjg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgICAgY29uc3QgdHJlZSA9dGhpcy5nZXRDb25kaXRpb24odGhpcy5wcm9wcy5jb25kaXRpb24pO1xuICAgICAgICBpZighdHJlZSl7XG4gICAgICAgICAgICAvL+adoeS7tuOCkuioreWumuOBleOCjOOBpuOBhOOBvuOBm+OCk1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyZWUuZXZhbHVhdGUodHJlZS5yb290LGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25kaXRpb24g5p2h5Lu25byP44OE44Oq44O844KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb24oY29uZGl0aW9uOnN0cmluZyk6Q29uZGl0aW9uVHJlZXxudWxse1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICBjb25zdCB0cmVlID0gbmV3IENvbmRpdGlvblRyZWUoKTtcbiAgICAgICAgICAgIHRyZWUuZnJvbUpzb24oY29uZGl0aW9uKTtcbiAgICAgICAgICAgIGlmKHRyZWUuZ2V0Q29uZGl0aW9ucyh0cmVlLnJvb3QpLmxlbmd0aD4wKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9Y2F0Y2goZXJyb3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG5cbn1cbm5ldyBJbnNlcnRWYWx1ZUFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0LCBJVmFyTmFtZX0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSUdldFZhbHVlUHJvcHN7XG4gICAgZmllbGQ6SUZpZWxkOy8v44OB44Kn44OD44Kv44GZ44KL44OV44Kj44O844Or44OJ44Gu5a++6LGhXG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcbn1cbi8qKlxuICog5q2j6KaP6KGo54++44OB44Kn44OD44Kv44Ki44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBHZXRWYWx1ZUFjaXRvbiBpbXBsZW1lbnRzIElBY3Rpb257XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcbiAgICBwcm9wczpJR2V0VmFsdWVQcm9wcztcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLm5hbWU9XCLlgKTjgpLlj5blvpfjgZnjgotcIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICB2ZXJOYW1lOntuYW1lOicnfVxuICAgICAgICB9XG4gICAgICAgIC8v44Ki44Kv44K344On44Oz44KS55m76Yyy44GZ44KLXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnksY29udGV4dDpJQ29udGV4dCk6UHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgICAgIGxldCByZXN1bHQ9e1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OmZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICBpZiAoISgnZmllbGQnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmICEoJ3Zlck5hbWUnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJR2V0VmFsdWVQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLnZhbHVlO1xuICAgICAgICAgICAgaWYodGhpcy5wcm9wcy52ZXJOYW1lICYmIHRoaXMucHJvcHMudmVyTmFtZS5uYW1lIT09Jycpe1xuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIC8vIGV2ZW50LmVycm9yPWVycm9yO1xuICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxuICAgIFxufVxubmV3IEdldFZhbHVlQWNpdG9uKCk7XG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyBJRmllbGQsIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXIgfSBmcm9tIFwiLi4vdXRpbC9mb3JtYXRcIjtcclxuXHJcbi8v5Y+zVUnnlLvpnaJwcm9wZXJ0eeOBrm5hbWU65Z6L77yaXHJcbmludGVyZmFjZSBJU3RyaW5nSm9pblByb3Bze1xyXG4gICAgLy/kv53lrZjlhYjjg5XjgqPjg7zjg6vjg4lcclxuICAgIHNhdmVGaWVsZDpJRmllbGQ7XHJcbiAgICAvL+e1kOWQiOWFg+ODleOCo+ODvOODq+ODiTFcclxuICAgIGpvaW5GaWVsZDE6SUZpZWxkO1xyXG4gICAgLy/ntZDlkIjlhYPjg5XjgqPjg7zjg6vjg4kyXHJcbiAgICBqb2luRmllbGQyOklGaWVsZDtcclxuICAgIC8v5Yy65YiH44KK5paH5a2XXHJcbiAgICBkZWxpbWl0ZXI6c3RyaW5nO1xyXG59XHJcblxyXG4vL0lBY3Rpb27jgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgpLlrp/oo4XjgZnjgovmlrDjgZfjgYTjgq/jg6njgrlBY3Rpb27jgpLkvZzmiJDvvJpcclxuZXhwb3J0IGNsYXNzIFN0cmluZ0pvaW5BY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgLy9pbXBvcnTjgYvjgonlsI7lhaXpoZXnpLrlrprnvqlcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIC8v5LiK5pa544GuaW50ZXJmYWNlIFByb3Bz44GL44KJ44CBcHJvcHPlj5fjgZHjgovlsZ7mgKfjgpLlrprnvqnvvJpcclxuICAgIHByb3BzOklTdHJpbmdKb2luUHJvcHM7XHJcbiAgICAvL+mWouaVsOWumue+qeOBq+W/heimgeOBqumhnuWQjeOCkuani+evie+8mlxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvL3BnQWRtaW5EQuOBq+eZu+mMsuOBl+OBn+OCouOCr+OCt+ODp+ODs+WQjShuYW1lL3N1YnRpdGxlKeS4gOiHtOOBmeOCi+W/heimgeOBjOOBguOCi++8mlxyXG4gICAgICAgIHRoaXMubmFtZT1cIuaWh+Wtl+e1kOWQiFwiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgICAgIC8v44OX44Ot44OR44OG44Kj5bGe5oCn5Yid5pyf5YyW77yaXHJcbiAgICAgICAgdGhpcy5wcm9wcz17XHJcbiAgICAgICAgICAgIHNhdmVGaWVsZDp7Y29kZTonJ30sXHJcbiAgICAgICAgICAgIGpvaW5GaWVsZDE6e2NvZGU6Jyd9LFxyXG4gICAgICAgICAgICBqb2luRmllbGQyOntjb2RlOicnfSxcclxuICAgICAgICAgICAgZGVsaW1pdGVyOicnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v44Oq44K744OD44OI5LiK6KiY55m76Yyy6KGo77yaXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu5Yem55CG44KS5a6f6KOF44GZ44KLXHJcbiAqIEBwYXJhbSBhY3Rpb25Ob2RlIOOCouOCr+OCt+ODp+ODs+ODjuODvOODiVxyXG4gKiBAcGFyYW0gZXZlbnQgS2ludG9uZeOBruOCpOODmeODs+ODiFxyXG4gKiBAcGFyYW0gY29udGV4dCDjgrPjg7Pjg4bjgq3jgrnjg4jvvIjjg6zjgrPjg7zjg4njgIHlpInmlbDmg4XloLHjgpLmjIHjgaPjgabjgYTjgovvvIlcclxuICogQHJldHVybnMgXHJcbiAqL1xyXG4gICAgLy/pnZ7lkIzmnJ/lh6bnkIbjgYLjgovplqLmlbDkuIvjga7jgYLjgovlsZ7mgKfvvJpcclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTpJQWN0aW9uTm9kZSxldmVudDphbnkpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICAvL+W+jOe2meWHpueQhuS4jeWPr++8mlxyXG4gICAgICAgICAgICBjYW5OZXh0OmZhbHNlLFxyXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgovvvJpcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICAvL+ODl+ODreODkeODhuOCo+ioreWumuOBruODh+ODvOOCv+Wei+OBr+W/heimgeOBquaDheWgseWQq+OCgeOBvuOBmeOBi++8n+WFqOmDqOS4jeWtmOWcqOaZgnJldHVybjpcclxuICAgICAgICAgICAgaWYgKCEoJ3NhdmVGaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnam9pbkZpZWxkMScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnam9pbkZpZWxkMicgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/ml6Llrprjga7jg5fjg63jg5Hjg4bjgqPjga7jgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgbjlpInmj5vvvJpcclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSVN0cmluZ0pvaW5Qcm9wcztcclxuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkO1xyXG5cclxuICAgICAgICAgICAgLy9raW50b25l44OV44Kj44O844Or44OJ44K/44Kk44OX5Y+W5b6X77yaXHJcbiAgICAgICAgICAgIGNvbnN0IGpvaW5GaWVsZDF0eXBlPXRoaXMucHJvcHMuam9pbkZpZWxkMS50eXBlO1xyXG4gICAgICAgICAgICBjb25zdCBqb2luRmllbGQydHlwZT10aGlzLnByb3BzLmpvaW5GaWVsZDIudHlwZTtcclxuICAgICAgICAgICAgY29uc3Qgc2F2ZUZpZWxkdHlwZT10aGlzLnByb3BzLnNhdmVGaWVsZC50eXBlO1xyXG5cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8vIC8v5L+d5a2Y5YWI44OV44Kj44O844Or44OJ44Gv5paH5a2X5YiX44OV44Kj44O844Or44OJ44Gn44Gv44Gq44GE5aC05ZCI44CB44Ko44Op44O855m655Sf77yaXHJcbiAgICAgICAgICAgIGlmKCEoc2F2ZUZpZWxkdHlwZT09PSdTSU5HTEVfTElORV9URVhUJ3x8c2F2ZUZpZWxkdHlwZT09PSdNVUxUSV9MSU5FX1RFWFQnfHxzYXZlRmllbGR0eXBlPT09J1JJQ0hfVEVYVCcpKXtcclxuICAgICAgICAgICAgICAgIGV2ZW50LmVycm9yPSdb44Ko44Op44O844Oh44OD44K744O844K4Xe+8mue1kOWQiOS/neWtmOWFiOWvvuW/nOS4jeWPr+OAgue1kOWQiOOBl+OBvuOBm+OCkyc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZS5pbmNsdWRlcygnc3VjY2VzcycpKXtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoXCJbd2luZG93cyBhbGVydF3vvJpcIitldmVudC5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuTmV4dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8v5YCk5Y+W5b6X5pa55rOV5a6a576p77yaXHJcbiAgICBmdW5jdGlvbiBnZXRWYWx1ZSh2YWx1ZTpzdHJpbmcsdHlwZTpzdHJpbmd8dW5kZWZpbmVkLGZpZWxkQ29kZTpzdHJpbmcsZXZlbnQ6YW55KXtcclxuICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT11bmRlZmluZWR8fGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZT09PW51bGwpe1xyXG4gICAgICAgICAgICBldmVudC5yZWNvcmRbZmllbGRDb2RlXS52YWx1ZT0nJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/kvZzmiJDogIXjgIHmm7TmlrDogIXvvJpcclxuICAgICAgICBpZih0eXBlPT09J0NSRUFUT1InfHx0eXBlPT09J01PRElGSUVSJyl7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlLm5hbWU7XHJcbiAgICAgICAgLy/ml6XmmYLjgIHkvZzmiJDml6XmmYLjgIHmm7TmlrDml6XmmYLvvJpcclxuICAgICAgICB9ZWxzZSBpZih0eXBlPT09J0RBVEVUSU1FJ3x8dHlwZT09PSdDUkVBVEVEX1RJTUUnfHx0eXBlPT09J1VQREFURURfVElNRScpe1xyXG4gICAgICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWUhPT11bmRlZmluZWQgJiYgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBGb3JtYXR0ZXIuZGF0ZUZvcm1hdChuZXcgRGF0ZShldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWUpLCd5eXl5LU1NLWRkIEhIOm1tJyk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1ldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy/jg6bjg7zjgrbpgbjmip7jgIHntYTnuZTpgbjmip7jgIHjgrDjg6vjg7zjg5fpgbjmip7jgIHmt7vku5jjg5XjgqHjgqTjg6vlkI3jgIHkvZzmpa3ogIXjgIHjgqvjg4bjgrTjg6rjg7zvvJpcclxuICAgICAgICB9ZWxzZSBpZih0eXBlPT09J1VTRVJfU0VMRUNUJ3x8dHlwZT09PSdPUkdBTklaQVRJT05fU0VMRUNUJ3x8dHlwZT09PSdHUk9VUF9TRUxFQ1QnfHx0eXBlPT09J0ZJTEUnfHx0eXBlPT09J1NUQVRVU19BU1NJR05FRScpe1xyXG4gICAgICAgICAgICBpZihldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT11bmRlZmluZWQgfHwgZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlPT09Jycpe1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW90b3RleHQ9ZXZlbnQucmVjb3JkW2ZpZWxkQ29kZV0/LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGFycj1bXTtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8bW90b3RleHQubGVuZ3RoO2krKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2gobW90b3RleHRbaV0ubmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL+mFjeWIl+imgee0oOOCkizjgafpgKPntZDjgZfjgabmloflrZfliJfjgpLkvZzmiJDvvJpcclxuICAgICAgICAgICAgICAgIHZhbHVlPWFyci5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvL+OCq+ODhuOCtOODquODvOOAgeODgeOCp+ODg+OCr+ODnOODg+OCr+OCueOAgeikh+aVsOmBuOaKnu+8mlxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGU9PT0nQ0FURUdPUlknfHx0eXBlPT09J0NIRUNLX0JPWCd8fHR5cGU9PT0nTVVMVElfU0VMRUNUJyl7XHJcbiAgICAgICAgICAgIGlmKGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZT09PXVuZGVmaW5lZCB8fCBldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU9PT0nJyl7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb3RvdGV4dD1ldmVudC5yZWNvcmRbZmllbGRDb2RlXT8udmFsdWU7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXJyPVtdO1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxtb3RvdGV4dC5sZW5ndGg7aSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChtb3RvdGV4dFtpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL+mFjeWIl+imgee0oOOCkizjgafpgKPntZDjgZfjgabmloflrZfliJfjgpLkvZzmiJDvvJpcclxuICAgICAgICAgICAgICAgIHZhbHVlPWFyci5qb2luKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvL+ips+e0sOeUu+mdouODl+ODreOCu+OCueWun+ihjOW+jOOBruOCueODhuODvOOCv+OCue+8mlxyXG4gICAgICAgIH1lbHNlIGlmKHR5cGU9PT0nU1RBVFVTJyYmZXZlbnQudHlwZS5pbmNsdWRlcygncHJvY2VzcycpKXtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudC5uZXh0U3RhdHVzLnZhbHVlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnJlY29yZFtmaWVsZENvZGVdPy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09bnVsbCl7XHJcbiAgICAgICAgICAgIHZhbHVlPScnO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB2YWx1ZTsgICAgIFxyXG4gICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8v5YCk5Y+W5b6X5pa55rOV5ZG85Ye677yaXHJcbiAgICAgICAgICAgIGxldCBqb2luVmFsdWUxOnN0cmluZz0nJztcclxuICAgICAgICAgICAgam9pblZhbHVlMT1nZXRWYWx1ZShqb2luVmFsdWUxLGpvaW5GaWVsZDF0eXBlLHRoaXMucHJvcHMuam9pbkZpZWxkMS5jb2RlLGV2ZW50KTtcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICBsZXQgam9pblZhbHVlMjpzdHJpbmc9Jyc7XHJcbiAgICAgICAgICAgIGpvaW5WYWx1ZTI9Z2V0VmFsdWUoam9pblZhbHVlMixqb2luRmllbGQydHlwZSx0aGlzLnByb3BzLmpvaW5GaWVsZDIuY29kZSxldmVudCk7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgY29uc3QgY29uU3RyaW5nID0gdGhpcy5wcm9wcy5kZWxpbWl0ZXI7XHJcbiAgICAgICAgICAgIGxldCBzYXZlVmFsdWU6c3RyaW5nPScnO1xyXG4gICAgICAgICAgICAvL+WJjeW+jOe1kOWQiOWFg+OBjOepuueZveOBquOCieWMuuWIh+OCiuaWh+Wtl+OCguepuueZveOBq+OBmeOCiyjkvos6MS0444GuOOeEoeOBhOOBquOCiTHjgIIxLTjjga4x54Sh44GE44Gq44KJOOOAgjHnqbrnmb0444GuOOeEoeOBhOOBquOCiTHjgILntZDlkIjlhYPlhajpg6jnqbrnmb3jgarjgonlhajpg6jnqbrnmb0pOlxyXG4gICAgICAgICAgICBpZihqb2luVmFsdWUxPT09JycmJmpvaW5WYWx1ZTI9PT0nJyl7XHJcbiAgICAgICAgICAgICAgICBzYXZlVmFsdWU9Jyc7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGpvaW5WYWx1ZTE9PT0nJyYmam9pblZhbHVlMiE9PScnKXtcclxuICAgICAgICAgICAgICAgIHNhdmVWYWx1ZT1qb2luVmFsdWUyO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihqb2luVmFsdWUyPT09JycmJmpvaW5WYWx1ZTEhPT0nJyl7XHJcbiAgICAgICAgICAgICAgICBzYXZlVmFsdWU9am9pblZhbHVlMTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoam9pblZhbHVlMSE9PScnJiZqb2luVmFsdWUyIT09Jycpe1xyXG4gICAgICAgICAgICAgICAgc2F2ZVZhbHVlPWAke2pvaW5WYWx1ZTF9JHtjb25TdHJpbmd9JHtqb2luVmFsdWUyfWBcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgLy/mlrDopo8v5pu05pawL+S4gOimp+S/neWtmOaIkOWKn+W+jOOBruS7peWkluOBrmV2ZW5044GnUFVU5L2/55So44GX44Gq44GE77yaXHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudHlwZS5pbmNsdWRlcygnc3VjY2VzcycpKXtcclxuICAgICAgICAgICAgICAgICAvL+S/neWtmOWFiOODleOCo+ODvOODq+ODieOBq+WApOOCu+ODg+ODiO+8mlxyXG4gICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLnNhdmVGaWVsZC5jb2RlXS52YWx1ZT1zYXZlVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgLy93aW5kb3cuYWxlcnQoXCLmloflrZfntZDlkIjooYzjgYTjgb7jgZfjgZ/jgIJcIit0aGlzLnByb3BzLmpvaW5GaWVsZDEubmFtZStcIjpcIitqb2luVmFsdWUxK1wiLFwiK3RoaXMucHJvcHMuam9pbkZpZWxkMi5uYW1lK1wiOlwiK2pvaW5WYWx1ZTIrXCLjgIJcIik7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgLy9raW50b25lIGFzeW5jL2F3YWl0IOOBq+OCiOOCi+mdnuWQjOacn+WHpueQhijmiJDlip/jgqTjg5njg7Pjg4hSRVNUIEFQSeWHpueQhuaZginvvJpcclxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVJlY29yZChmaWVsZENvZGU6c3RyaW5nLGV2ZW50OmFueSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkUmVjb3JkID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBldmVudC5hcHBJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAgZXZlbnQucmVjb3JkSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IHtbZmllbGRDb2RlXTp7XCJ2YWx1ZVwiOnNhdmVWYWx1ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbnRvbmUuYXBpKGtpbnRvbmUuYXBpLnVybCgnL2svdjEvcmVjb3JkJywgdHJ1ZSksICdQVVQnLCB1cGRhdGVkUmVjb3JkLCAocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8va2ludG9uZeS/neWtmOWFiOODleOCo+ODvOODq+ODieWtmOWcqOeiuuiqje+8mlxyXG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuc2F2ZUZpZWxkLmNvZGVdLnZhbHVlPXNhdmVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIC8va2ludG9uZSBhc3luYy9hd2FpdCDjgavjgojjgovpnZ7lkIzmnJ/lh6bnkIbvvJpcclxuICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVJlY29yZCh0aGlzLnByb3BzLnNhdmVGaWVsZC5jb2RlLGV2ZW50KTsgICBcclxuICAgICAgICAgICAgICAgIC8v5LiA6Kan55S76Z2i5pu05paw5oiQ5Yqf5b6M5omL5YuV44Oq44Ot44O844OJ44GP44Gg44GV44GE77yaICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUuaW5jbHVkZXMoJ2luZGV4Jykpe1xyXG4gICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmFsZXJ0KFwi5paH5a2X57WQ5ZCI6KGM44GE44G+44GX44Gf44CCXCIrdGhpcy5wcm9wcy5qb2luRmllbGQxLm5hbWUrXCI6XCIram9pblZhbHVlMStcIixcIit0aGlzLnByb3BzLmpvaW5GaWVsZDIubmFtZStcIjpcIitqb2luVmFsdWUyK1wi44CC5LiA6Kan55S76Z2i5pu05paw5oiQ5Yqf5b6M6Ieq5YuV44Oq44Ot44O844OJ44GX44G+44Gb44KT44CC5b+F6KaB44Gr5b+c44GY44Gm5omL5YuV44Oq44Ot44O844OJ44GP44Gg44GV44GE44CCXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hbGVydChcIuaWh+Wtl+e1kOWQiOOBq+OBr+OAgeS4gOimp+eUu+mdouabtOaWsOaIkOWKn+W+jOiHquWLleODquODreODvOODieOBl+OBvuOBm+OCk+OAguW/heimgeOBq+W/nOOBmOOBpuaJi+WLleODquODreODvOODieOBj+OBoOOBleOBhOOAglwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgcmVzdWx0PSB7XHJcbiAgICAgICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfWNhdGNoKGVycm9yKXs7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlLmluY2x1ZGVzKCdzdWNjZXNzJykpe1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KFwiW3dpbmRvd3MgYWxlcnRd77ya5Yem55CG5Lit55Ww5bi444GM55m655Sf44GX44G+44GX44Gf44CC57WQ5ZCI44GX44G+44Gb44KT44CC44K344K544OG44Og5ouF5b2T6ICF44G444GK5ZWP5ZCI44Gb44GP44Gg44GV44GE44CCZXJyb3Ljg6Hjg4Pjgrvjg7zjgrjvvJpcIitlcnJvcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBldmVudC5lcnJvcj1cIlvjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrhd77ya5Yem55CG5Lit55Ww5bi444GM55m655Sf44GX44G+44GX44Gf44CC57WQ5ZCI44GX44G+44Gb44KT44CC44K344K544OG44Og5ouF5b2T6ICF44G444GK5ZWP5ZCI44Gb44GP44Gg44GV44GE44CCZXJyb3Ljg6Hjg4Pjgrvjg7zjgrjvvJpcIitlcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNhbk5leHQ6ZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6ZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XHJcbiAgICB9XHJcbn1cclxubmV3IFN0cmluZ0pvaW5BY3Rpb24oKTsiLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuXG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG4gICAgaW50ZXJmYWNlIEZ1bGxXaWR0aFByb3Bze1xuICAgICAgICBmaWVsZDpJRmllbGRcbiAgICB9XG4vKipcbiAqIOWFqOinkuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgRnVsbFdpZHRoQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOkZ1bGxXaWR0aFByb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuWFqOinkuODgeOCp+ODg+OCr1wiOyAvKiBwZ2FkbWlu44GubmFtZeOBqOWQjOanmCAgKi9cbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ31cbiAgICAgICAgfVxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0PXtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2ZpZWxkJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBGdWxsV2lkdGhQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXT8udmFsdWU7XG4gICAgICAgICAgICAvL+adoeS7tuWIhuWykFxuICAgICAgICAgICAgLy/mnKrlhaXlipvmmYLjga/kvZXjgoLlh6bnkIbjgpLjgZvjgZrntYLkuoZcbiAgICAgICAgICAgIGlmKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09Jycpe1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPW51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+WNiuinkuOBjOWQq+OBvuOCjOOBpuOBhOOBn+WgtOWQiHJlc3VsdOOBjGZhbHNlXG4gICAgICAgICAgICBpZighdGhpcy5jb250YWluc0Z1bGxXaWR0aENoYXJzKHZhbHVlKSAmJiAhKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09JycpKXtcbiAgICAgICAgICAgICAgICAvL+OCqOODqeODvOaZguOBq+WHuuWKm+OBleOCjOOCi+aWh+Wtl+ioreWumlxuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPVwi5Y2K6KeS44GM5ZCr44G+44KM44Gm44GE44G+44GZXCI7XG4gICAgICAgICAgICAgICAgLy/mrKHjga7lh6bnkIbjgpLkuK3mraLjgZnjgovlgKToqK3lrppcbiAgICAgICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgcmVjb3JkW3RoaXMucHJvcHMuZmllbGQuY29kZV0uZXJyb3I9bnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vcmVzdWx044OX44Ot44OR44OG44Kj5oyH5a6aXG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDp0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIC8v5L6L5aSW5Yem55CGXG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICAvLyBldmVudC5lcnJvcj1lcnJvcjtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8g5YWo44Gm5YWo6KeS44Gu5paH5a2X5YiX44Gu5aC05ZCI44GvdHJ1ZeOAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr2ZhbHNlXG4gICAgY29udGFpbnNGdWxsV2lkdGhDaGFycyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgICAgICAvLyDljYrop5Loi7HmlbDlrZfjgqvjg4roqJjlj7fjgpLpmaTlpJZcbiAgICAgICAgLy/lhajop5LjgYvjganjgYbjgYtcbiAgICAgICAgY29uc3QgY2hlY2tSZWdleD1cIl5bXlxceDAxLVxceDdFXFx1RkY2MS1cXHVGRjlGXSskXCI7XG5cbiAgICAgICAgLy/mraPopo/ooajnj77jgqrjg5bjgrjjgqfjgq/jg4jnlJ/miJBcbiAgICAgICAgY29uc3QgZnVsbFdpZHRoUmVnZXggPSBuZXcgUmVnRXhwKGNoZWNrUmVnZXgpO1xuXG4gICAgICAgIC8v5q2j6KaP6KGo54++44OB44Kn44OD44KvXG4gICAgICAgIHJldHVybiBmdWxsV2lkdGhSZWdleC50ZXN0KHRleHQpO1xuICAgIH1cblxuICAgIC8v5oi744KK5YCk44KS5oyB44Gf44Gq44GE44Gf44KBdm9pZOWei1xuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbn1cbm5ldyBGdWxsV2lkdGhBY3Rpb24oKTsiLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgIElBY3Rpb24sSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkLCBJQ29udGV4dCB9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuXG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG4gICAgaW50ZXJmYWNlIEhhbGZXaWR0aFByb3Bze1xuICAgICAgICBmaWVsZDpJRmllbGRcbiAgICB9XG4vKipcbiAqIOWNiuinkuODgeOCp+ODg+OCr+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgSGFsZldpZHRoQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOkhhbGZXaWR0aFByb3BzO1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMubmFtZT1cIuWNiuinkuODgeOCp+ODg+OCr1wiOyAvKiBwZ2FkbWlu44GubmFtZeOBqOWQjOanmCAgKi9cbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ31cbiAgICAgICAgfVxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0PXtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1hY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xuICAgICAgICAgICAgaWYgKCEoJ2ZpZWxkJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBIYWxmV2lkdGhQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAgICBpZighKHRoaXMucHJvcHMuZmllbGQuY29kZSBpbiByZWNvcmQpKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXT8udmFsdWU7XG4gICAgICAgICAgICAvL+adoeS7tuWIhuWykFxuICAgICAgICAgICAgLy/mnKrlhaXlipvmmYLjga/kvZXjgoLlh6bnkIbjgpLjgZvjgZrntYLkuoZcbiAgICAgICAgICAgIGlmKHZhbHVlPT09dW5kZWZpbmVkIHx8IHZhbHVlPT09Jycpe1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPW51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+WFqOinkuOBjOWQq+OBvuOCjOOBpuOBhOOBn+WgtOWQiOS/neWtmOWHpueQhuS4reatoijjgqjjg6njg7zlh6bnkIYpXG4gICAgICAgICAgICBpZighdGhpcy5jb250YWluc0hhbGZXaWR0aENoYXJzKHZhbHVlKSl7XG4gICAgICAgICAgICAgICAgLy/jgqjjg6njg7zmmYLjgavlh7rlipvjgZXjgozjgovmloflrZfoqK3lrppcbiAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvcj1cIuWFqOinkuOBjOWQq+OBvuOCjOOBpuOBhOOBvuOBmVwiO1xuICAgICAgICAgICAgICAgIC8v5qyh44Gu5Yem55CG44KS5Lit5q2i44GZ44KL5YCk6Kit5a6aXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yPW51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+WNiuinkuOBruWgtOWQiOWVj+mhjOOBquOBj+Wun+ihjFxuICAgICAgICAgICAgLy9yZXN1bHTjg5fjg63jg5Hjg4bjgqPmjIflrppcbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OnRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIC8v5L6L5aSW5Yem55CGXG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICAvLyBldmVudC5lcnJvcj1lcnJvcjtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8g5YWo44Gm5YWo6KeS44Gu5paH5a2X5YiX44Gu5aC05ZCI44GvdHJ1ZeOAgeOBneOBhuOBp+OBquOBhOWgtOWQiOOBr2ZhbHNlXG4gICAgY29udGFpbnNIYWxmV2lkdGhDaGFycyh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBjaGVja1JlZ2V4ID0gXCJeW1xceDAxLVxceDdFXFx1RkY2MS1cXHVGRjlGXSskXCI7XG4gICAgICAgIC8v5q2j6KaP6KGo54++44Kq44OW44K444Kn44Kv44OI55Sf5oiQXG4gICAgICAgIGNvbnN0IGhhbGZXaWR0aFJlZ2V4ID0gbmV3IFJlZ0V4cChjaGVja1JlZ2V4KTtcblxuICAgICAgICAvL+ato+imj+ihqOePvuODgeOCp+ODg+OCr1xuICAgICAgICByZXR1cm4gaGFsZldpZHRoUmVnZXgudGVzdCh0ZXh0KTtcbiAgICB9XG4gICAgLy/miLvjgorlgKTjgpLmjIHjgZ/jgarjgYTjgZ/jgoF2b2lk5Z6LXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxufVxubmV3IEhhbGZXaWR0aEFjdGlvbigpOyIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQge1xuICBJQWN0aW9uLFxuICBJQWN0aW9uUmVzdWx0LFxuICBJQWN0aW9uTm9kZSxcbiAgSUFjdGlvblByb3BlcnR5LFxuICBJRmllbGQsXG4gIElDb250ZXh0LFxuICBJVmFyTmFtZSxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSBcIi4uL3R5cGVzL0NvbmRpdGlvbnNcIjtcblxuLyoqXG4gKiAg44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXG4gKi9cbmludGVyZmFjZSBJQ29udmVyc2lvblByb3BzIHtcbiAgZmllbGQ6IElGaWVsZDtcbiAgY29udmVyc2lvbjogc3RyaW5nO1xuICB2ZXJOYW1lOiBJVmFyTmFtZTtcbn1cblxuY29uc3QgZnVsbFdpZHRoVG9IYWxmV2lkdGhNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gIOOCrDogXCLvvbbvvp5cIixcbiAg44KuOiBcIu+9t+++nlwiLFxuICDjgrA6IFwi7724776eXCIsXG4gIOOCsjogXCLvvbnvvp5cIixcbiAg44K0OiBcIu+9uu++nlwiLFxuICDjgrY6IFwi7727776eXCIsXG4gIOOCuDogXCLvvbzvvp5cIixcbiAg44K6OiBcIu+9ve++nlwiLFxuICDjgrw6IFwi772+776eXCIsXG4gIOOCvjogXCLvvb/vvp5cIixcbiAg44OAOiBcIu++gO++nlwiLFxuICDjg4I6IFwi776B776eXCIsXG4gIOODhTogXCLvvoLvvp5cIixcbiAg44OHOiBcIu++g+++nlwiLFxuICDjg4k6IFwi776E776eXCIsXG4gIOODkDogXCLvvorvvp5cIixcbiAg44OTOiBcIu++i+++nlwiLFxuICDjg5Y6IFwi776M776eXCIsXG4gIOODmTogXCLvvo3vvp5cIixcbiAg44OcOiBcIu++ju++nlwiLFxuICDjg5E6IFwi776K776fXCIsXG4gIOODlDogXCLvvovvvp9cIixcbiAg44OXOiBcIu++jO++n1wiLFxuICDjg5o6IFwi776N776fXCIsXG4gIOODnTogXCLvvo7vvp9cIixcbiAg44O0OiBcIu+9s+++nlwiLFxuICDjg7c6IFwi776c776eXCIsXG4gIOODujogXCLvvabvvp5cIixcbiAg44KiOiBcIu+9sVwiLFxuICDjgqQ6IFwi772yXCIsXG4gIOOCpjogXCLvvbNcIixcbiAg44KoOiBcIu+9tFwiLFxuICDjgqo6IFwi7721XCIsXG4gIOOCqzogXCLvvbZcIixcbiAg44KtOiBcIu+9t1wiLFxuICDjgq86IFwi7724XCIsXG4gIOOCsTogXCLvvblcIixcbiAg44KzOiBcIu+9ulwiLFxuICDjgrU6IFwi7727XCIsXG4gIOOCtzogXCLvvbxcIixcbiAg44K5OiBcIu+9vVwiLFxuICDjgrs6IFwi772+XCIsXG4gIOOCvTogXCLvvb9cIixcbiAg44K/OiBcIu++gFwiLFxuICDjg4E6IFwi776BXCIsXG4gIOODhDogXCLvvoJcIixcbiAg44OGOiBcIu++g1wiLFxuICDjg4g6IFwi776EXCIsXG4gIOODijogXCLvvoVcIixcbiAg44OLOiBcIu++hlwiLFxuICDjg4w6IFwi776HXCIsXG4gIOODjTogXCLvvohcIixcbiAg44OOOiBcIu++iVwiLFxuICDjg486IFwi776KXCIsXG4gIOODkjogXCLvvotcIixcbiAg44OVOiBcIu++jFwiLFxuICDjg5g6IFwi776NXCIsXG4gIOODmzogXCLvvo5cIixcbiAg44OeOiBcIu++j1wiLFxuICDjg586IFwi776QXCIsXG4gIOODoDogXCLvvpFcIixcbiAg44OhOiBcIu++klwiLFxuICDjg6I6IFwi776TXCIsXG4gIOODpDogXCLvvpRcIixcbiAg44OmOiBcIu++lVwiLFxuICDjg6g6IFwi776WXCIsXG4gIOODqTogXCLvvpdcIixcbiAg44OqOiBcIu++mFwiLFxuICDjg6s6IFwi776ZXCIsXG4gIOODrDogXCLvvppcIixcbiAg44OtOiBcIu++m1wiLFxuICDjg686IFwi776cXCIsXG4gIOODsjogXCLvvaZcIixcbiAg44OzOiBcIu++nVwiLFxuICDjgqE6IFwi772nXCIsXG4gIOOCozogXCLvvahcIixcbiAg44KlOiBcIu+9qVwiLFxuICDjgqc6IFwi772qXCIsXG4gIOOCqTogXCLvvatcIixcbiAg44ODOiBcIu+9r1wiLFxuICDjg6M6IFwi772sXCIsXG4gIOODpTogXCLvva1cIixcbiAg44OnOiBcIu+9rlwiLFxuICBcIuOAglwiOiBcIu+9oVwiLFxuICBcIuOAgVwiOiBcIu+9pFwiLFxuICDjg7w6IFwi772wXCIsXG4gIFwi44CMXCI6IFwi772iXCIsXG4gIFwi44CNXCI6IFwi772jXCIsXG4gIFwi44O7XCI6IFwi772lXCIsXG4gIFwi44CAXCI6IFwiIFwiLCAvLyDlhajop5Ljgrnjg5rjg7zjgrnjgoLljYrop5Ljgrnjg5rjg7zjgrnjgavlpInmj5tcbn07XG5cbmNvbnN0IGhhbGZXaWR0aFRvRnVsbFdpZHRoTWFwOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICDvvbbvvp46IFwi44KsXCIsXG4gIO+9t+++njogXCLjgq5cIixcbiAg7724776eOiBcIuOCsFwiLFxuICDvvbnvvp46IFwi44KyXCIsXG4gIO+9uu++njogXCLjgrRcIixcbiAg7727776eOiBcIuOCtlwiLFxuICDvvbzvvp46IFwi44K4XCIsXG4gIO+9ve++njogXCLjgrpcIixcbiAg772+776eOiBcIuOCvFwiLFxuICDvvb/vvp46IFwi44K+XCIsXG4gIO++gO++njogXCLjg4BcIixcbiAg776B776eOiBcIuODglwiLFxuICDvvoLvvp46IFwi44OFXCIsXG4gIO++g+++njogXCLjg4dcIixcbiAg776E776eOiBcIuODiVwiLFxuICDvvorvvp46IFwi44OQXCIsXG4gIO++i+++njogXCLjg5NcIixcbiAg776M776eOiBcIuODllwiLFxuICDvvo3vvp46IFwi44OZXCIsXG4gIO++ju++njogXCLjg5xcIixcbiAg776K776fOiBcIuODkVwiLFxuICDvvovvvp86IFwi44OUXCIsXG4gIO++jO++nzogXCLjg5dcIixcbiAg776N776fOiBcIuODmlwiLFxuICDvvo7vvp86IFwi44OdXCIsXG4gIO+9s+++njogXCLjg7RcIixcbiAg776c776eOiBcIuODt1wiLFxuICDvvabvvp46IFwi44O6XCIsXG4gIO+9sTogXCLjgqJcIixcbiAg772yOiBcIuOCpFwiLFxuICDvvbM6IFwi44KmXCIsXG4gIO+9tDogXCLjgqhcIixcbiAg7721OiBcIuOCqlwiLFxuICDvvbY6IFwi44KrXCIsXG4gIO+9tzogXCLjgq1cIixcbiAg7724OiBcIuOCr1wiLFxuICDvvbk6IFwi44KxXCIsXG4gIO+9ujogXCLjgrNcIixcbiAg7727OiBcIuOCtVwiLFxuICDvvbw6IFwi44K3XCIsXG4gIO+9vTogXCLjgrlcIixcbiAg772+OiBcIuOCu1wiLFxuICDvvb86IFwi44K9XCIsXG4gIO++gDogXCLjgr9cIixcbiAg776BOiBcIuODgVwiLFxuICDvvoI6IFwi44OEXCIsXG4gIO++gzogXCLjg4ZcIixcbiAg776EOiBcIuODiFwiLFxuICDvvoU6IFwi44OKXCIsXG4gIO++hjogXCLjg4tcIixcbiAg776HOiBcIuODjFwiLFxuICDvvog6IFwi44ONXCIsXG4gIO++iTogXCLjg45cIixcbiAg776KOiBcIuODj1wiLFxuICDvvos6IFwi44OSXCIsXG4gIO++jDogXCLjg5VcIixcbiAg776NOiBcIuODmFwiLFxuICDvvo46IFwi44ObXCIsXG4gIO++jzogXCLjg55cIixcbiAg776QOiBcIuODn1wiLFxuICDvvpE6IFwi44OgXCIsXG4gIO++kjogXCLjg6FcIixcbiAg776TOiBcIuODolwiLFxuICDvvpQ6IFwi44OkXCIsXG4gIO++lTogXCLjg6ZcIixcbiAg776WOiBcIuODqFwiLFxuICDvvpc6IFwi44OpXCIsXG4gIO++mDogXCLjg6pcIixcbiAg776ZOiBcIuODq1wiLFxuICDvvpo6IFwi44OsXCIsXG4gIO++mzogXCLjg61cIixcbiAg776cOiBcIuODr1wiLFxuICDvvaY6IFwi44OyXCIsXG4gIO++nTogXCLjg7NcIixcbiAg772nOiBcIuOCoVwiLFxuICDvvag6IFwi44KjXCIsXG4gIO+9qTogXCLjgqVcIixcbiAg772qOiBcIuOCp1wiLFxuICDvvas6IFwi44KpXCIsXG4gIO+9rzogXCLjg4NcIixcbiAg772sOiBcIuODo1wiLFxuICDvva06IFwi44OlXCIsXG4gIO+9rjogXCLjg6dcIixcbiAgXCLvvaFcIjogXCLjgIJcIixcbiAgXCLvvaRcIjogXCLjgIFcIixcbiAg772wOiBcIuODvFwiLFxuICBcIu+9olwiOiBcIuOAjFwiLFxuICBcIu+9o1wiOiBcIuOAjVwiLFxuICBcIu+9pVwiOiBcIuODu1wiLFxuICBcIiBcIjogXCLjgIBcIixcbn07XG5cbi8qKlxuICog5YWo6KeSL+WNiuinkuWkieaPm+OCouOCr+OCt+ODp+ODs1xuICovXG5leHBvcnQgY2xhc3MgRnVsbEhhbGZDb252ZXJzaW9uQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBwcm9wczogSUNvbnZlcnNpb25Qcm9wcztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLlhajop5Iv5Y2K6KeS5aSJ5o+bXCI7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICBmaWVsZDogeyBjb2RlOiBcIlwiIH0sXG4gICAgICBjb252ZXJzaW9uOiBcIlwiLFxuICAgICAgdmVyTmFtZTogeyBuYW1lOiBcIlwiIH0sXG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gIH1cblxuICAvKipcbiAgICog44Ki44Kv44K344On44Oz44Gu5a6f6KGM44KS5ZG844Gz5Ye644GZXG4gICAqIEBwYXJhbSBhY3Rpb25Ob2RlXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgcHJvY2VzcyhcbiAgICBhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZSxcbiAgICBldmVudDogYW55LFxuICAgIGNvbnRleHQ6IElDb250ZXh0XG4gICk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICBjYW5OZXh0OiB0cnVlLFxuICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICBpZiAoXG4gICAgICAgICEoXCJmaWVsZFwiIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpICYmXG4gICAgICAgICEoXCJjb252ZXJzaW9uXCIgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiZcbiAgICAgICAgIShcInZlck5hbWVcIiBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElDb252ZXJzaW9uUHJvcHM7XG5cbiAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICBpZiAoISh0aGlzLnByb3BzLmZpZWxkLmNvZGUgaW4gcmVjb3JkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYOODleOCo+ODvOODq+ODieOAjCR7dGhpcy5wcm9wcy5maWVsZC5jb2RlfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk+OAgmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdPy52YWx1ZTtcblxuICAgICAgLy/mnaHku7bliIblspBcbiAgICAgIC8v5pyq5YWl5Yqb5pmC44Gv5L2V44KC5Yem55CG44KS44Gb44Ga57WC5LqGXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5lcnJvciA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wcm9wcy5jb252ZXJzaW9uID09PSBcIuWFqOinklwiKSB7XG4gICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXSA9IHRoaXMudG9GdWxsV2lkdGgodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucHJvcHMuY29udmVyc2lvbiA9PT0gXCLljYrop5JcIikge1xuICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV0gPSB0aGlzLnRvSGFsZldpZHRoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmVycm9yID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vcmVzdWx044OX44Ot44OR44OG44Kj5oyH5a6aXG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIGNhbk5leHQ6IHRydWUsXG4gICAgICAgIHJlc3VsdDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAvL+S+i+WkluWHpueQhlxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvciwgYWN0aW9uTm9kZSk7XG4gICAgICByZXN1bHQuY2FuTmV4dCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvLyDljYrop5LjgYvjgonlhajop5LjgavlpInmj5tcbiAgdG9GdWxsV2lkdGgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8v5Y2K6KeS44Gu6Iux5pWw5a2X44Go6KiY5Y+344KS5qSc57Si44GX44CB5Y2K6KeS44GL44KJ5YWo6KeS44Gr5aSJ5o+b77yI5Y2K6KeS44Kz44O844OJ44GrIDB4RkVFMCDjgpLotrPjgZfjgablhajop5LjgavjgZnjgovvvIlcbiAgICBsZXQgcmV0U3RyID0gc3RyLnJlcGxhY2UoL1tBLVphLXowLTkhLX5dL2csIGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzLmNoYXJDb2RlQXQoMCkgKyAweGZlZTApO1xuICAgICAgLy/ljYrop5Ljgqvjgr/jgqvjg4rjgarjganjgpLmpJzntKLjgZfjgIHlhajop5LjgavlpInmj5vjgZnjgovjgZ/jgoHjga7jg57jg4Pjg5Tjg7PjgrDjgqrjg5bjgrjjgqfjgq/jg4jvvIhoYWxmV2lkdGhUb0Z1bGxXaWR0aE1hcO+8ieOBp+WFqOinkuaWh+Wtl+OBq+WkieaPm1xuICAgIH0pO1xuICAgIHJldFN0ciA9IHJldFN0ci5yZXBsYWNlKC9bXFx1RkY2MS1cXHVGRjlGIF0vZywgZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBoYWxmV2lkdGhUb0Z1bGxXaWR0aE1hcFtzXSB8fCBzO1xuICAgIH0pO1xuICAgIHJldHVybiByZXRTdHI7XG4gIH1cblxuICB0b0hhbGZXaWR0aChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy/lhajop5Ljga7oi7HmlbDlrZfjgoToqJjlj7fjgpLmpJzntKLjgZfjgIHlhajop5LjgYvjgonljYrop5LjgavlpInmj5vjgZfjgb7jgZnvvIjlhajop5LjgrPjg7zjg4njgYvjgokgMHhGRUUwIOOCkuW8leOBhOOBpuWNiuinkuOBq+OBmeOCi++8iVxuICAgIGxldCByZXRTdHIgPSBzdHIucmVwbGFjZSgvW++8gS3vvZ5dL2csIGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzLmNoYXJDb2RlQXQoMCkgLSAweGZlZTApO1xuICAgICAgLy/lhajop5LniYfku67lkI3oqJjlj7fjgrnjg5rjg7zjgrnjgarjganjgpLmpJzntKLjgZfjgIHljYrop5LjgavlpInmj5vjgZnjgovjgZ/jgoHjga7jg57jg4Pjg5Tjg7PjgrDjgqrjg5bjgrjjgqfjgq/jg4goIGhhbGZXaWR0aFRvRnVsbFdpZHRoTWFwICnjgafljYrop5LmloflrZfjgavlpInmj5tcbiAgICB9KTtcbiAgICByZXRTdHIgPSByZXRTdHIucmVwbGFjZSgvW+OCrC3jg7TjgqEt44Oz44CC44CB44O844CM44CN44O744CAXS9nLCBmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIGZ1bGxXaWR0aFRvSGFsZldpZHRoTWFwW3NdIHx8IHM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldFN0cjtcbiAgfVxuXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xuICAgIH1cbn1cbm5ldyBGdWxsSGFsZkNvbnZlcnNpb25BY3Rpb24oKTtcbiIsImltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XHJcbmltcG9ydCB7IElGaWVsZCxJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksSUNvbnRleHQsSVZhck5hbWV9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG4vL+WPs1VJ55S76Z2icHJvcGVydHnjga5uYW1lOuWei++8mlxyXG5pbnRlcmZhY2UgSUxvZ2luVXNlckdldHRlclByb3Bze1xyXG4gICAgLy/lpInmlbDlkI3jgavjgrvjg4Pjg4jvvJrlgKTjgYzjgqrjg5bjgrjjgqfjgq/jg4jjga7lvaLlvI9cclxuICAgIHZlck5hbWU6SVZhck5hbWU7XHJcbn1cclxuLy9JQWN0aW9u44Kk44Oz44K/44OV44Kn44O844K544KS5a6f6KOF44GZ44KL5paw44GX44GE44Kv44Op44K5QWN0aW9u44KS5L2c5oiQ77yaXHJcbmV4cG9ydCBjbGFzcyBMb2dpblVzZXJHZXR0ZXJBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgLy9pbXBvcnTjgYvjgonlsI7lhaXpoZXnpLrlrprnvqlcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIC8v5LiK5pa544GuaW50ZXJmYWNlIFByb3Bz44GL44KJ44CBcHJvcHPlj5fjgZHjgovlsZ7mgKfjgpLlrprnvqnvvJpcclxuICAgIHByb3BzOklMb2dpblVzZXJHZXR0ZXJQcm9wcztcclxuICAgIC8v6Zai5pWw5a6a576p44Gr5b+F6KaB44Gq6aGe5ZCN44KS5qeL56+J77yaXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIC8vcGdBZG1pbkRC44Gr55m76Yyy44GX44Gf44Ki44Kv44K344On44Oz5ZCNKG5hbWUvc3VidGl0bGUp5LiA6Ie044GZ44KL5b+F6KaB44GM44GC44KL77yaXHJcbiAgICAgICAgdGhpcy5uYW1lPVwi44Ot44Kw44Kk44Oz44Om44O844K244O85Y+W5b6XXCI7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPlsZ7mgKfliJ3mnJ/ljJbvvJpcclxuICAgICAgICB0aGlzLnByb3BzPXtcclxuICAgICAgICAgICAgdmVyTmFtZTp7bmFtZTonJ31cclxuICAgICAgICB9XHJcbiAgICAgICAgLy/jg6rjgrvjg4Pjg4jkuIroqJjnmbvpjLLooajvvJpcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICB9XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lh6bnkIbjgpLlrp/oo4XjgZnjgotcclxuICogQHBhcmFtIGFjdGlvbk5vZGUg44Ki44Kv44K344On44Oz44OO44O844OJXHJcbiAqIEBwYXJhbSBldmVudCBLaW50b25l44Gu44Kk44OZ44Oz44OIXHJcbiAqIEBwYXJhbSBjb250ZXh0IOOCs+ODs+ODhuOCreOCueODiO+8iOODrOOCs+ODvOODieOAgeWkieaVsOaDheWgseOCkuaMgeOBo+OBpuOBhOOCi++8iVxyXG4gKiBAcmV0dXJucyBcclxuICovXHJcbuOAgOOAgC8v6Z2e5ZCM5pyf5Yem55CG44GC44KL6Zai5pWw5LiL44Gu44GC44KL5bGe5oCn77yaXHJcbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQ9e1xyXG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi++8mlxyXG4gICAgICAgICAgICB0aGlzLmFjdGlvblByb3BzPWFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcbiAgICAgICAgICAgIC8v44OX44Ot44OR44OG44Kj6Kit5a6a44Gu44OH44O844K/5Z6L44Gv5b+F6KaB44Gq5oOF5aCx5ZCr44KB44G+44GZ44GL77yf5YWo6YOo5LiN5a2Y5Zyo5pmCcmV0dXJuOlxyXG4gICAgICAgICAgICBpZiAoISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL+aXouWumuOBruODl+ODreODkeODhuOCo+OBruOCpOODs+OCv+ODleOCp+ODvOOCueOBuOWkieaPm++8mlxyXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJTG9naW5Vc2VyR2V0dGVyUHJvcHM7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSYmdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWUhPT0nJyl7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV09a2ludG9uZS5nZXRMb2dpblVzZXIoKTtcclxuICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5hbGVydChcIuWkieaVsOWQjVwiK3RoaXMucHJvcHMudmVyTmFtZS5uYW1lK1wi44Gu5YCk44GvXCIrY29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdK1wi44Gn44GZXCIpO1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQucmVjb3JkW1wi5aSJ5pWw6YGL55So5YWI44Gu44Om44O844K26YG45oqe44OV44Kj44O844Or44OJXCJdLnZhbHVlPSBbe2NvZGU6Y29udGV4dC52YXJpYWJsZXNbdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWVdLmNvZGV9XTtcclxuICAgICAgICAgICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICByZXN1bHQ9IHtcclxuICAgICAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDp0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICB9Y2F0Y2goZXJyb3I6YW55KXs7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY2FuTmV4dDpmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcclxuICAgIH1cclxufVxyXG5uZXcgTG9naW5Vc2VyR2V0dGVyQWN0aW9uKCk7IiwiLyohXG4gICogQm9vdHN0cmFwIGRhdGEuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkRhdGEgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50TWFwLnNldChlbGVtZW50LCBuZXcgTWFwKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KTtcblxuICAgICAgLy8gbWFrZSBpdCBjbGVhciB3ZSBvbmx5IHdhbnQgb25lIGluc3RhbmNlIHBlciBlbGVtZW50XG4gICAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgICAgaWYgKCFpbnN0YW5jZU1hcC5oYXMoa2V5KSAmJiBpbnN0YW5jZU1hcC5zaXplICE9PSAwKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgICB9LFxuICAgIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXQoZWxlbWVudCkuZ2V0KGtleSkgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKGVsZW1lbnQsIGtleSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSk7XG5cbiAgICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgZWxlbWVudE1hcC5kZWxldGUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBkYXRhO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGluZGV4LmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLkluZGV4ID0ge30pKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCB1dGlsL2luZGV4LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBjb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbiAgY29uc3QgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwO1xuICBjb25zdCBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJztcblxuICAvKipcbiAgICogUHJvcGVybHkgZXNjYXBlIElEcyBzZWxlY3RvcnMgdG8gaGFuZGxlIHdlaXJkIElEc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGNvbnN0IHBhcnNlU2VsZWN0b3IgPSBzZWxlY3RvciA9PiB7XG4gICAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAgIC8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgbmVlZHMgZXNjYXBpbmcgdG8gaGFuZGxlIElEcyAoaHRtbDUrKSBjb250YWluaW5nIGZvciBpbnN0YW5jZSAvXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoLyMoW15cXHNcIiMnXSspL2csIChtYXRjaCwgaWQpID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9O1xuXG4gIC8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuICBjb25zdCB0b1R5cGUgPSBvYmplY3QgPT4ge1xuICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgVXRpbCBBUElcbiAgICovXG5cbiAgY29uc3QgZ2V0VUlEID0gcHJlZml4ID0+IHtcbiAgICBkbyB7XG4gICAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gICAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSk7XG4gICAgcmV0dXJuIHByZWZpeDtcbiAgfTtcbiAgY29uc3QgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIEdldCB0cmFuc2l0aW9uLWR1cmF0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAgbGV0IHtcbiAgICAgIHRyYW5zaXRpb25EdXJhdGlvbixcbiAgICAgIHRyYW5zaXRpb25EZWxheVxuICAgIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICBjb25zdCBmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpO1xuXG4gICAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICAgIGlmICghZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gJiYgIWZsb2F0VHJhbnNpdGlvbkRlbGF5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uLnNwbGl0KCcsJylbMF07XG4gICAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gICAgcmV0dXJuIChOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KSkgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUjtcbiAgfTtcbiAgY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSk7XG4gIH07XG4gIGNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QuanF1ZXJ5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgb2JqZWN0ID0gb2JqZWN0WzBdO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdC5ub2RlVHlwZSAhPT0gJ3VuZGVmaW5lZCc7XG4gIH07XG4gIGNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAgIC8vIGl0J3MgYSBqUXVlcnkgb2JqZWN0IG9yIGEgbm9kZSBlbGVtZW50XG4gICAgaWYgKGlzRWxlbWVudChvYmplY3QpKSB7XG4gICAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgY29uc3QgaXNWaXNpYmxlID0gZWxlbWVudCA9PiB7XG4gICAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudCkgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50SXNWaXNpYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJztcbiAgICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGNvbnN0IGNsb3NlZERldGFpbHMgPSBlbGVtZW50LmNsb3Nlc3QoJ2RldGFpbHM6bm90KFtvcGVuXSknKTtcbiAgICBpZiAoIWNsb3NlZERldGFpbHMpIHtcbiAgICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICAgIH1cbiAgICBpZiAoY2xvc2VkRGV0YWlscyAhPT0gZWxlbWVudCkge1xuICAgICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgICAgaWYgKHN1bW1hcnkgJiYgc3VtbWFyeS5wYXJlbnROb2RlICE9PSBjbG9zZWREZXRhaWxzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChzdW1tYXJ5ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGU7XG4gIH07XG4gIGNvbnN0IGlzRGlzYWJsZWQgPSBlbGVtZW50ID0+IHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVsZW1lbnQuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpICE9PSAnZmFsc2UnO1xuICB9O1xuICBjb25zdCBmaW5kU2hhZG93Um9vdCA9IGVsZW1lbnQgPT4ge1xuICAgIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dGFjaFNoYWRvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ2FuIGZpbmQgdGhlIHNoYWRvdyByb290IG90aGVyd2lzZSBpdCdsbCByZXR1cm4gdGhlIGRvY3VtZW50XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGw7XG4gICAgfVxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gd2hlbiB3ZSBkb24ndCBmaW5kIGEgc2hhZG93IHJvb3RcbiAgICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaW5kU2hhZG93Um9vdChlbGVtZW50LnBhcmVudE5vZGUpO1xuICB9O1xuICBjb25zdCBub29wID0gKCkgPT4ge307XG5cbiAgLyoqXG4gICAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4gdm9pZFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cbiAgICovXG4gIGNvbnN0IHJlZmxvdyA9IGVsZW1lbnQgPT4ge1xuICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICB9O1xuICBjb25zdCBnZXRqUXVlcnkgPSAoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5qUXVlcnkgJiYgIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLWJzLW5vLWpxdWVyeScpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIGNvbnN0IERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MgPSBbXTtcbiAgY29uc3Qgb25ET01Db250ZW50TG9hZGVkID0gY2FsbGJhY2sgPT4ge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIC8vIGFkZCBsaXN0ZW5lciBvbiB0aGUgZmlyc3QgY2FsbCB3aGVuIHRoZSBkb2N1bWVudCBpcyBpbiBsb2FkaW5nIHN0YXRlXG4gICAgICBpZiAoIURPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNSVEwgPSAoKSA9PiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGlyID09PSAncnRsJztcbiAgY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgICBvbkRPTUNvbnRlbnRMb2FkZWQoKCkgPT4ge1xuICAgICAgY29uc3QgJCA9IGdldGpRdWVyeSgpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoJCkge1xuICAgICAgICBjb25zdCBuYW1lID0gcGx1Z2luLk5BTUU7XG4gICAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAgICQuZm5bbmFtZV0gPSBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgICAkLmZuW25hbWVdLkNvbnN0cnVjdG9yID0gcGx1Z2luO1xuICAgICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICAgJC5mbltuYW1lXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZXhlY3V0ZSA9IChwb3NzaWJsZUNhbGxiYWNrLCBhcmdzID0gW10sIGRlZmF1bHRWYWx1ZSA9IHBvc3NpYmxlQ2FsbGJhY2spID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHBvc3NpYmxlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBwb3NzaWJsZUNhbGxiYWNrKC4uLmFyZ3MpIDogZGVmYXVsdFZhbHVlO1xuICB9O1xuICBjb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gICAgaWYgKCF3YWl0Rm9yVHJhbnNpdGlvbikge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDU7XG4gICAgY29uc3QgZW11bGF0ZWREdXJhdGlvbiA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRyYW5zaXRpb25FbGVtZW50KSArIGR1cmF0aW9uUGFkZGluZztcbiAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgICB0YXJnZXRcbiAgICB9KSA9PiB7XG4gICAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgdHJhbnNpdGlvbkVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcik7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0sIGVtdWxhdGVkRHVyYXRpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgICAgVGhlIGxpc3Qgb2YgZWxlbWVudHNcbiAgICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAgICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICAgKiBAcGFyYW0gaXNDeWNsZUFsbG93ZWRcbiAgICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAgICovXG4gIGNvbnN0IGdldE5leHRBY3RpdmVFbGVtZW50ID0gKGxpc3QsIGFjdGl2ZUVsZW1lbnQsIHNob3VsZEdldE5leHQsIGlzQ3ljbGVBbGxvd2VkKSA9PiB7XG4gICAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIGxldCBpbmRleCA9IGxpc3QuaW5kZXhPZihhY3RpdmVFbGVtZW50KTtcblxuICAgIC8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBsaXN0IHJldHVybiBhbiBlbGVtZW50XG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gIXNob3VsZEdldE5leHQgJiYgaXNDeWNsZUFsbG93ZWQgPyBsaXN0W2xpc3RMZW5ndGggLSAxXSA6IGxpc3RbMF07XG4gICAgfVxuICAgIGluZGV4ICs9IHNob3VsZEdldE5leHQgPyAxIDogLTE7XG4gICAgaWYgKGlzQ3ljbGVBbGxvd2VkKSB7XG4gICAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3RbTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIGxpc3RMZW5ndGggLSAxKSldO1xuICB9O1xuXG4gIGV4cG9ydHMuZGVmaW5lSlF1ZXJ5UGx1Z2luID0gZGVmaW5lSlF1ZXJ5UGx1Z2luO1xuICBleHBvcnRzLmV4ZWN1dGUgPSBleGVjdXRlO1xuICBleHBvcnRzLmV4ZWN1dGVBZnRlclRyYW5zaXRpb24gPSBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uO1xuICBleHBvcnRzLmZpbmRTaGFkb3dSb290ID0gZmluZFNoYWRvd1Jvb3Q7XG4gIGV4cG9ydHMuZ2V0RWxlbWVudCA9IGdldEVsZW1lbnQ7XG4gIGV4cG9ydHMuZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSBnZXROZXh0QWN0aXZlRWxlbWVudDtcbiAgZXhwb3J0cy5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCA9IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50O1xuICBleHBvcnRzLmdldFVJRCA9IGdldFVJRDtcbiAgZXhwb3J0cy5nZXRqUXVlcnkgPSBnZXRqUXVlcnk7XG4gIGV4cG9ydHMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIGV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuICBleHBvcnRzLmlzUlRMID0gaXNSVEw7XG4gIGV4cG9ydHMuaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xuICBleHBvcnRzLm5vb3AgPSBub29wO1xuICBleHBvcnRzLm9uRE9NQ29udGVudExvYWRlZCA9IG9uRE9NQ29udGVudExvYWRlZDtcbiAgZXhwb3J0cy5wYXJzZVNlbGVjdG9yID0gcGFyc2VTZWxlY3RvcjtcbiAgZXhwb3J0cy5yZWZsb3cgPSByZWZsb3c7XG4gIGV4cG9ydHMudG9UeXBlID0gdG9UeXBlO1xuICBleHBvcnRzLnRyaWdnZXJUcmFuc2l0aW9uRW5kID0gdHJpZ2dlclRyYW5zaXRpb25FbmQ7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGV2ZW50LWhhbmRsZXIuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vdXRpbC9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5FdmVudEhhbmRsZXIgPSBmYWN0b3J5KGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IG5hbWVzcGFjZVJlZ2V4ID0gL1teLl0qKD89XFwuLiopXFwufC4qLztcbiAgY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovO1xuICBjb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvO1xuICBjb25zdCBldmVudFJlZ2lzdHJ5ID0ge307IC8vIEV2ZW50cyBzdG9yYWdlXG4gIGxldCB1aWRFdmVudCA9IDE7XG4gIGNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG4gIH07XG4gIGNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoWydjbGljaycsICdkYmxjbGljaycsICdtb3VzZXVwJywgJ21vdXNlZG93bicsICdjb250ZXh0bWVudScsICdtb3VzZXdoZWVsJywgJ0RPTU1vdXNlU2Nyb2xsJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnLCAnc2VsZWN0c3RhcnQnLCAnc2VsZWN0ZW5kJywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnb3JpZW50YXRpb25jaGFuZ2UnLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnLCAndG91Y2hjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJywgJ3BvaW50ZXJsZWF2ZScsICdwb2ludGVyY2FuY2VsJywgJ2dlc3R1cmVzdGFydCcsICdnZXN0dXJlY2hhbmdlJywgJ2dlc3R1cmVlbmQnLCAnZm9jdXMnLCAnYmx1cicsICdjaGFuZ2UnLCAncmVzZXQnLCAnc2VsZWN0JywgJ3N1Ym1pdCcsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2xvYWQnLCAndW5sb2FkJywgJ2JlZm9yZXVubG9hZCcsICdyZXNpemUnLCAnbW92ZScsICdET01Db250ZW50TG9hZGVkJywgJ3JlYWR5c3RhdGVjaGFuZ2UnLCAnZXJyb3InLCAnYWJvcnQnLCAnc2Nyb2xsJ10pO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZHNcbiAgICovXG5cbiAgZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICAgIHJldHVybiB1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWAgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrO1xuICB9XG4gIGZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KTtcbiAgICBlbGVtZW50LnVpZEV2ZW50ID0gdWlkO1xuICAgIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fTtcbiAgICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdO1xuICB9XG4gIGZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgaHlkcmF0ZU9iaihldmVudCwge1xuICAgICAgICBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgW2V2ZW50XSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBzZWxlY3RvciwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgZm9yIChsZXQge1xuICAgICAgICB0YXJnZXRcbiAgICAgIH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgICAgICAgIGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgY2FsbGFibGUsIGRlbGVnYXRpb25TZWxlY3RvciA9IG51bGwpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJztcbiAgICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgICBjb25zdCBjYWxsYWJsZSA9IGlzRGVsZWdhdGVkID8gZGVsZWdhdGlvbkZ1bmN0aW9uIDogaGFuZGxlciB8fCBkZWxlZ2F0aW9uRnVuY3Rpb247XG4gICAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudCk7XG4gICAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICAgIHR5cGVFdmVudCA9IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgIH1cbiAgICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcblxuICAgIC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cbiAgICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgICBjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKTtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KTtcbiAgICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKTtcbiAgICBpZiAocHJldmlvdXNGdW5jdGlvbikge1xuICAgICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKTtcbiAgICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID8gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDogYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSk7XG4gICAgZm4uZGVsZWdhdGlvblNlbGVjdG9yID0gaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbDtcbiAgICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlO1xuICAgIGZuLm9uZU9mZiA9IG9uZU9mZjtcbiAgICBmbi51aWRFdmVudCA9IHVpZDtcbiAgICBoYW5kbGVyc1t1aWRdID0gZm47XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIEJvb2xlYW4oZGVsZWdhdGlvblNlbGVjdG9yKSk7XG4gICAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgaWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gICAgLy8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxuICAgIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpO1xuICAgIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50O1xuICB9XG4gIGNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKTtcbiAgICB9LFxuICAgIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpO1xuICAgIH0sXG4gICAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKTtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFNpbXBsZXN0IGNhc2U6IGhhbmRsZXIgaXMgcGFzc2VkLCByZW1vdmUgdGhhdCBsaXN0ZW5lciBPTkxZLlxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICAgIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJyk7XG4gICAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCAkID0gaW5kZXhfanMuZ2V0alF1ZXJ5KCk7XG4gICAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50O1xuICAgICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbDtcbiAgICAgIGxldCBidWJibGVzID0gdHJ1ZTtcbiAgICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWU7XG4gICAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGluTmFtZXNwYWNlICYmICQpIHtcbiAgICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKTtcbiAgICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KTtcbiAgICAgICAgYnViYmxlcyA9ICFqUXVlcnlFdmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwge1xuICAgICAgICBidWJibGVzLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KSwgYXJncyk7XG4gICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gY2F0Y2ggKF91bnVzZWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnQtaGFuZGxlci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBtYW5pcHVsYXRvci5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTWFuaXB1bGF0b3IgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL21hbmlwdWxhdG9yLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICAgIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgY2hyID0+IGAtJHtjaHIudG9Mb3dlckNhc2UoKX1gKTtcbiAgfVxuICBjb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKTtcbiAgICB9LFxuICAgIHJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKTtcbiAgICB9LFxuICAgIGdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJzS2V5cykge1xuICAgICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJyk7XG4gICAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxLCBwdXJlS2V5Lmxlbmd0aCk7XG4gICAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH0sXG4gICAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVEYXRhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIE1hbmlwdWxhdG9yO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYW5pcHVsYXRvci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBjb25maWcuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi9kb20vbWFuaXB1bGF0b3IuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9tYW5pcHVsYXRvcicsICcuL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkNvbmZpZyA9IGZhY3RvcnkoZ2xvYmFsLk1hbmlwdWxhdG9yLCBnbG9iYWwuSW5kZXgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoTWFuaXB1bGF0b3IsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvY29uZmlnLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIENvbmZpZyB7XG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKTtcbiAgICB9XG4gICAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZyk7XG4gICAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgZWxlbWVudCkge1xuICAgICAgY29uc3QganNvbkNvbmZpZyA9IGluZGV4X2pzLmlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge307IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQsXG4gICAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgICAuLi4oaW5kZXhfanMuaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IHt9KVxuICAgICAgfTtcbiAgICB9XG4gICAgX3R5cGVDaGVja0NvbmZpZyhjb25maWcsIGNvbmZpZ1R5cGVzID0gdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSkge1xuICAgICAgZm9yIChjb25zdCBbcHJvcGVydHksIGV4cGVjdGVkVHlwZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZ1R5cGVzKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGluZGV4X2pzLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiBpbmRleF9qcy50b1R5cGUodmFsdWUpO1xuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoZXhwZWN0ZWRUeXBlcykudGVzdCh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIENvbmZpZztcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZmlnLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi9kb20vZGF0YS5qcycpLCByZXF1aXJlKCcuL2RvbS9ldmVudC1oYW5kbGVyLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9jb25maWcuanMnKSwgcmVxdWlyZSgnLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi9kb20vZGF0YScsICcuL2RvbS9ldmVudC1oYW5kbGVyJywgJy4vdXRpbC9jb25maWcnLCAnLi91dGlsL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkJhc2VDb21wb25lbnQgPSBmYWN0b3J5KGdsb2JhbC5EYXRhLCBnbG9iYWwuRXZlbnRIYW5kbGVyLCBnbG9iYWwuQ29uZmlnLCBnbG9iYWwuSW5kZXgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoRGF0YSwgRXZlbnRIYW5kbGVyLCBDb25maWcsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIGJhc2UtY29tcG9uZW50LmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgVkVSU0lPTiA9ICc1LjMuMyc7XG5cbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgY2xhc3MgQmFzZUNvbXBvbmVudCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgZWxlbWVudCA9IGluZGV4X2pzLmdldEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIERhdGEuc2V0KHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFB1YmxpY1xuICAgIGRpc3Bvc2UoKSB7XG4gICAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcbiAgICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgX3F1ZXVlQ2FsbGJhY2soY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQgPSB0cnVlKSB7XG4gICAgICBpbmRleF9qcy5leGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgICB9XG4gICAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudCk7XG4gICAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgLy8gU3RhdGljXG4gICAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBEYXRhLmdldChpbmRleF9qcy5nZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKTtcbiAgICB9XG4gICAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlKGVsZW1lbnQpIHx8IG5ldyB0aGlzKGVsZW1lbnQsIHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDogbnVsbCk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICAgIHJldHVybiBgLiR7dGhpcy5EQVRBX0tFWX1gO1xuICAgIH1cbiAgICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICAgIHJldHVybiBgJHtuYW1lfSR7dGhpcy5FVkVOVF9LRVl9YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQmFzZUNvbXBvbmVudDtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS1jb21wb25lbnQuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgc2VsZWN0b3ItZW5naW5lLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vdXRpbC9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL3V0aWwvaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuU2VsZWN0b3JFbmdpbmUgPSBmYWN0b3J5KGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBkb20vc2VsZWN0b3ItZW5naW5lLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBjb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICAgIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpO1xuICAgIGlmICghc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICcjJykge1xuICAgICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgICAgLy8gc28gZXZlcnl0aGluZyBzdGFydGluZyB3aXRoIGAjYCBvciBgLmAuIElmIGEgXCJyZWFsXCIgVVJMIGlzIHVzZWQgYXMgdGhlIHNlbGVjdG9yLFxuICAgICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICAgIGlmICghaHJlZkF0dHJpYnV0ZSB8fCAhaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gSnVzdCBpbiBjYXNlIHNvbWUgQ01TIHB1dHMgb3V0IGEgZnVsbCBVUkwgd2l0aCB0aGUgYW5jaG9yIGFwcGVuZGVkXG4gICAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gO1xuICAgICAgfVxuICAgICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yID8gc2VsZWN0b3Iuc3BsaXQoJywnKS5tYXAoc2VsID0+IGluZGV4X2pzLnBhcnNlU2VsZWN0b3Ioc2VsKSkuam9pbignLCcpIDogbnVsbDtcbiAgfTtcbiAgY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gICAgZmluZChzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTtcbiAgICB9LFxuICAgIGZpbmRPbmUoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIH0sXG4gICAgY2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKTtcbiAgICB9LFxuICAgIHBhcmVudHMoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpO1xuICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9LFxuICAgIHByZXYoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgICBpZiAocHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gW3ByZXZpb3VzXTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91cyA9IHByZXZpb3VzLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICAgIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgIGxldCBuZXh0ID0gZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICBpZiAobmV4dC5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBbbmV4dF07XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgZm9jdXNhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgICAgY29uc3QgZm9jdXNhYmxlcyA9IFsnYScsICdidXR0b24nLCAnaW5wdXQnLCAndGV4dGFyZWEnLCAnc2VsZWN0JywgJ2RldGFpbHMnLCAnW3RhYmluZGV4XScsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSddLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKTtcbiAgICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpbmRleF9qcy5pc0Rpc2FibGVkKGVsKSAmJiBpbmRleF9qcy5pc1Zpc2libGUoZWwpKTtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbDtcbiAgICB9LFxuICAgIGdldE11bHRpcGxlRWxlbWVudHNGcm9tU2VsZWN0b3IoZWxlbWVudCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpIDogW107XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTZWxlY3RvckVuZ2luZTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0b3ItZW5naW5lLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGJhY2tkcm9wLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL2V2ZW50LWhhbmRsZXIuanMnKSwgcmVxdWlyZSgnLi9jb25maWcuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9ldmVudC1oYW5kbGVyJywgJy4vY29uZmlnJywgJy4vaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuQmFja2Ryb3AgPSBmYWN0b3J5KGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5Db25maWcsIGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChFdmVudEhhbmRsZXIsIENvbmZpZywgaW5kZXhfanMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9iYWNrZHJvcC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IE5BTUUgPSAnYmFja2Ryb3AnO1xuICBjb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG4gIGNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93JztcbiAgY29uc3QgRVZFTlRfTU9VU0VET1dOID0gYG1vdXNlZG93bi5icy4ke05BTUV9YDtcbiAgY29uc3QgRGVmYXVsdCA9IHtcbiAgICBjbGFzc05hbWU6ICdtb2RhbC1iYWNrZHJvcCcsXG4gICAgY2xpY2tDYWxsYmFjazogbnVsbCxcbiAgICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgY2xhc3NOYW1lOiAnc3RyaW5nJyxcbiAgICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gICAgaXNWaXNpYmxlOiAnYm9vbGVhbicsXG4gICAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEJhY2tkcm9wIGV4dGVuZHMgQ29uZmlnIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIEdldHRlcnNcbiAgICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgICAgcmV0dXJuIE5BTUU7XG4gICAgfVxuXG4gICAgLy8gUHVibGljXG4gICAgc2hvdyhjYWxsYmFjaykge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBlbmQoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KCk7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgaW5kZXhfanMucmVmbG93KGVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyk7XG4gICAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgICAgaW5kZXhfanMuZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaGlkZShjYWxsYmFjaykge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9nZXRFbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICBpbmRleF9qcy5leGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9nZXRFbGVtZW50KCkge1xuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJhY2tkcm9wLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWU7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gYmFja2Ryb3A7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgICB9XG4gICAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICAgIGNvbmZpZy5yb290RWxlbWVudCA9IGluZGV4X2pzLmdldEVsZW1lbnQoY29uZmlnLnJvb3RFbGVtZW50KTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIF9hcHBlbmQoKSB7XG4gICAgICBpZiAodGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCBFVkVOVF9NT1VTRURPV04sICgpID0+IHtcbiAgICAgICAgaW5kZXhfanMuZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2lzQXBwZW5kZWQgPSB0cnVlO1xuICAgIH1cbiAgICBfZW11bGF0ZUFuaW1hdGlvbihjYWxsYmFjaykge1xuICAgICAgaW5kZXhfanMuZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgdGhpcy5fZ2V0RWxlbWVudCgpLCB0aGlzLl9jb25maWcuaXNBbmltYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEJhY2tkcm9wO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYWNrZHJvcC5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBjb21wb25lbnQtZnVuY3Rpb25zLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJy4uL2RvbS9ldmVudC1oYW5kbGVyLmpzJyksIHJlcXVpcmUoJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnLi4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuQ29tcG9uZW50RnVuY3Rpb25zID0ge30sIGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsIEV2ZW50SGFuZGxlciwgU2VsZWN0b3JFbmdpbmUsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YDtcbiAgICBjb25zdCBuYW1lID0gY29tcG9uZW50Lk5BTUU7XG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleF9qcy5pc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcykgfHwgdGhpcy5jbG9zZXN0KGAuJHtuYW1lfWApO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuXG4gICAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgICAgaW5zdGFuY2VbbWV0aG9kXSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIGV4cG9ydHMuZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSBlbmFibGVEaXNtaXNzVHJpZ2dlcjtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcG9uZW50LWZ1bmN0aW9ucy5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBmb2N1c3RyYXAuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJyksIHJlcXVpcmUoJy4vY29uZmlnLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL2NvbmZpZyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Gb2N1c3RyYXAgPSBmYWN0b3J5KGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkNvbmZpZykpO1xufSkodGhpcywgKGZ1bmN0aW9uIChFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBDb25maWcpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9mb2N1c3RyYXAuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ2ZvY3VzdHJhcCc7XG4gIGNvbnN0IERBVEFfS0VZID0gJ2JzLmZvY3VzdHJhcCc7XG4gIGNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gO1xuICBjb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9LRVlET1dOX1RBQiA9IGBrZXlkb3duLnRhYiR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IFRBQl9LRVkgPSAnVGFiJztcbiAgY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnO1xuICBjb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJztcbiAgY29uc3QgRGVmYXVsdCA9IHtcbiAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2ZcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgYXV0b2ZvY3VzOiAnYm9vbGVhbicsXG4gICAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEZvY3VzVHJhcCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgICByZXR1cm4gTkFNRTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBhY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSk7IC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpO1xuICAgIH1cblxuICAgIC8vIFByaXZhdGVcbiAgICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB0cmFwRWxlbWVudFxuICAgICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZvY3VzYWJsZUNoaWxkcmVuKHRyYXBFbGVtZW50KTtcbiAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9PT0gVEFCX05BVl9CQUNLV0FSRCkge1xuICAgICAgICBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IFRBQl9LRVkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRm9jdXNUcmFwO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1c3RyYXAuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgc2Nyb2xsYmFyLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL21hbmlwdWxhdG9yLmpzJyksIHJlcXVpcmUoJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9tYW5pcHVsYXRvcicsICcuLi9kb20vc2VsZWN0b3ItZW5naW5lJywgJy4vaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuU2Nyb2xsYmFyID0gZmFjdG9yeShnbG9iYWwuTWFuaXB1bGF0b3IsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKE1hbmlwdWxhdG9yLCBTZWxlY3RvckVuZ2luZSwgaW5kZXhfanMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuICBjb25zdCBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCc7XG4gIGNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCc7XG4gIGNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIFNjcm9sbEJhckhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBnZXRXaWR0aCgpIHtcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvaW5uZXJXaWR0aCN1c2FnZV9ub3Rlc1xuICAgICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpO1xuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICB0aGlzLl9kaXNhYmxlT3ZlckZsb3coKTtcbiAgICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgICAvLyB0cmljazogV2UgYWRqdXN0IHBvc2l0aXZlIHBhZGRpbmdSaWdodCBhbmQgbmVnYXRpdmUgbWFyZ2luUmlnaHQgdG8gc3RpY2t5LXRvcCBlbGVtZW50cyB0byBrZWVwIHNob3dpbmcgZnVsbHdpZHRoXG4gICAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HKTtcbiAgICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pO1xuICAgIH1cbiAgICBpc092ZXJmbG93aW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDA7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG4gICAgX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKTtcbiAgICB9XG4gICAgX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpIHtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSwgYWN0dWFsVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSkge1xuICAgICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgYG51bGxgOyB0aGUgdmFsdWUgY2FuIGFsc28gYmUgemVyb1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjayk7XG4gICAgfVxuICAgIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgICAgaWYgKGluZGV4X2pzLmlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgICAgY2FsbEJhY2soc2VsZWN0b3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNlbCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgICBjYWxsQmFjayhzZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTY3JvbGxCYXJIZWxwZXI7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjcm9sbGJhci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBtb2RhbC5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJy4vYmFzZS1jb21wb25lbnQuanMnKSwgcmVxdWlyZSgnLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi91dGlsL2JhY2tkcm9wLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9mb2N1c3RyYXAuanMnKSwgcmVxdWlyZSgnLi91dGlsL2luZGV4LmpzJyksIHJlcXVpcmUoJy4vdXRpbC9zY3JvbGxiYXIuanMnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuL2Jhc2UtY29tcG9uZW50JywgJy4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi9kb20vc2VsZWN0b3ItZW5naW5lJywgJy4vdXRpbC9iYWNrZHJvcCcsICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucycsICcuL3V0aWwvZm9jdXN0cmFwJywgJy4vdXRpbC9pbmRleCcsICcuL3V0aWwvc2Nyb2xsYmFyJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLk1vZGFsID0gZmFjdG9yeShnbG9iYWwuQmFzZUNvbXBvbmVudCwgZ2xvYmFsLkV2ZW50SGFuZGxlciwgZ2xvYmFsLlNlbGVjdG9yRW5naW5lLCBnbG9iYWwuQmFja2Ryb3AsIGdsb2JhbC5Db21wb25lbnRGdW5jdGlvbnMsIGdsb2JhbC5Gb2N1c3RyYXAsIGdsb2JhbC5JbmRleCwgZ2xvYmFsLlNjcm9sbGJhcikpO1xufSkodGhpcywgKGZ1bmN0aW9uIChCYXNlQ29tcG9uZW50LCBFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBCYWNrZHJvcCwgY29tcG9uZW50RnVuY3Rpb25zX2pzLCBGb2N1c1RyYXAsIGluZGV4X2pzLCBTY3JvbGxCYXJIZWxwZXIpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgbW9kYWwuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ21vZGFsJztcbiAgY29uc3QgREFUQV9LRVkgPSAnYnMubW9kYWwnO1xuICBjb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbiAgY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSc7XG4gIGNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJztcbiAgY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfSElERV9QUkVWRU5URUQgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX1JFU0laRSA9IGByZXNpemUke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9DTElDS19ESVNNSVNTID0gYGNsaWNrLmRpc21pc3Mke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9NT1VTRURPV05fRElTTUlTUyA9IGBtb3VzZWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWA7XG4gIGNvbnN0IENMQVNTX05BTUVfT1BFTiA9ICdtb2RhbC1vcGVuJztcbiAgY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnO1xuICBjb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG4gIGNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYyc7XG4gIGNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm1vZGFsLnNob3cnO1xuICBjb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZyc7XG4gIGNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknO1xuICBjb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSc7XG4gIGNvbnN0IERlZmF1bHQgPSB7XG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAgZm9jdXM6IHRydWUsXG4gICAga2V5Ym9hcmQ6IHRydWVcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgICBmb2N1czogJ2Jvb2xlYW4nLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbidcbiAgfTtcblxuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICBjbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICAgIHRoaXMuX2RpYWxvZyA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfRElBTE9HLCB0aGlzLl9lbGVtZW50KTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKCk7XG4gICAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKCk7XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3Njcm9sbEJhciA9IG5ldyBTY3JvbGxCYXJIZWxwZXIoKTtcbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgICByZXR1cm4gTkFNRTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICB9XG4gICAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVywge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9zY3JvbGxCYXIuaGlkZSgpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKCkgPT4gdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkpO1xuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9oaWRlTW9kYWwoKSwgdGhpcy5fZWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYod2luZG93LCBFVkVOVF9LRVkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9kaWFsb2csIEVWRU5UX0tFWSk7XG4gICAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICB9XG5cbiAgICAvLyBQcml2YXRlXG4gICAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSxcbiAgICAgICAgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlLFxuICAgICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgLy8gdHJ5IHRvIGFwcGVuZCBkeW5hbWljIG1vZGFsXG4gICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZyk7XG4gICAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICAgIG1vZGFsQm9keS5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuICAgICAgaW5kZXhfanMucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gICAgfVxuICAgIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgIH0pO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9pc1Nob3duICYmICF0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgICAgLy8gYSBiYWQgdHJpY2sgdG8gc2VncmVnYXRlIGNsaWNrcyB0aGF0IG1heSBzdGFydCBpbnNpZGUgZGlhbG9nIGJ1dCBlbmQgb3V0c2lkZSwgYW5kIGF2b2lkIGxpc3RlbiB0byBzY3JvbGxiYXIgY2xpY2tzXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xJQ0tfRElTTUlTUywgZXZlbnQyID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfaGlkZU1vZGFsKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fYmFja2Ryb3AuaGlkZSgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX09QRU4pO1xuICAgICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKCk7XG4gICAgICAgIHRoaXMuX3Njcm9sbEJhci5yZXNldCgpO1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIF9pc0FuaW1hdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSk7XG4gICAgfVxuICAgIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpO1xuICAgICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IGluaXRpYWxPdmVyZmxvd1kgPSB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WTtcbiAgICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgICAgaWYgKGluaXRpYWxPdmVyZmxvd1kgPT09ICdoaWRkZW4nIHx8IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU1RBVElDKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU1RBVElDKTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgICAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGluaXRpYWxPdmVyZmxvd1k7XG4gICAgICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgICB9LCB0aGlzLl9kaWFsb2cpO1xuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXG4gICAgICovXG5cbiAgICBfYWRqdXN0RGlhbG9nKCkge1xuICAgICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKTtcbiAgICAgIGNvbnN0IGlzQm9keU92ZXJmbG93aW5nID0gc2Nyb2xsYmFyV2lkdGggPiAwO1xuICAgICAgaWYgKGlzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBpbmRleF9qcy5pc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YDtcbiAgICAgIH1cbiAgICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gaW5kZXhfanMuaXNSVEwoKSA/ICdwYWRkaW5nUmlnaHQnIDogJ3BhZGRpbmdMZWZ0JztcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIF9yZXNldEFkanVzdG1lbnRzKCkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBTdGF0aWNcbiAgICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZywgcmVsYXRlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXShyZWxhdGVkVGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICAgKi9cblxuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKTtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfU0hPVywgc2hvd0V2ZW50ID0+IHtcbiAgICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4sICgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4X2pzLmlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIG1vZGFsIHRvZ2dsZXIgd2hpbGUgYW5vdGhlciBvbmUgaXMgb3BlblxuICAgIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SKTtcbiAgICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICAgIE1vZGFsLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gICAgZGF0YS50b2dnbGUodGhpcyk7XG4gIH0pO1xuICBjb21wb25lbnRGdW5jdGlvbnNfanMuZW5hYmxlRGlzbWlzc1RyaWdnZXIoTW9kYWwpO1xuXG4gIC8qKlxuICAgKiBqUXVlcnlcbiAgICovXG5cbiAgaW5kZXhfanMuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKTtcblxuICByZXR1cm4gTW9kYWw7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZGFsLmpzLm1hcFxuIiwiZXhwb3J0IHZhciB0b3AgPSAndG9wJztcbmV4cG9ydCB2YXIgYm90dG9tID0gJ2JvdHRvbSc7XG5leHBvcnQgdmFyIHJpZ2h0ID0gJ3JpZ2h0JztcbmV4cG9ydCB2YXIgbGVmdCA9ICdsZWZ0JztcbmV4cG9ydCB2YXIgYXV0byA9ICdhdXRvJztcbmV4cG9ydCB2YXIgYmFzZVBsYWNlbWVudHMgPSBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbmV4cG9ydCB2YXIgc3RhcnQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBlbmQgPSAnZW5kJztcbmV4cG9ydCB2YXIgY2xpcHBpbmdQYXJlbnRzID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgdmFyIHZpZXdwb3J0ID0gJ3ZpZXdwb3J0JztcbmV4cG9ydCB2YXIgcG9wcGVyID0gJ3BvcHBlcic7XG5leHBvcnQgdmFyIHJlZmVyZW5jZSA9ICdyZWZlcmVuY2UnO1xuZXhwb3J0IHZhciB2YXJpYXRpb25QbGFjZW1lbnRzID0gLyojX19QVVJFX18qL2Jhc2VQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7XG5leHBvcnQgdmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxuZXhwb3J0IHZhciBiZWZvcmVSZWFkID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IHZhciByZWFkID0gJ3JlYWQnO1xuZXhwb3J0IHZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxuZXhwb3J0IHZhciBiZWZvcmVNYWluID0gJ2JlZm9yZU1haW4nO1xuZXhwb3J0IHZhciBtYWluID0gJ21haW4nO1xuZXhwb3J0IHZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG5leHBvcnQgdmFyIGJlZm9yZVdyaXRlID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCB2YXIgd3JpdGUgPSAnd3JpdGUnO1xuZXhwb3J0IHZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IHZhciBtb2RpZmllclBoYXNlcyA9IFtiZWZvcmVSZWFkLCByZWFkLCBhZnRlclJlYWQsIGJlZm9yZU1haW4sIG1haW4sIGFmdGVyTWFpbiwgYmVmb3JlV3JpdGUsIHdyaXRlLCBhZnRlcldyaXRlXTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIGlmIChub2RlID09IG51bGwpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgaWYgKG5vZGUudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgV2luZG93XScpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KG5vZGUpIHtcbiAgdmFyIE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuSFRNTEVsZW1lbnQ7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIElFIDExIGhhcyBubyBTaGFkb3dSb290XG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5TaGFkb3dSb290O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q7XG59XG5cbmV4cG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH07IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsImltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn0iLCJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMgJiYgQXJyYXkuaXNBcnJheSh1YURhdGEuYnJhbmRzKSkge1xuICAgIHJldHVybiB1YURhdGEuYnJhbmRzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0uYnJhbmQgKyBcIi9cIiArIGl0ZW0udmVyc2lvbjtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cblxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn0iLCJpbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgcmV0dXJuICEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xufSIsImltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlLCBpc0ZpeGVkU3RyYXRlZ3kpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNGaXhlZFN0cmF0ZWd5ID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkU3RyYXRlZ3kgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgdmFyIF9yZWYgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBnZXRXaW5kb3coZWxlbWVudCkgOiB3aW5kb3csXG4gICAgICB2aXN1YWxWaWV3cG9ydCA9IF9yZWYudmlzdWFsVmlld3BvcnQ7XG5cbiAgdmFyIGFkZFZpc3VhbE9mZnNldHMgPSAhaXNMYXlvdXRWaWV3cG9ydCgpICYmIGlzRml4ZWRTdHJhdGVneTtcbiAgdmFyIHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0IDogMCkpIC8gc2NhbGVYO1xuICB2YXIgeSA9IChjbGllbnRSZWN0LnRvcCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wIDogMCkpIC8gc2NhbGVZO1xuICB2YXIgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoIC8gc2NhbGVYO1xuICB2YXIgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZVk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICBsZWZ0OiB4LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCwgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gXCIuL2lzVGFibGVFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgZ2V0VUFTdHJpbmcgZnJvbSBcIi4uL3V0aWxzL3VzZXJBZ2VudC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwiaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXRGcmVzaFNpZGVPYmplY3QoKSwgcGFkZGluZ09iamVjdCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddXG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdW5zZXRTaWRlcyA9IHtcbiAgdG9wOiAnYXV0bycsXG4gIHJpZ2h0OiAnYXV0bycsXG4gIGJvdHRvbTogJ2F1dG8nLFxuICBsZWZ0OiAnYXV0bydcbn07IC8vIFJvdW5kIHRoZSBvZmZzZXRzIHRvIHRoZSBuZWFyZXN0IHN1aXRhYmxlIHN1YnBpeGVsIGJhc2VkIG9uIHRoZSBEUFIuXG4vLyBab29taW5nIGNhbiBjaGFuZ2UgdGhlIERQUiwgYnV0IGl0IHNlZW1zIHRvIHJlcG9ydCBhIHZhbHVlIHRoYXQgd2lsbFxuLy8gY2xlYW5seSBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWJwaXhlbHMuXG5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKF9yZWYsIHdpbikge1xuICB2YXIgeCA9IF9yZWYueCxcbiAgICAgIHkgPSBfcmVmLnk7XG4gIHZhciBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICByZXR1cm4ge1xuICAgIHg6IHJvdW5kKHggKiBkcHIpIC8gZHByIHx8IDAsXG4gICAgeTogcm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoX3JlZjIpIHtcbiAgdmFyIF9PYmplY3QkYXNzaWduMjtcblxuICB2YXIgcG9wcGVyID0gX3JlZjIucG9wcGVyLFxuICAgICAgcG9wcGVyUmVjdCA9IF9yZWYyLnBvcHBlclJlY3QsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmMi5wbGFjZW1lbnQsXG4gICAgICB2YXJpYXRpb24gPSBfcmVmMi52YXJpYXRpb24sXG4gICAgICBvZmZzZXRzID0gX3JlZjIub2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uID0gX3JlZjIucG9zaXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfcmVmMi5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBhZGFwdGl2ZSA9IF9yZWYyLmFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzID0gX3JlZjIucm91bmRPZmZzZXRzLFxuICAgICAgaXNGaXhlZCA9IF9yZWYyLmlzRml4ZWQ7XG4gIHZhciBfb2Zmc2V0cyR4ID0gb2Zmc2V0cy54LFxuICAgICAgeCA9IF9vZmZzZXRzJHggPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR4LFxuICAgICAgX29mZnNldHMkeSA9IG9mZnNldHMueSxcbiAgICAgIHkgPSBfb2Zmc2V0cyR5ID09PSB2b2lkIDAgPyAwIDogX29mZnNldHMkeTtcblxuICB2YXIgX3JlZjMgPSB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nID8gcm91bmRPZmZzZXRzKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWYzLng7XG4gIHkgPSBfcmVmMy55O1xuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgdmFyIGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICB2YXIgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycgJiYgcG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FzdF06IGZvcmNlIHR5cGUgcmVmaW5lbWVudCwgd2UgY29tcGFyZSBvZmZzZXRQYXJlbnQgd2l0aCB3aW5kb3cgYWJvdmUsIGJ1dCBGbG93IGRvZXNuJ3QgZGV0ZWN0IGl0XG5cblxuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCB8fCAocGxhY2VtZW50ID09PSBsZWZ0IHx8IHBsYWNlbWVudCA9PT0gcmlnaHQpICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWSA9IGJvdHRvbTtcbiAgICAgIHZhciBvZmZzZXRZID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICBvZmZzZXRQYXJlbnRbaGVpZ2h0UHJvcF07XG4gICAgICB5IC09IG9mZnNldFkgLSBwb3BwZXJSZWN0LmhlaWdodDtcbiAgICAgIHkgKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cblxuICAgIGlmIChwbGFjZW1lbnQgPT09IGxlZnQgfHwgKHBsYWNlbWVudCA9PT0gdG9wIHx8IHBsYWNlbWVudCA9PT0gYm90dG9tKSAmJiB2YXJpYXRpb24gPT09IGVuZCkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIHZhciBvZmZzZXRYID0gaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnQgPyB3aW4udmlzdWFsVmlld3BvcnQud2lkdGggOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFt3aWR0aFByb3BdO1xuICAgICAgeCAtPSBvZmZzZXRYIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfSwgYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyk7XG5cbiAgdmFyIF9yZWY0ID0gcm91bmRPZmZzZXRzID09PSB0cnVlID8gcm91bmRPZmZzZXRzQnlEUFIoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9LCBnZXRXaW5kb3cocG9wcGVyKSkgOiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG5cbiAgeCA9IF9yZWY0Lng7XG4gIHkgPSBfcmVmNC55O1xuXG4gIGlmIChncHVBY2NlbGVyYXRpb24pIHtcbiAgICB2YXIgX09iamVjdCRhc3NpZ247XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY1KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY1LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY1Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uLFxuICAgIGlzRml4ZWQ6IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCdcbiAgfTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciwgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsXG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGFkYXB0aXZlOiBhZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMuYXJyb3csIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHBhc3NpdmUgPSB7XG4gIHBhc3NpdmU6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkc2Nyb2xsID0gb3B0aW9ucy5zY3JvbGwsXG4gICAgICBzY3JvbGwgPSBfb3B0aW9ucyRzY3JvbGwgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRzY3JvbGwsXG4gICAgICBfb3B0aW9ucyRyZXNpemUgPSBvcHRpb25zLnJlc2l6ZSxcbiAgICAgIHJlc2l6ZSA9IF9vcHRpb25zJHJlc2l6ZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJlc2l6ZTtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIpO1xuICB2YXIgc2Nyb2xsUGFyZW50cyA9IFtdLmNvbmNhdChzdGF0ZS5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSwgc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO1xuXG4gIGlmIChzY3JvbGwpIHtcbiAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICAgIHNjcm9sbFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc2l6ZSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfVxuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGZ1bmN0aW9uIGZuKCkge30sXG4gIGVmZmVjdDogZWZmZWN0LFxuICBkYXRhOiB7fVxufTsiLCJ2YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJ2YXIgaGFzaCA9IHtcbiAgc3RhcnQ6ICdlbmQnLFxuICBlbmQ6ICdzdGFydCdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbChub2RlKSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3cobm9kZSk7XG4gIHZhciBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICB2YXIgc2Nyb2xsVG9wID0gd2luLnBhZ2VZT2Zmc2V0O1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IHNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBzY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDtcblxuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDtcbiAgICB2YXIgbGF5b3V0Vmlld3BvcnQgPSBpc0xheW91dFZpZXdwb3J0KCk7XG5cbiAgICBpZiAobGF5b3V0Vmlld3BvcnQgfHwgIWxheW91dFZpZXdwb3J0ICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeTogeVxuICB9O1xufSIsImltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IHsgbWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjsgLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkb3duZXJEb2N1bWVuO1xuXG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgd2luU2Nyb2xsID0gZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpO1xuICB2YXIgYm9keSA9IChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keTtcbiAgdmFyIHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICB2YXIgeCA9IC13aW5TY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIHZhciB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsImltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KG5vZGUpIHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59IiwiaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tIFwiLi9nZXRTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0U2Nyb2xsUGFyZW50cyhlbGVtZW50LCBsaXN0KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBzY3JvbGxQYXJlbnQgPT09ICgoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHkpO1xuICB2YXIgd2luID0gZ2V0V2luZG93KHNjcm9sbFBhcmVudCk7XG4gIHZhciB0YXJnZXQgPSBpc0JvZHkgPyBbd2luXS5jb25jYXQod2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc1Njcm9sbFBhcmVudChzY3JvbGxQYXJlbnQpID8gc2Nyb2xsUGFyZW50IDogW10pIDogc2Nyb2xsUGFyZW50O1xuICB2YXIgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogaXNCb2R5IHRlbGxzIHVzIHRhcmdldCB3aWxsIGJlIGFuIEhUTUxFbGVtZW50IGhlcmVcbiAgdXBkYXRlZExpc3QuY29uY2F0KGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUodGFyZ2V0KSkpO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufSIsImltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0Vmlld3BvcnRSZWN0IGZyb20gXCIuL2dldFZpZXdwb3J0UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50UmVjdCBmcm9tIFwiLi9nZXREb2N1bWVudFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuLi91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGZhbHNlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGNsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpKSA6IGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIDogcmVjdFRvQ2xpZW50UmVjdChnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKSk7XG59IC8vIEEgXCJjbGlwcGluZyBwYXJlbnRcIiBpcyBhbiBvdmVyZmxvd2FibGUgY29udGFpbmVyIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aXRoIGEgcG9zaXRpb24gZGlmZmVyZW50IGZyb21cbi8vIGBpbml0aWFsYFxuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSB7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgdmFyIGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbikgPj0gMDtcbiAgdmFyIGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG5cblxuICByZXR1cm4gY2xpcHBpbmdQYXJlbnRzLmZpbHRlcihmdW5jdGlvbiAoY2xpcHBpbmdQYXJlbnQpIHtcbiAgICByZXR1cm4gaXNFbGVtZW50KGNsaXBwaW5nUGFyZW50KSAmJiBjb250YWlucyhjbGlwcGluZ1BhcmVudCwgY2xpcHBlckVsZW1lbnQpICYmIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknO1xuICB9KTtcbn0gLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgcGFyZW50c1xuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChlbGVtZW50LCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSkge1xuICB2YXIgbWFpbkNsaXBwaW5nUGFyZW50cyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJyA/IGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50KSA6IFtdLmNvbmNhdChib3VuZGFyeSk7XG4gIHZhciBjbGlwcGluZ1BhcmVudHMgPSBbXS5jb25jYXQobWFpbkNsaXBwaW5nUGFyZW50cywgW3Jvb3RCb3VuZGFyeV0pO1xuICB2YXIgZmlyc3RDbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c1swXTtcbiAgdmFyIGNsaXBwaW5nUmVjdCA9IGNsaXBwaW5nUGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjY1JlY3QsIGNsaXBwaW5nUGFyZW50KSB7XG4gICAgdmFyIHJlY3QgPSBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSk7XG4gIGNsaXBwaW5nUmVjdC53aWR0aCA9IGNsaXBwaW5nUmVjdC5yaWdodCAtIGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QuaGVpZ2h0ID0gY2xpcHBpbmdSZWN0LmJvdHRvbSAtIGNsaXBwaW5nUmVjdC50b3A7XG4gIGNsaXBwaW5nUmVjdC54ID0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC55ID0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgcmV0dXJuIGNsaXBwaW5nUmVjdDtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRzdHJhdGVneSA9IF9vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgc3RyYXRlZ3kgPSBfb3B0aW9ucyRzdHJhdGVneSA9PT0gdm9pZCAwID8gc3RhdGUuc3RyYXRlZ3kgOiBfb3B0aW9ucyRzdHJhdGVneSxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwiaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCB7IHZhcmlhdGlvblBsYWNlbWVudHMsIGJhc2VQbGFjZW1lbnRzLCBwbGFjZW1lbnRzIGFzIGFsbFBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgX29wdGlvbnMkYWxsb3dlZEF1dG9QID0gX29wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gX29wdGlvbnMkYWxsb3dlZEF1dG9QID09PSB2b2lkIDAgPyBhbGxQbGFjZW1lbnRzIDogX29wdGlvbnMkYWxsb3dlZEF1dG9QO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCk7XG4gIHZhciBwbGFjZW1lbnRzID0gdmFyaWF0aW9uID8gZmxpcFZhcmlhdGlvbnMgPyB2YXJpYXRpb25QbGFjZW1lbnRzIDogdmFyaWF0aW9uUGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uO1xuICB9KSA6IGJhc2VQbGFjZW1lbnRzO1xuICB2YXIgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGFsbG93ZWRQbGFjZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cztcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXTogRmxvdyBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGggdHdvIGFycmF5IHVuaW9ucy4uLlxuXG5cbiAgdmFyIG92ZXJmbG93cyA9IGFsbG93ZWRQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pW2dldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3ZlcmZsb3dzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXTtcbiAgfSk7XG59IiwiaW1wb3J0IGdldE9wcG9zaXRlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBjb21wdXRlQXV0b1BsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZUF1dG9QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmZ1bmN0aW9uIGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBpZiAoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cblxuZnVuY3Rpb24gZmxpcChfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyA9IG9wdGlvbnMuZmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkZmxpcFZhcmlhdGlvID0gb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMkZmxpcFZhcmlhdGlvID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkZmxpcFZhcmlhdGlvLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHM7XG4gIHZhciBwcmVmZXJyZWRQbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSBiYXNlUGxhY2VtZW50ID09PSBwcmVmZXJyZWRQbGFjZW1lbnQ7XG4gIHZhciBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcFZhcmlhdGlvbnMgPyBbZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcbiAgdmFyIHBsYWNlbWVudHMgPSBbcHJlZmVycmVkUGxhY2VtZW50XS5jb25jYXQoZmFsbGJhY2tQbGFjZW1lbnRzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvID8gY29tcHV0ZUF1dG9QbGFjZW1lbnQoc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnM6IGZsaXBWYXJpYXRpb25zLFxuICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBhbGxvd2VkQXV0b1BsYWNlbWVudHNcbiAgICB9KSA6IHBsYWNlbWVudCk7XG4gIH0sIFtdKTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgY2hlY2tzTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgbWFrZUZhbGxiYWNrQ2hlY2tzID0gdHJ1ZTtcbiAgdmFyIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHNbMF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFjZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG5cbiAgICB2YXIgX2Jhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG5cbiAgICB2YXIgaXNTdGFydFZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSBzdGFydDtcbiAgICB2YXIgaXNWZXJ0aWNhbCA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihfYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KTtcbiAgICB2YXIgbWFpblZhcmlhdGlvblNpZGUgPSBpc1ZlcnRpY2FsID8gaXNTdGFydFZhcmlhdGlvbiA/IHJpZ2h0IDogbGVmdCA6IGlzU3RhcnRWYXJpYXRpb24gPyBib3R0b20gOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICB2YXIgYWx0VmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB2YXIgY2hlY2tzID0gW107XG5cbiAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbX2Jhc2VQbGFjZW1lbnRdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W21haW5WYXJpYXRpb25TaWRlXSA8PSAwLCBvdmVyZmxvd1thbHRWYXJpYXRpb25TaWRlXSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tzLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH0pKSB7XG4gICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gICAgICBtYWtlRmFsbGJhY2tDaGVja3MgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNoZWNrc01hcC5zZXQocGxhY2VtZW50LCBjaGVja3MpO1xuICB9XG5cbiAgaWYgKG1ha2VGYWxsYmFja0NoZWNrcykge1xuICAgIC8vIGAyYCBtYXkgYmUgZGVzaXJlZCBpbiBzb21lIGNhc2VzIOKAkyByZXNlYXJjaCBsYXRlclxuICAgIHZhciBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChfaSkge1xuICAgICAgdmFyIGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gY2hlY2tzTWFwLmdldChwbGFjZW1lbnQpO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIF9pKS5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IGZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIF9pID0gbnVtYmVyT2ZDaGVja3M7IF9pID4gMDsgX2ktLSkge1xuICAgICAgdmFyIF9yZXQgPSBfbG9vcChfaSk7XG5cbiAgICAgIGlmIChfcmV0ID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0ZS5wbGFjZW1lbnQgIT09IGZpcnN0Rml0dGluZ1BsYWNlbWVudCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXAgPSB0cnVlO1xuICAgIHN0YXRlLnBsYWNlbWVudCA9IGZpcnN0Rml0dGluZ1BsYWNlbWVudDtcbiAgICBzdGF0ZS5yZXNldCA9IHRydWU7XG4gIH1cbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59OyIsImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIHBsYWNlbWVudHMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCByZWN0cywgb2Zmc2V0KSB7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgaW52ZXJ0RGlzdGFuY2UgPSBbbGVmdCwgdG9wXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyAtMSA6IDE7XG5cbiAgdmFyIF9yZWYgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gb2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSkpIDogb2Zmc2V0LFxuICAgICAgc2tpZGRpbmcgPSBfcmVmWzBdLFxuICAgICAgZGlzdGFuY2UgPSBfcmVmWzFdO1xuXG4gIHNraWRkaW5nID0gc2tpZGRpbmcgfHwgMDtcbiAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgfHwgMCkgKiBpbnZlcnREaXN0YW5jZTtcbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8ge1xuICAgIHg6IGRpc3RhbmNlLFxuICAgIHk6IHNraWRkaW5nXG4gIH0gOiB7XG4gICAgeDogc2tpZGRpbmcsXG4gICAgeTogZGlzdGFuY2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZjIubmFtZTtcbiAgdmFyIF9vcHRpb25zJG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX29wdGlvbnMkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfb3B0aW9ucyRvZmZzZXQ7XG4gIHZhciBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgdmFyIF9kYXRhJHN0YXRlJHBsYWNlbWVudCA9IGRhdGFbc3RhdGUucGxhY2VtZW50XSxcbiAgICAgIHggPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueCxcbiAgICAgIHkgPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ29mZnNldCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgZm46IG9mZnNldFxufTsiLCJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHN0YXJ0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tIFwiLi4vdXRpbHMvZ2V0QWx0QXhpcy5qc1wiO1xuaW1wb3J0IHsgd2l0aGluLCB3aXRoaW5NYXhDbGFtcCB9IGZyb20gXCIuLi91dGlscy93aXRoaW4uanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuLi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmltcG9ydCB7IG1pbiBhcyBtYXRoTWluLCBtYXggYXMgbWF0aE1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIF9vcHRpb25zJHRldGhlciA9IG9wdGlvbnMudGV0aGVyLFxuICAgICAgdGV0aGVyID0gX29wdGlvbnMkdGV0aGVyID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkdGV0aGVyLFxuICAgICAgX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID0gb3B0aW9ucy50ZXRoZXJPZmZzZXQsXG4gICAgICB0ZXRoZXJPZmZzZXQgPSBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQ7XG4gIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5XG4gIH0pO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgdmFyIG1haW5BeGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgYWx0QXhpcyA9IGdldEFsdEF4aXMobWFpbkF4aXMpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgdGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gdGV0aGVyT2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSkpIDogdGV0aGVyT2Zmc2V0O1xuICB2YXIgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldFZhbHVlID09PSAnbnVtYmVyJyA/IHtcbiAgICBtYWluQXhpczogdGV0aGVyT2Zmc2V0VmFsdWUsXG4gICAgYWx0QXhpczogdGV0aGVyT2Zmc2V0VmFsdWVcbiAgfSA6IE9iamVjdC5hc3NpZ24oe1xuICAgIG1haW5BeGlzOiAwLFxuICAgIGFsdEF4aXM6IDBcbiAgfSwgdGV0aGVyT2Zmc2V0VmFsdWUpO1xuICB2YXIgb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0ID8gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXRbc3RhdGUucGxhY2VtZW50XSA6IG51bGw7XG4gIHZhciBkYXRhID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmICghcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDtcblxuICAgIHZhciBtYWluU2lkZSA9IG1haW5BeGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICAgIHZhciBhbHRTaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICAgIHZhciBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIHZhciBvZmZzZXQgPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXTtcbiAgICB2YXIgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIHZhciBtYXggPSBvZmZzZXQgLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1pbkxlbiAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBtYXhPZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArIGFkZGl0aXZlICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdyAmJiBnZXRPZmZzZXRQYXJlbnQoc3RhdGUuZWxlbWVudHMuYXJyb3cpO1xuICAgIHZhciBjbGllbnRPZmZzZXQgPSBhcnJvd09mZnNldFBhcmVudCA/IG1haW5BeGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRUb3AgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudExlZnQgfHwgMCA6IDA7XG4gICAgdmFyIG9mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVttYWluQXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBvZmZzZXQgKyBtaW5PZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlIC0gY2xpZW50T2Zmc2V0O1xuICAgIHZhciB0ZXRoZXJNYXggPSBvZmZzZXQgKyBtYXhPZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlO1xuICAgIHZhciBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4odGV0aGVyID8gbWF0aE1pbihtaW4sIHRldGhlck1pbikgOiBtaW4sIG9mZnNldCwgdGV0aGVyID8gbWF0aE1heChtYXgsIHRldGhlck1heCkgOiBtYXgpO1xuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyO1xuXG4gICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgdmFyIF9hbHRTaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IGJvdHRvbSA6IHJpZ2h0O1xuXG4gICAgdmFyIF9vZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgdmFyIF9sZW4gPSBhbHRBeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICB2YXIgX21pbiA9IF9vZmZzZXQgKyBvdmVyZmxvd1tfbWFpblNpZGVdO1xuXG4gICAgdmFyIF9tYXggPSBfb2Zmc2V0IC0gb3ZlcmZsb3dbX2FsdFNpZGVdO1xuXG4gICAgdmFyIGlzT3JpZ2luU2lkZSA9IFt0b3AsIGxlZnRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xO1xuXG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJDIgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW2FsdEF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkMiA6IDA7XG5cbiAgICB2YXIgX3RldGhlck1pbiA9IGlzT3JpZ2luU2lkZSA/IF9taW4gOiBfb2Zmc2V0IC0gcmVmZXJlbmNlUmVjdFtfbGVuXSAtIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzO1xuXG4gICAgdmFyIF90ZXRoZXJNYXggPSBpc09yaWdpblNpZGUgPyBfb2Zmc2V0ICsgcmVmZXJlbmNlUmVjdFtfbGVuXSArIHBvcHBlclJlY3RbX2xlbl0gLSBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5hbHRBeGlzIDogX21heDtcblxuICAgIHZhciBfcHJldmVudGVkT2Zmc2V0ID0gdGV0aGVyICYmIGlzT3JpZ2luU2lkZSA/IHdpdGhpbk1heENsYW1wKF90ZXRoZXJNaW4sIF9vZmZzZXQsIF90ZXRoZXJNYXgpIDogd2l0aGluKHRldGhlciA/IF90ZXRoZXJNaW4gOiBfbWluLCBfb2Zmc2V0LCB0ZXRoZXIgPyBfdGV0aGVyTWF4IDogX21heCk7XG5cbiAgICBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldCAtIF9vZmZzZXQ7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J11cbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59IiwiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXROb2RlU2Nyb2xsIGZyb20gXCIuL2dldE5vZGVTY3JvbGwuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2NhbGVYID0gcm91bmQocmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE7XG4gIHZhciBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBlbGVtZW50Lm9mZnNldEhlaWdodCB8fCAxO1xuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn0gLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENvbXBvc2l0ZVJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudCwgaXNGaXhlZCkge1xuICBpZiAoaXNGaXhlZCA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNFbGVtZW50U2NhbGVkKG9mZnNldFBhcmVudCk7XG4gIHZhciBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsIG9mZnNldFBhcmVudElzU2NhbGVkLCBpc0ZpeGVkKTtcbiAgdmFyIHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICB2YXIgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEwNzhcbiAgICBpc1Njcm9sbFBhcmVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgb2Zmc2V0cyA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ICs9IG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ICs9IG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59IiwiaW1wb3J0IHsgbW9kaWZpZXJQaGFzZXMgfSBmcm9tIFwiLi4vZW51bXMuanNcIjsgLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShtb2RpZmllcnMpIHtcbiAgdmFyIG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgY3VycmVudCkge1xuICAgIHZhciBleGlzdGluZyA9IG1lcmdlZFtjdXJyZW50Lm5hbWVdO1xuICAgIG1lcmdlZFtjdXJyZW50Lm5hbWVdID0gZXhpc3RpbmcgPyBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZywgY3VycmVudCwge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3Rpbmcub3B0aW9ucywgY3VycmVudC5vcHRpb25zKSxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLmRhdGEsIGN1cnJlbnQuZGF0YSlcbiAgICB9KSA6IGN1cnJlbnQ7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pOyAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LnZhbHVlc1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFtrZXldO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tIFwiLi91dGlscy9tZXJnZUJ5TmFtZS5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBydW5Nb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIC8vIFN5bmMgdXBkYXRlIOKAkyBpdCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCwgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LiBUaGlzXG4gICAgICAvLyBpcyB1c2VmdWwgZm9yIGxvdyBmcmVxdWVuY3kgdXBkYXRlcyB3aGVyZSBzeW5jIGJlaGF2aW9yIHNpbXBsaWZpZXMgdGhlXG4gICAgICAvLyBsb2dpYy5cbiAgICAgIC8vIEZvciBoaWdoIGZyZXF1ZW5jeSB1cGRhdGVzIChlLmcuIGByZXNpemVgIGFuZCBgc2Nyb2xsYCBldmVudHMpLCBhbHdheXNcbiAgICAgIC8vIHByZWZlciB0aGUgYXN5bmMgUG9wcGVyI3VwZGF0ZSBtZXRob2RcbiAgICAgIGZvcmNlVXBkYXRlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9zdGF0ZSRlbGVtZW50cyA9IHN0YXRlLmVsZW1lbnRzLFxuICAgICAgICAgICAgcmVmZXJlbmNlID0gX3N0YXRlJGVsZW1lbnRzLnJlZmVyZW5jZSxcbiAgICAgICAgICAgIHBvcHBlciA9IF9zdGF0ZSRlbGVtZW50cy5wb3BwZXI7IC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG5cbiAgICAgICAgaWYgKCFhcmVWYWxpZEVsZW1lbnRzKHJlZmVyZW5jZSwgcG9wcGVyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zZXRPcHRpb25zKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBpZiAoIWlzRGVzdHJveWVkICYmIG9wdGlvbnMub25GaXJzdFVwZGF0ZSkge1xuICAgICAgICBvcHRpb25zLm9uRmlyc3RVcGRhdGUoc3RhdGUpO1xuICAgICAgfVxuICAgIH0pOyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIGJlZm9yZSB0aGUgZmlyc3RcbiAgICAvLyB1cGRhdGUgY3ljbGUgcnVucy4gVGhleSB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSB1cGRhdGVcbiAgICAvLyBjeWNsZS4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIG1vZGlmaWVyIGFkZHMgc29tZSBwZXJzaXN0ZW50IGRhdGEgdGhhdFxuICAgIC8vIG90aGVyIG1vZGlmaWVycyBuZWVkIHRvIHVzZSwgYnV0IHRoZSBtb2RpZmllciBpcyBydW4gYWZ0ZXIgdGhlIGRlcGVuZGVudFxuICAgIC8vIG9uZS5cblxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zLFxuICAgICAgICAgICAgZWZmZWN0ID0gX3JlZi5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlc107XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xuaW1wb3J0IG9mZnNldCBmcm9tIFwiLi9tb2RpZmllcnMvb2Zmc2V0LmpzXCI7XG5pbXBvcnQgZmxpcCBmcm9tIFwiLi9tb2RpZmllcnMvZmxpcC5qc1wiO1xuaW1wb3J0IHByZXZlbnRPdmVyZmxvdyBmcm9tIFwiLi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgYXJyb3cgZnJvbSBcIi4vbW9kaWZpZXJzL2Fycm93LmpzXCI7XG5pbXBvcnQgaGlkZSBmcm9tIFwiLi9tb2RpZmllcnMvaGlkZS5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzLCBvZmZzZXQsIGZsaXAsIHByZXZlbnRPdmVyZmxvdywgYXJyb3csIGhpZGVdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IiwiLyohXG4gICogQm9vdHN0cmFwIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKCk7XG5jb25zdCBEYXRhID0ge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlTWFwID0gZWxlbWVudE1hcC5nZXQoZWxlbWVudCk7XG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgfSxcbiAgZ2V0KGVsZW1lbnQsIGtleSkge1xuICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpLmdldChrZXkpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgIGluc3RhbmNlTWFwLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gZnJlZSB1cCBlbGVtZW50IHJlZmVyZW5jZXMgaWYgdGhlcmUgYXJlIG5vIGluc3RhbmNlcyBsZWZ0IGZvciBhbiBlbGVtZW50XG4gICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgIGVsZW1lbnRNYXAuZGVsZXRlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMTAwMDAwMDtcbmNvbnN0IE1JTExJU0VDT05EU19NVUxUSVBMSUVSID0gMTAwMDtcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xuXG4vKipcbiAqIFByb3Blcmx5IGVzY2FwZSBJRHMgc2VsZWN0b3JzIHRvIGhhbmRsZSB3ZWlyZCBJRHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgaWYgKHNlbGVjdG9yICYmIHdpbmRvdy5DU1MgJiYgd2luZG93LkNTUy5lc2NhcGUpIHtcbiAgICAvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yIG5lZWRzIGVzY2FwaW5nIHRvIGhhbmRsZSBJRHMgKGh0bWw1KykgY29udGFpbmluZyBmb3IgaW5zdGFuY2UgL1xuICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApO1xuICB9XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7XG4gIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpO1xuICByZXR1cm4gcHJlZml4O1xufTtcbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHtcbiAgICB0cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgdHJhbnNpdGlvbkRlbGF5XG4gIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pO1xuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgdHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5LnNwbGl0KCcsJylbMF07XG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVI7XG59O1xuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpO1xufTtcbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF07XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgIT09ICd1bmRlZmluZWQnO1xufTtcbmNvbnN0IGdldEVsZW1lbnQgPSBvYmplY3QgPT4ge1xuICAvLyBpdCdzIGEgalF1ZXJ5IG9iamVjdCBvciBhIG5vZGUgZWxlbWVudFxuICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0LmpxdWVyeSA/IG9iamVjdFswXSA6IG9iamVjdDtcbiAgfVxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihwYXJzZVNlbGVjdG9yKG9iamVjdCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnO1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJyk7XG4gIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgIHJldHVybiBlbGVtZW50SXNWaXNpYmxlO1xuICB9XG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpO1xuICAgIGlmIChzdW1tYXJ5ICYmIHN1bW1hcnkucGFyZW50Tm9kZSAhPT0gY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbn07XG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZDtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSc7XG59O1xuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgZG9uJ3QgZmluZCBhIHNoYWRvdyByb290XG4gIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG59O1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiAqIFRyaWNrIHRvIHJlc3RhcnQgYW4gZWxlbWVudCdzIGFuaW1hdGlvblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4gdm9pZFxuICpcbiAqIEBzZWUgaHR0cHM6Ly93d3cuY2hhcmlzdGhlby5pby9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICovXG5jb25zdCByZWZsb3cgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59O1xuY29uc3QgZ2V0alF1ZXJ5ID0gKCkgPT4ge1xuICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICByZXR1cm4gd2luZG93LmpRdWVyeTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW107XG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn07XG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnO1xuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRTtcbiAgICAgIGNvbnN0IEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bbmFtZV07XG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZTtcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW47XG4gICAgICAkLmZuW25hbWVdLm5vQ29uZmxpY3QgPSAoKSA9PiB7XG4gICAgICAgICQuZm5bbmFtZV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGV4ZWN1dGUgPSAocG9zc2libGVDYWxsYmFjaywgYXJncyA9IFtdLCBkZWZhdWx0VmFsdWUgPSBwb3NzaWJsZUNhbGxiYWNrKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWU7XG59O1xuY29uc3QgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiA9IChjYWxsYmFjaywgdHJhbnNpdGlvbkVsZW1lbnQsIHdhaXRGb3JUcmFuc2l0aW9uID0gdHJ1ZSkgPT4ge1xuICBpZiAoIXdhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGR1cmF0aW9uUGFkZGluZyA9IDU7XG4gIGNvbnN0IGVtdWxhdGVkRHVyYXRpb24gPSBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0cmFuc2l0aW9uRWxlbWVudCkgKyBkdXJhdGlvblBhZGRpbmc7XG4gIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgdGFyZ2V0XG4gIH0pID0+IHtcbiAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHRyYW5zaXRpb25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpO1xuICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICB9O1xuICB0cmFuc2l0aW9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgIHRyaWdnZXJUcmFuc2l0aW9uRW5kKHRyYW5zaXRpb25FbGVtZW50KTtcbiAgICB9XG4gIH0sIGVtdWxhdGVkRHVyYXRpb24pO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByZXZpb3VzL25leHQgZWxlbWVudCBvZiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHthcnJheX0gbGlzdCAgICBUaGUgbGlzdCBvZiBlbGVtZW50c1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnQgICBUaGUgYWN0aXZlIGVsZW1lbnRcbiAqIEBwYXJhbSBzaG91bGRHZXROZXh0ICAgQ2hvb3NlIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIGVsZW1lbnRcbiAqIEBwYXJhbSBpc0N5Y2xlQWxsb3dlZFxuICogQHJldHVybiB7RWxlbWVudHxlbGVtfSBUaGUgcHJvcGVyIGVsZW1lbnRcbiAqL1xuY29uc3QgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSAobGlzdCwgYWN0aXZlRWxlbWVudCwgc2hvdWxkR2V0TmV4dCwgaXNDeWNsZUFsbG93ZWQpID0+IHtcbiAgY29uc3QgbGlzdExlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBsZXQgaW5kZXggPSBsaXN0LmluZGV4T2YoYWN0aXZlRWxlbWVudCk7XG5cbiAgLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpc3QgcmV0dXJuIGFuIGVsZW1lbnRcbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAhc2hvdWxkR2V0TmV4dCAmJiBpc0N5Y2xlQWxsb3dlZCA/IGxpc3RbbGlzdExlbmd0aCAtIDFdIDogbGlzdFswXTtcbiAgfVxuICBpbmRleCArPSBzaG91bGRHZXROZXh0ID8gMSA6IC0xO1xuICBpZiAoaXNDeWNsZUFsbG93ZWQpIHtcbiAgICBpbmRleCA9IChpbmRleCArIGxpc3RMZW5ndGgpICUgbGlzdExlbmd0aDtcbiAgfVxuICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV07XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgZG9tL2V2ZW50LWhhbmRsZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgbmFtZXNwYWNlUmVnZXggPSAvW14uXSooPz1cXC4uKilcXC58LiovO1xuY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovO1xuY29uc3Qgc3RyaXBVaWRSZWdleCA9IC86OlxcZCskLztcbmNvbnN0IGV2ZW50UmVnaXN0cnkgPSB7fTsgLy8gRXZlbnRzIHN0b3JhZ2VcbmxldCB1aWRFdmVudCA9IDE7XG5jb25zdCBjdXN0b21FdmVudHMgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59O1xuY29uc3QgbmF0aXZlRXZlbnRzID0gbmV3IFNldChbJ2NsaWNrJywgJ2RibGNsaWNrJywgJ21vdXNldXAnLCAnbW91c2Vkb3duJywgJ2NvbnRleHRtZW51JywgJ21vdXNld2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnLCAnbW91c2VvdmVyJywgJ21vdXNlb3V0JywgJ21vdXNlbW92ZScsICdzZWxlY3RzdGFydCcsICdzZWxlY3RlbmQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdvcmllbnRhdGlvbmNoYW5nZScsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd0b3VjaGNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVybW92ZScsICdwb2ludGVydXAnLCAncG9pbnRlcmxlYXZlJywgJ3BvaW50ZXJjYW5jZWwnLCAnZ2VzdHVyZXN0YXJ0JywgJ2dlc3R1cmVjaGFuZ2UnLCAnZ2VzdHVyZWVuZCcsICdmb2N1cycsICdibHVyJywgJ2NoYW5nZScsICdyZXNldCcsICdzZWxlY3QnLCAnc3VibWl0JywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnbG9hZCcsICd1bmxvYWQnLCAnYmVmb3JldW5sb2FkJywgJ3Jlc2l6ZScsICdtb3ZlJywgJ0RPTUNvbnRlbnRMb2FkZWQnLCAncmVhZHlzdGF0ZWNoYW5nZScsICdlcnJvcicsICdhYm9ydCcsICdzY3JvbGwnXSk7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RzXG4gKi9cblxuZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICByZXR1cm4gdWlkICYmIGAke3VpZH06OiR7dWlkRXZlbnQrK31gIHx8IGVsZW1lbnQudWlkRXZlbnQgfHwgdWlkRXZlbnQrKztcbn1cbmZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoZWxlbWVudCk7XG4gIGVsZW1lbnQudWlkRXZlbnQgPSB1aWQ7XG4gIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fTtcbiAgcmV0dXJuIGV2ZW50UmVnaXN0cnlbdWlkXTtcbn1cbmZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBoeWRyYXRlT2JqKGV2ZW50LCB7XG4gICAgICBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudFxuICAgIH0pO1xuICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbik7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseShlbGVtZW50LCBbZXZlbnRdKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIHNlbGVjdG9yLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBmb3IgKGxldCB7XG4gICAgICB0YXJnZXRcbiAgICB9ID0gZXZlbnQ7IHRhcmdldCAmJiB0YXJnZXQgIT09IHRoaXM7IHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IGRvbUVsZW1lbnQgb2YgZG9tRWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgICAgICBkZWxlZ2F0ZVRhcmdldDogdGFyZ2V0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIHNlbGVjdG9yLCBmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZmluZEhhbmRsZXIoZXZlbnRzLCBjYWxsYWJsZSwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJztcbiAgLy8gVE9ETzogdG9vbHRpcCBwYXNzZXMgYGZhbHNlYCBpbnN0ZWFkIG9mIHNlbGVjdG9yLCBzbyB3ZSBuZWVkIHRvIGNoZWNrXG4gIGNvbnN0IGNhbGxhYmxlID0gaXNEZWxlZ2F0ZWQgPyBkZWxlZ2F0aW9uRnVuY3Rpb24gOiBoYW5kbGVyIHx8IGRlbGVnYXRpb25GdW5jdGlvbjtcbiAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudCk7XG4gIGlmICghbmF0aXZlRXZlbnRzLmhhcyh0eXBlRXZlbnQpKSB7XG4gICAgdHlwZUV2ZW50ID0gb3JpZ2luYWxUeXBlRXZlbnQ7XG4gIH1cbiAgcmV0dXJuIFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF07XG59XG5mdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbik7XG5cbiAgLy8gaW4gY2FzZSBvZiBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgd3JhcCB0aGUgaGFuZGxlciB3aXRoaW4gYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgaXRzIERPTSBwb3NpdGlvblxuICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgaWYgKG9yaWdpbmFsVHlwZUV2ZW50IGluIGN1c3RvbUV2ZW50cykge1xuICAgIGNvbnN0IHdyYXBGdW5jdGlvbiA9IGZuID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0IHx8IGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmICFldmVudC5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKTtcbiAgfVxuICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpO1xuICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KTtcbiAgY29uc3QgcHJldmlvdXNGdW5jdGlvbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbCk7XG4gIGlmIChwcmV2aW91c0Z1bmN0aW9uKSB7XG4gICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmY7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKTtcbiAgY29uc3QgZm4gPSBpc0RlbGVnYXRlZCA/IGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIGhhbmRsZXIsIGNhbGxhYmxlKSA6IGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgY2FsbGFibGUpO1xuICBmbi5kZWxlZ2F0aW9uU2VsZWN0b3IgPSBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsO1xuICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlO1xuICBmbi5vbmVPZmYgPSBvbmVPZmY7XG4gIGZuLnVpZEV2ZW50ID0gdWlkO1xuICBoYW5kbGVyc1t1aWRdID0gZm47XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBpc0RlbGVnYXRlZCk7XG59XG5mdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgY29uc3QgZm4gPSBmaW5kSGFuZGxlcihldmVudHNbdHlwZUV2ZW50XSwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgaWYgKCFmbikge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgQm9vbGVhbihkZWxlZ2F0aW9uU2VsZWN0b3IpKTtcbiAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgbmFtZXNwYWNlKSB7XG4gIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gIGZvciAoY29uc3QgW2hhbmRsZXJLZXksIGV2ZW50XSBvZiBPYmplY3QuZW50cmllcyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICBpZiAoaGFuZGxlcktleS5pbmNsdWRlcyhuYW1lc3BhY2UpKSB7XG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFR5cGVFdmVudChldmVudCkge1xuICAvLyBhbGxvdyB0byBnZXQgdGhlIG5hdGl2ZSBldmVudHMgZnJvbSBuYW1lc3BhY2VkIGV2ZW50cyAoJ2NsaWNrLmJzLmJ1dHRvbicgLS0+ICdjbGljaycpXG4gIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpO1xuICByZXR1cm4gY3VzdG9tRXZlbnRzW2V2ZW50XSB8fCBldmVudDtcbn1cbmNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgb24oZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgZmFsc2UpO1xuICB9LFxuICBvbmUoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgdHJ1ZSk7XG4gIH0sXG4gIG9mZihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbik7XG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCk7XG4gICAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fTtcbiAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKTtcbiAgICBpZiAodHlwZW9mIGNhbGxhYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2ltcGxlc3QgY2FzZTogaGFuZGxlciBpcyBwYXNzZWQsIHJlbW92ZSB0aGF0IGxpc3RlbmVyIE9OTFkuXG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudEV2ZW50IG9mIE9iamVjdC5rZXlzKGV2ZW50cykpIHtcbiAgICAgICAgcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgZWxlbWVudEV2ZW50LCBvcmlnaW5hbFR5cGVFdmVudC5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleUhhbmRsZXJzLCBldmVudF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJyk7XG4gICAgICBpZiAoIWluTmFtZXNwYWNlIHx8IG9yaWdpbmFsVHlwZUV2ZW50LmluY2x1ZGVzKGhhbmRsZXJLZXkpKSB7XG4gICAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpO1xuICAgIGNvbnN0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChldmVudCk7XG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50O1xuICAgIGxldCBqUXVlcnlFdmVudCA9IG51bGw7XG4gICAgbGV0IGJ1YmJsZXMgPSB0cnVlO1xuICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWU7XG4gICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICBpZiAoaW5OYW1lc3BhY2UgJiYgJCkge1xuICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKTtcbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihqUXVlcnlFdmVudCk7XG4gICAgICBidWJibGVzID0gIWpRdWVyeUV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgZGVmYXVsdFByZXZlbnRlZCA9IGpRdWVyeUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpO1xuICAgIH1cbiAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwge1xuICAgICAgYnViYmxlcyxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KSwgYXJncyk7XG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAobmF0aXZlRGlzcGF0Y2gpIHtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgIH1cbiAgICBpZiAoZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgJiYgalF1ZXJ5RXZlbnQpIHtcbiAgICAgIGpRdWVyeUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHJldHVybiBldnQ7XG4gIH1cbn07XG5mdW5jdGlvbiBoeWRyYXRlT2JqKG9iaiwgbWV0YSA9IHt9KSB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEpKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkb20vbWFuaXB1bGF0b3IuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcbiAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YUtleShrZXkpIHtcbiAgcmV0dXJuIGtleS5yZXBsYWNlKC9bQS1aXS9nLCBjaHIgPT4gYC0ke2Noci50b0xvd2VyQ2FzZSgpfWApO1xufVxuY29uc3QgTWFuaXB1bGF0b3IgPSB7XG4gIHNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKTtcbiAgfSxcbiAgcmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKTtcbiAgfSxcbiAgZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgY29uc3QgYnNLZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5kYXRhc2V0KS5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCdicycpICYmICFrZXkuc3RhcnRzV2l0aCgnYnNDb25maWcnKSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYnNLZXlzKSB7XG4gICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJyk7XG4gICAgICBwdXJlS2V5ID0gcHVyZUtleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHB1cmVLZXkuc2xpY2UoMSwgcHVyZUtleS5sZW5ndGgpO1xuICAgICAgYXR0cmlidXRlc1twdXJlS2V5XSA9IG5vcm1hbGl6ZURhdGEoZWxlbWVudC5kYXRhc2V0W2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfSxcbiAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShlbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKSk7XG4gIH1cbn07XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2NvbmZpZy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29uZmlnIHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgc3RhdGljIG1ldGhvZCBcIk5BTUVcIiwgZm9yIGVhY2ggY29tcG9uZW50IScpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKTtcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9tZXJnZUNvbmZpZ09iaihjb25maWcsIGVsZW1lbnQpIHtcbiAgICBjb25zdCBqc29uQ29uZmlnID0gaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCAnY29uZmlnJykgOiB7fTsgLy8gdHJ5IHRvIHBhcnNlXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LFxuICAgICAgLi4uKHR5cGVvZiBqc29uQ29uZmlnID09PSAnb2JqZWN0JyA/IGpzb25Db25maWcgOiB7fSksXG4gICAgICAuLi4oaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiB7fSlcbiAgICB9O1xuICB9XG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnLCBjb25maWdUeXBlcyA9IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpIHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eSwgZXhwZWN0ZWRUeXBlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnVHlwZXMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogdG9UeXBlKHZhbHVlKTtcbiAgICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYmFzZS1jb21wb25lbnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgVkVSU0lPTiA9ICc1LjMuMyc7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIGVsZW1lbnQgPSBnZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICBEYXRhLnNldCh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIERhdGEucmVtb3ZlKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG4gICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBudWxsO1xuICAgIH1cbiAgfVxuICBfcXVldWVDYWxsYmFjayhjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCA9IHRydWUpIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkKTtcbiAgfVxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudCk7XG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpO1xuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGdldEluc3RhbmNlKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gRGF0YS5nZXQoZ2V0RWxlbWVudChlbGVtZW50KSwgdGhpcy5EQVRBX0tFWSk7XG4gIH1cbiAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpO1xuICB9XG4gIHN0YXRpYyBnZXQgVkVSU0lPTigpIHtcbiAgICByZXR1cm4gVkVSU0lPTjtcbiAgfVxuICBzdGF0aWMgZ2V0IERBVEFfS0VZKCkge1xuICAgIHJldHVybiBgYnMuJHt0aGlzLk5BTUV9YDtcbiAgfVxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YDtcbiAgfVxuICBzdGF0aWMgZXZlbnROYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ke3RoaXMuRVZFTlRfS0VZfWA7XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBnZXRTZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy10YXJnZXQnKTtcbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgLy8gVGhlIG9ubHkgdmFsaWQgY29udGVudCB0aGF0IGNvdWxkIGRvdWJsZSBhcyBhIHNlbGVjdG9yIGFyZSBJRHMgb3IgY2xhc3NlcyxcbiAgICAvLyBzbyBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggYCNgIG9yIGAuYC4gSWYgYSBcInJlYWxcIiBVUkwgaXMgdXNlZCBhcyB0aGUgc2VsZWN0b3IsXG4gICAgLy8gYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JgIHdpbGwgcmlnaHRmdWxseSBjb21wbGFpbiBpdCBpcyBpbnZhbGlkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzMyMjczXG4gICAgaWYgKCFocmVmQXR0cmlidXRlIHx8ICFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YDtcbiAgICB9XG4gICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbDtcbiAgfVxuICByZXR1cm4gc2VsZWN0b3IgPyBzZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChzZWwgPT4gcGFyc2VTZWxlY3RvcihzZWwpKS5qb2luKCcsJykgOiBudWxsO1xufTtcbmNvbnN0IFNlbGVjdG9yRW5naW5lID0ge1xuICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKTtcbiAgfSxcbiAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICB9LFxuICBjaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBbXS5jb25jYXQoLi4uZWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGNoaWxkID0+IGNoaWxkLm1hdGNoZXMoc2VsZWN0b3IpKTtcbiAgfSxcbiAgcGFyZW50cyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcbiAgICBsZXQgYW5jZXN0b3IgPSBlbGVtZW50LnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpO1xuICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbiAgfSxcbiAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAocHJldmlvdXMpIHtcbiAgICAgIGlmIChwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICByZXR1cm4gW3ByZXZpb3VzXTtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKG5leHQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtuZXh0XTtcbiAgICAgIH1cbiAgICAgIG5leHQgPSBuZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgZm9jdXNhYmxlcyA9IFsnYScsICdidXR0b24nLCAnaW5wdXQnLCAndGV4dGFyZWEnLCAnc2VsZWN0JywgJ2RldGFpbHMnLCAnW3RhYmluZGV4XScsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSddLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKTtcbiAgICByZXR1cm4gdGhpcy5maW5kKGZvY3VzYWJsZXMsIGVsZW1lbnQpLmZpbHRlcihlbCA9PiAhaXNEaXNhYmxlZChlbCkgJiYgaXNWaXNpYmxlKGVsKSk7XG4gIH0sXG4gIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgIHJldHVybiBzZWxlY3RvciA/IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IpIDogbnVsbDtcbiAgfSxcbiAgZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KTtcbiAgICByZXR1cm4gc2VsZWN0b3IgPyBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKSA6IFtdO1xuICB9XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgZW5hYmxlRGlzbWlzc1RyaWdnZXIgPSAoY29tcG9uZW50LCBtZXRob2QgPSAnaGlkZScpID0+IHtcbiAgY29uc3QgY2xpY2tFdmVudCA9IGBjbGljay5kaXNtaXNzJHtjb21wb25lbnQuRVZFTlRfS0VZfWA7XG4gIGNvbnN0IG5hbWUgPSBjb21wb25lbnQuTkFNRTtcbiAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBjbGlja0V2ZW50LCBgW2RhdGEtYnMtZGlzbWlzcz1cIiR7bmFtZX1cIl1gLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpIHx8IHRoaXMuY2xvc2VzdChgLiR7bmFtZX1gKTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG5cbiAgICAvLyBNZXRob2QgYXJndW1lbnQgaXMgbGVmdCwgZm9yIEFsZXJ0IGFuZCBvbmx5LCBhcyBpdCBkb2Vzbid0IGltcGxlbWVudCB0aGUgJ2hpZGUnIG1ldGhvZFxuICAgIGluc3RhbmNlW21ldGhvZF0oKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSRmID0gJ2FsZXJ0JztcbmNvbnN0IERBVEFfS0VZJGEgPSAnYnMuYWxlcnQnO1xuY29uc3QgRVZFTlRfS0VZJGIgPSBgLiR7REFUQV9LRVkkYX1gO1xuY29uc3QgRVZFTlRfQ0xPU0UgPSBgY2xvc2Uke0VWRU5UX0tFWSRifWA7XG5jb25zdCBFVkVOVF9DTE9TRUQgPSBgY2xvc2VkJHtFVkVOVF9LRVkkYn1gO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckOCA9ICdzaG93JztcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQWxlcnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkZjtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBjbG9zZSgpIHtcbiAgICBjb25zdCBjbG9zZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfQ0xPU0UpO1xuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ4KTtcbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDUpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kZXN0cm95RWxlbWVudCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMT1NFRCk7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBBbGVydC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJyk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKEFsZXJ0KTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIGJ1dHRvbi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGUgPSAnYnV0dG9uJztcbmNvbnN0IERBVEFfS0VZJDkgPSAnYnMuYnV0dG9uJztcbmNvbnN0IEVWRU5UX0tFWSRhID0gYC4ke0RBVEFfS0VZJDl9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQ2ID0gJy5kYXRhLWFwaSc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSQzID0gJ2FjdGl2ZSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ1ID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImJ1dHRvblwiXSc7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ2ID0gYGNsaWNrJHtFVkVOVF9LRVkkYX0ke0RBVEFfQVBJX0tFWSQ2fWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRlO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUkMykpO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyk7XG4gICAgICBpZiAoY29uZmlnID09PSAndG9nZ2xlJykge1xuICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQ2LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ1LCBldmVudCA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGNvbnN0IGJ1dHRvbiA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RBVEFfVE9HR0xFJDUpO1xuICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UoYnV0dG9uKTtcbiAgZGF0YS50b2dnbGUoKTtcbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihCdXR0b24pO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zd2lwZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGQgPSAnc3dpcGUnO1xuY29uc3QgRVZFTlRfS0VZJDkgPSAnLmJzLnN3aXBlJztcbmNvbnN0IEVWRU5UX1RPVUNIU1RBUlQgPSBgdG91Y2hzdGFydCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1RPVUNITU9WRSA9IGB0b3VjaG1vdmUke0VWRU5UX0tFWSQ5fWA7XG5jb25zdCBFVkVOVF9UT1VDSEVORCA9IGB0b3VjaGVuZCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IEVWRU5UX1BPSU5URVJET1dOID0gYHBvaW50ZXJkb3duJHtFVkVOVF9LRVkkOX1gO1xuY29uc3QgRVZFTlRfUE9JTlRFUlVQID0gYHBvaW50ZXJ1cCR7RVZFTlRfS0VZJDl9YDtcbmNvbnN0IFBPSU5URVJfVFlQRV9UT1VDSCA9ICd0b3VjaCc7XG5jb25zdCBQT0lOVEVSX1RZUEVfUEVOID0gJ3Blbic7XG5jb25zdCBDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQgPSAncG9pbnRlci1ldmVudCc7XG5jb25zdCBTV0lQRV9USFJFU0hPTEQgPSA0MDtcbmNvbnN0IERlZmF1bHQkYyA9IHtcbiAgZW5kQ2FsbGJhY2s6IG51bGwsXG4gIGxlZnRDYWxsYmFjazogbnVsbCxcbiAgcmlnaHRDYWxsYmFjazogbnVsbFxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGMgPSB7XG4gIGVuZENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgbGVmdENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgcmlnaHRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFN3aXBlIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIVN3aXBlLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fZGVsdGFYID0gMDtcbiAgICB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyA9IEJvb2xlYW4od2luZG93LlBvaW50ZXJFdmVudCk7XG4gICAgdGhpcy5faW5pdEV2ZW50cygpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkYztcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSRjO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRkO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVkkOSk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9zdGFydChldmVudCkge1xuICAgIGlmICghdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYO1xuICAgIH1cbiAgfVxuICBfZW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5fZGVsdGFYO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVTd2lwZSgpO1xuICAgIGV4ZWN1dGUodGhpcy5fY29uZmlnLmVuZENhbGxiYWNrKTtcbiAgfVxuICBfbW92ZShldmVudCkge1xuICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxID8gMCA6IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX2RlbHRhWDtcbiAgfVxuICBfaGFuZGxlU3dpcGUoKSB7XG4gICAgY29uc3QgYWJzRGVsdGFYID0gTWF0aC5hYnModGhpcy5fZGVsdGFYKTtcbiAgICBpZiAoYWJzRGVsdGFYIDw9IFNXSVBFX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBhYnNEZWx0YVggLyB0aGlzLl9kZWx0YVg7XG4gICAgdGhpcy5fZGVsdGFYID0gMDtcbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBleGVjdXRlKGRpcmVjdGlvbiA+IDAgPyB0aGlzLl9jb25maWcucmlnaHRDYWxsYmFjayA6IHRoaXMuX2NvbmZpZy5sZWZ0Q2FsbGJhY2spO1xuICB9XG4gIF9pbml0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJET1dOLCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJVUCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNIU1RBUlQsIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hNT1ZFLCBldmVudCA9PiB0aGlzLl9tb3ZlKGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hFTkQsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpO1xuICAgIH1cbiAgfVxuICBfZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkge1xuICAgIHJldHVybiB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyAmJiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9QRU4gfHwgZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9UT1VDSCk7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMDtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgY2Fyb3VzZWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSRjID0gJ2Nhcm91c2VsJztcbmNvbnN0IERBVEFfS0VZJDggPSAnYnMuY2Fyb3VzZWwnO1xuY29uc3QgRVZFTlRfS0VZJDggPSBgLiR7REFUQV9LRVkkOH1gO1xuY29uc3QgREFUQV9BUElfS0VZJDUgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEFSUk9XX0xFRlRfS0VZJDEgPSAnQXJyb3dMZWZ0JztcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSQxID0gJ0Fycm93UmlnaHQnO1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMDsgLy8gVGltZSBmb3IgbW91c2UgY29tcGF0IGV2ZW50cyB0byBmaXJlIGFmdGVyIHRvdWNoXG5cbmNvbnN0IE9SREVSX05FWFQgPSAnbmV4dCc7XG5jb25zdCBPUkRFUl9QUkVWID0gJ3ByZXYnO1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCc7XG5jb25zdCBESVJFQ1RJT05fUklHSFQgPSAncmlnaHQnO1xuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9LRVlET1dOJDEgPSBga2V5ZG93biR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX01PVVNFRU5URVIkMSA9IGBtb3VzZWVudGVyJHtFVkVOVF9LRVkkOH1gO1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSQxID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWSQ4fWA7XG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZJDh9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkkMyA9IGBsb2FkJHtFVkVOVF9LRVkkOH0ke0RBVEFfQVBJX0tFWSQ1fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ1ID0gYGNsaWNrJHtFVkVOVF9LRVkkOH0ke0RBVEFfQVBJX0tFWSQ1fWA7XG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDIgPSAnYWN0aXZlJztcbmNvbnN0IENMQVNTX05BTUVfU0xJREUgPSAnc2xpZGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9FTkQgPSAnY2Fyb3VzZWwtaXRlbS1lbmQnO1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0JztcbmNvbnN0IENMQVNTX05BTUVfTkVYVCA9ICdjYXJvdXNlbC1pdGVtLW5leHQnO1xuY29uc3QgQ0xBU1NfTkFNRV9QUkVWID0gJ2Nhcm91c2VsLWl0ZW0tcHJldic7XG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkUgPSAnLmFjdGl2ZSc7XG5jb25zdCBTRUxFQ1RPUl9JVEVNID0gJy5jYXJvdXNlbC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTTtcbmNvbnN0IFNFTEVDVE9SX0lURU1fSU1HID0gJy5jYXJvdXNlbC1pdGVtIGltZyc7XG5jb25zdCBTRUxFQ1RPUl9JTkRJQ0FUT1JTID0gJy5jYXJvdXNlbC1pbmRpY2F0b3JzJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nO1xuY29uc3QgU0VMRUNUT1JfREFUQV9SSURFID0gJ1tkYXRhLWJzLXJpZGU9XCJjYXJvdXNlbFwiXSc7XG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVkkMV06IERJUkVDVElPTl9SSUdIVCxcbiAgW0FSUk9XX1JJR0hUX0tFWSQxXTogRElSRUNUSU9OX0xFRlRcbn07XG5jb25zdCBEZWZhdWx0JGIgPSB7XG4gIGludGVydmFsOiA1MDAwLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgcGF1c2U6ICdob3ZlcicsXG4gIHJpZGU6IGZhbHNlLFxuICB0b3VjaDogdHJ1ZSxcbiAgd3JhcDogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGIgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsXG4gIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ2Fyb3VzZWwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbnVsbDtcbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCRiO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJGI7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJGM7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKTtcbiAgfVxuICBuZXh0V2hlblZpc2libGUoKSB7XG4gICAgLy8gRklYTUUgVE9ETyB1c2UgYGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZWBcbiAgICAvLyBEb24ndCBjYWxsIG5leHQgd2hlbiB0aGUgcGFnZSBpc24ndCB2aXNpYmxlXG4gICAgLy8gb3IgdGhlIGNhcm91c2VsIG9yIGl0cyBwYXJlbnQgaXNuJ3QgdmlzaWJsZVxuICAgIGlmICghZG9jdW1lbnQuaGlkZGVuICYmIGlzVmlzaWJsZSh0aGlzLl9lbGVtZW50KSkge1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfVxuICB9XG4gIHByZXYoKSB7XG4gICAgdGhpcy5fc2xpZGUoT1JERVJfUFJFVik7XG4gIH1cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKTtcbiAgfVxuICBjeWNsZSgpIHtcbiAgICB0aGlzLl9jbGVhckludGVydmFsKCk7XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwoKTtcbiAgICB0aGlzLl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMubmV4dFdoZW5WaXNpYmxlKCksIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gIH1cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMuY3ljbGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3ljbGUoKTtcbiAgfVxuICB0byhpbmRleCkge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXMoKTtcbiAgICBpZiAoaW5kZXggPiBpdGVtcy5sZW5ndGggLSAxIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NMSUQsICgpID0+IHRoaXMudG8oaW5kZXgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgodGhpcy5fZ2V0QWN0aXZlKCkpO1xuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JkZXIgPSBpbmRleCA+IGFjdGl2ZUluZGV4ID8gT1JERVJfTkVYVCA6IE9SREVSX1BSRVY7XG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fc3dpcGVIZWxwZXIpIHtcbiAgICAgIHRoaXMuX3N3aXBlSGVscGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcuZGVmYXVsdEludGVydmFsID0gY29uZmlnLmludGVydmFsO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOJDEsIGV2ZW50ID0+IHRoaXMuX2tleWRvd24oZXZlbnQpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIkMSwgKCkgPT4gdGhpcy5wYXVzZSgpKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFJDEsICgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcudG91Y2ggJiYgU3dpcGUuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSk7XG4gICAgfVxuICAgIGNvbnN0IGVuZENhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSAhPT0gJ2hvdmVyJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIGlmICh0aGlzLnRvdWNoVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b3VjaFRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCk7XG4gICAgfTtcbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH07XG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBuZXcgU3dpcGUodGhpcy5fZWxlbWVudCwgc3dpcGVDb25maWcpO1xuICB9XG4gIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XTtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihkaXJlY3Rpb24pKTtcbiAgICB9XG4gIH1cbiAgX2dldEl0ZW1JbmRleChlbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1zKCkuaW5kZXhPZihlbGVtZW50KTtcbiAgfVxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkUsIHRoaXMuX2luZGljYXRvcnNFbGVtZW50KTtcbiAgICBhY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICBhY3RpdmVJbmRpY2F0b3IucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWN1cnJlbnQnKTtcbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpO1xuICAgIGlmIChuZXdBY3RpdmVJbmRpY2F0b3IpIHtcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDIpO1xuICAgICAgbmV3QWN0aXZlSW5kaWNhdG9yLnNldEF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50JywgJ3RydWUnKTtcbiAgICB9XG4gIH1cbiAgX3VwZGF0ZUludGVydmFsKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9hY3RpdmVFbGVtZW50IHx8IHRoaXMuX2dldEFjdGl2ZSgpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50SW50ZXJ2YWwgPSBOdW1iZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaW50ZXJ2YWwnKSwgMTApO1xuICAgIHRoaXMuX2NvbmZpZy5pbnRlcnZhbCA9IGVsZW1lbnRJbnRlcnZhbCB8fCB0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsO1xuICB9XG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9nZXRBY3RpdmUoKTtcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVDtcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGVsZW1lbnQgfHwgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQodGhpcy5fZ2V0SXRlbXMoKSwgYWN0aXZlRWxlbWVudCwgaXNOZXh0LCB0aGlzLl9jb25maWcud3JhcCk7XG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHRFbGVtZW50SW5kZXggPSB0aGlzLl9nZXRJdGVtSW5kZXgobmV4dEVsZW1lbnQpO1xuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IGV2ZW50TmFtZSA9PiB7XG4gICAgICByZXR1cm4gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgZXZlbnROYW1lLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IG5leHRFbGVtZW50LFxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX29yZGVyVG9EaXJlY3Rpb24ob3JkZXIpLFxuICAgICAgICBmcm9tOiB0aGlzLl9nZXRJdGVtSW5kZXgoYWN0aXZlRWxlbWVudCksXG4gICAgICAgIHRvOiBuZXh0RWxlbWVudEluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHNsaWRlRXZlbnQgPSB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJREUpO1xuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8ICFuZXh0RWxlbWVudCkge1xuICAgICAgLy8gU29tZSB3ZWlyZG5lc3MgaXMgaGFwcGVuaW5nLCBzbyB3ZSBiYWlsXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGVzdHMgdGhhdCB1c2UgZW1wdHkgZGl2cyB0byBhdm9pZCB0aGlzIGNoZWNrXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzQ3ljbGluZyA9IEJvb2xlYW4odGhpcy5faW50ZXJ2YWwpO1xuICAgIHRoaXMucGF1c2UoKTtcbiAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleCk7XG4gICAgdGhpcy5fYWN0aXZlRWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EO1xuICAgIGNvbnN0IG9yZGVyQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9ORVhUIDogQ0xBU1NfTkFNRV9QUkVWO1xuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpO1xuICAgIHJlZmxvdyhuZXh0RWxlbWVudCk7XG4gICAgYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbmFsQ2xhc3NOYW1lKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkaXJlY3Rpb25hbENsYXNzTmFtZSwgb3JkZXJDbGFzc05hbWUpO1xuICAgICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQyKTtcbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQyLCBvcmRlckNsYXNzTmFtZSwgZGlyZWN0aW9uYWxDbGFzc05hbWUpO1xuICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7XG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRCk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gICAgaWYgKGlzQ3ljbGluZykge1xuICAgICAgdGhpcy5jeWNsZSgpO1xuICAgIH1cbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TTElERSk7XG4gIH1cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudCk7XG4gIH1cbiAgX2dldEl0ZW1zKCkge1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU0sIHRoaXMuX2VsZW1lbnQpO1xuICB9XG4gIF9jbGVhckludGVydmFsKCkge1xuICAgIGlmICh0aGlzLl9pbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG4gICAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG4gIF9kaXJlY3Rpb25Ub09yZGVyKGRpcmVjdGlvbikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX1BSRVYgOiBPUkRFUl9ORVhUO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWO1xuICB9XG4gIF9vcmRlclRvRGlyZWN0aW9uKG9yZGVyKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fUklHSFQgOiBESVJFQ1RJT05fTEVGVDtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnbnVtYmVyJykge1xuICAgICAgICBkYXRhLnRvKGNvbmZpZyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJJDUsIFNFTEVDVE9SX0RBVEFfU0xJREUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpO1xuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBjb25zdCBjYXJvdXNlbCA9IENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KTtcbiAgY29uc3Qgc2xpZGVJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXNsaWRlLXRvJyk7XG4gIGlmIChzbGlkZUluZGV4KSB7XG4gICAgY2Fyb3VzZWwudG8oc2xpZGVJbmRleCk7XG4gICAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUodGhpcywgJ3NsaWRlJykgPT09ICduZXh0Jykge1xuICAgIGNhcm91c2VsLm5leHQoKTtcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjYXJvdXNlbC5wcmV2KCk7XG4gIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKCk7XG59KTtcbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMywgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSk7XG4gIGZvciAoY29uc3QgY2Fyb3VzZWwgb2YgY2Fyb3VzZWxzKSB7XG4gICAgQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZShjYXJvdXNlbCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDYXJvdXNlbCk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGIgPSAnY29sbGFwc2UnO1xuY29uc3QgREFUQV9LRVkkNyA9ICdicy5jb2xsYXBzZSc7XG5jb25zdCBFVkVOVF9LRVkkNyA9IGAuJHtEQVRBX0tFWSQ3fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkNCA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVZFTlRfU0hPVyQ2ID0gYHNob3cke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9TSE9XTiQ2ID0gYHNob3duJHtFVkVOVF9LRVkkN31gO1xuY29uc3QgRVZFTlRfSElERSQ2ID0gYGhpZGUke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNiA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ3fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQ0ID0gYGNsaWNrJHtFVkVOVF9LRVkkN30ke0RBVEFfQVBJX0tFWSQ0fWA7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNyA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0UgPSAnY29sbGFwc2UnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnO1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJztcbmNvbnN0IENMQVNTX05BTUVfREVFUEVSX0NISUxEUkVOID0gYDpzY29wZSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfSAuJHtDTEFTU19OQU1FX0NPTExBUFNFfWA7XG5jb25zdCBDTEFTU19OQU1FX0hPUklaT05UQUwgPSAnY29sbGFwc2UtaG9yaXpvbnRhbCc7XG5jb25zdCBXSURUSCA9ICd3aWR0aCc7XG5jb25zdCBIRUlHSFQgPSAnaGVpZ2h0JztcbmNvbnN0IFNFTEVDVE9SX0FDVElWRVMgPSAnLmNvbGxhcHNlLnNob3csIC5jb2xsYXBzZS5jb2xsYXBzaW5nJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIl0nO1xuY29uc3QgRGVmYXVsdCRhID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIHRvZ2dsZTogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJGEgPSB7XG4gIHBhcmVudDogJyhudWxsfGVsZW1lbnQpJyxcbiAgdG9nZ2xlOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIENvbGxhcHNlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gW107XG4gICAgY29uc3QgdG9nZ2xlTGlzdCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEUkNCk7XG4gICAgZm9yIChjb25zdCBlbGVtIG9mIHRvZ2dsZUxpc3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JFbmdpbmUuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKTtcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKS5maWx0ZXIoZm91bmRFbGVtZW50ID0+IGZvdW5kRWxlbWVudCA9PT0gdGhpcy5fZWxlbWVudCk7XG4gICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgZmlsdGVyRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpO1xuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwgdGhpcy5faXNTaG93bigpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b2dnbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkYTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSRhO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSRiO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGFjdGl2ZUNoaWxkcmVuID0gW107XG5cbiAgICAvLyBmaW5kIGFjdGl2ZSBjaGlsZHJlblxuICAgIGlmICh0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICBhY3RpdmVDaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkVTKS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KS5tYXAoZWxlbWVudCA9PiBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHtcbiAgICAgICAgdG9nZ2xlOiBmYWxzZVxuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoYWN0aXZlQ2hpbGRyZW4ubGVuZ3RoICYmIGFjdGl2ZUNoaWxkcmVuWzBdLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNik7XG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZS5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwO1xuICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRydWUpO1xuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVyQ3KTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNik7XG4gICAgfTtcbiAgICBjb25zdCBjYXBpdGFsaXplZERpbWVuc2lvbiA9IGRpbWVuc2lvblswXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKDEpO1xuICAgIGNvbnN0IHNjcm9sbFNpemUgPSBgc2Nyb2xsJHtjYXBpdGFsaXplZERpbWVuc2lvbn1gO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRydWUpO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV19cHhgO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDYpO1xuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gYCR7dGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkaW1lbnNpb25dfXB4YDtcbiAgICByZWZsb3codGhpcy5fZWxlbWVudCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVyQ3KTtcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdGhpcy5fdHJpZ2dlckFycmF5KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0cmlnZ2VyKTtcbiAgICAgIGlmIChlbGVtZW50ICYmICF0aGlzLl9pc1Nob3duKGVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbdHJpZ2dlcl0sIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4kNik7XG4gICAgfTtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKTtcbiAgfVxuICBfaXNTaG93bihlbGVtZW50ID0gdGhpcy5fZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1ckNyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuICAgIGNvbmZpZy5wYXJlbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5wYXJlbnQpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX2dldERpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9IT1JJWk9OVEFMKSA/IFdJRFRIIDogSEVJR0hUO1xuICB9XG4gIF9pbml0aWFsaXplQ2hpbGRyZW4oKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0RBVEFfVE9HR0xFJDQpO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBjaGlsZHJlbikge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbZWxlbWVudF0sIHRoaXMuX2lzU2hvd24oc2VsZWN0ZWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihzZWxlY3Rvcikge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gU2VsZWN0b3JFbmdpbmUuZmluZChDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiwgdGhpcy5fY29uZmlnLnBhcmVudCk7XG4gICAgLy8gcmVtb3ZlIGNoaWxkcmVuIGlmIGdyZWF0ZXIgZGVwdGhcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKGVsZW1lbnQgPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW1lbnQpKTtcbiAgfVxuICBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRyaWdnZXJBcnJheSwgaXNPcGVuKSB7XG4gICAgaWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FX0NPTExBUFNFRCwgIWlzT3Blbik7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3Blbik7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHt9O1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJyAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgIF9jb25maWcudG9nZ2xlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgX2NvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQ0LCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQ0LCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgLy8gcHJldmVudERlZmF1bHQgb25seSBmb3IgPGE+IGVsZW1lbnRzICh3aGljaCBjaGFuZ2UgdGhlIFVSTCkgbm90IGluc2lkZSB0aGUgY29sbGFwc2libGUgZWxlbWVudFxuICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdBJyB8fCBldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiBldmVudC5kZWxlZ2F0ZVRhcmdldC50YWdOYW1lID09PSAnQScpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5nZXRNdWx0aXBsZUVsZW1lbnRzRnJvbVNlbGVjdG9yKHRoaXMpKSB7XG4gICAgQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7XG4gICAgICB0b2dnbGU6IGZhbHNlXG4gICAgfSkudG9nZ2xlKCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDb2xsYXBzZSk7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBkcm9wZG93bi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJGEgPSAnZHJvcGRvd24nO1xuY29uc3QgREFUQV9LRVkkNiA9ICdicy5kcm9wZG93bic7XG5jb25zdCBFVkVOVF9LRVkkNiA9IGAuJHtEQVRBX0tFWSQ2fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMyA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVNDQVBFX0tFWSQyID0gJ0VzY2FwZSc7XG5jb25zdCBUQUJfS0VZJDEgPSAnVGFiJztcbmNvbnN0IEFSUk9XX1VQX0tFWSQxID0gJ0Fycm93VXAnO1xuY29uc3QgQVJST1dfRE9XTl9LRVkkMSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMjsgLy8gTW91c2VFdmVudC5idXR0b24gdmFsdWUgZm9yIHRoZSBzZWNvbmRhcnkgYnV0dG9uLCB1c3VhbGx5IHRoZSByaWdodCBidXR0b25cblxuY29uc3QgRVZFTlRfSElERSQ1ID0gYGhpZGUke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9ISURERU4kNSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9TSE9XJDUgPSBgc2hvdyR7RVZFTlRfS0VZJDZ9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDUgPSBgc2hvd24ke0VWRU5UX0tFWSQ2fWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSQzID0gYGNsaWNrJHtFVkVOVF9LRVkkNn0ke0RBVEFfQVBJX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJID0gYGtleWRvd24ke0VWRU5UX0tFWSQ2fSR7REFUQV9BUElfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gYGtleXVwJHtFVkVOVF9LRVkkNn0ke0RBVEFfQVBJX0tFWSQzfWA7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNiA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BFTkQgPSAnZHJvcGVuZCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BTVEFSVCA9ICdkcm9wc3RhcnQnO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSID0gJ2Ryb3B1cC1jZW50ZXInO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIgPSAnZHJvcGRvd24tY2VudGVyJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIl06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04gPSBgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzfS4ke0NMQVNTX05BTUVfU0hPVyQ2fWA7XG5jb25zdCBTRUxFQ1RPUl9NRU5VID0gJy5kcm9wZG93bi1tZW51JztcbmNvbnN0IFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJztcbmNvbnN0IFNFTEVDVE9SX05BVkJBUl9OQVYgPSAnLm5hdmJhci1uYXYnO1xuY29uc3QgU0VMRUNUT1JfVklTSUJMRV9JVEVNUyA9ICcuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSc7XG5jb25zdCBQTEFDRU1FTlRfVE9QID0gaXNSVEwoKSA/ICd0b3AtZW5kJyA6ICd0b3Atc3RhcnQnO1xuY29uc3QgUExBQ0VNRU5UX1RPUEVORCA9IGlzUlRMKCkgPyAndG9wLXN0YXJ0JyA6ICd0b3AtZW5kJztcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NRU5EID0gaXNSVEwoKSA/ICdib3R0b20tc3RhcnQnIDogJ2JvdHRvbS1lbmQnO1xuY29uc3QgUExBQ0VNRU5UX1JJR0hUID0gaXNSVEwoKSA/ICdsZWZ0LXN0YXJ0JyA6ICdyaWdodC1zdGFydCc7XG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnO1xuY29uc3QgUExBQ0VNRU5UX1RPUENFTlRFUiA9ICd0b3AnO1xuY29uc3QgUExBQ0VNRU5UX0JPVFRPTUNFTlRFUiA9ICdib3R0b20nO1xuY29uc3QgRGVmYXVsdCQ5ID0ge1xuICBhdXRvQ2xvc2U6IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICBvZmZzZXQ6IFswLCAyXSxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICByZWZlcmVuY2U6ICd0b2dnbGUnXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkOSA9IHtcbiAgYXV0b0Nsb3NlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGRpc3BsYXk6ICdzdHJpbmcnLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnR8b2JqZWN0KSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIERyb3Bkb3duIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB0aGlzLl9wYXJlbnQgPSB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGU7IC8vIGRyb3Bkb3duIHdyYXBwZXJcbiAgICAvLyBUT0RPOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjMvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHwgU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLl9lbGVtZW50LCBTRUxFQ1RPUl9NRU5VKVswXSB8fCBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01FTlUsIHRoaXMuX3BhcmVudCk7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDk7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkOTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkYTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24oKSA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KCk7XG4gIH1cbiAgc2hvdygpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9O1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNSwgcmVsYXRlZFRhcmdldCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NyZWF0ZVBvcHBlcigpO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICB0aGlzLl9tZW51LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNik7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNSwgcmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgfTtcbiAgICB0aGlzLl9jb21wbGV0ZUhpZGUocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKCk7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSQ1LCByZWxhdGVkVGFyZ2V0KTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XJDYpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJyk7XG4gICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOJDUsIHJlbGF0ZWRUYXJnZXQpO1xuICB9XG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gc3VwZXIuX2dldENvbmZpZyhjb25maWcpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudChjb25maWcucmVmZXJlbmNlKSAmJiB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUkYS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwicmVmZXJlbmNlXCIgcHJvdmlkZWQgdHlwZSBcIm9iamVjdFwiIHdpdGhvdXQgYSByZXF1aXJlZCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiIG1ldGhvZC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKTtcbiAgICB9XG4gICAgbGV0IHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuICAgIGlmICh0aGlzLl9jb25maWcucmVmZXJlbmNlID09PSAncGFyZW50Jykge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IHRoaXMuX3BhcmVudDtcbiAgICB9IGVsc2UgaWYgKGlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSkge1xuICAgICAgcmVmZXJlbmNlRWxlbWVudCA9IGdldEVsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlO1xuICAgIH1cbiAgICBjb25zdCBwb3BwZXJDb25maWcgPSB0aGlzLl9nZXRQb3BwZXJDb25maWcoKTtcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZyk7XG4gIH1cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVyQ2KTtcbiAgfVxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50O1xuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRU5EKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9SSUdIVDtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BTVEFSVCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfTEVGVDtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUjtcbiAgICB9XG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUikpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJztcbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFVQKSkge1xuICAgICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX1RPUEVORCA6IFBMQUNFTUVOVF9UT1A7XG4gICAgfVxuICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9CT1RUT01FTkQgOiBQTEFDRU1FTlRfQk9UVE9NO1xuICB9XG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsO1xuICB9XG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb2Zmc2V0XG4gICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvZmZzZXQuc3BsaXQoJywnKS5tYXAodmFsdWUgPT4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgY29uc3QgZGVmYXVsdEJzUG9wcGVyQ29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50OiB0aGlzLl9nZXRQbGFjZW1lbnQoKSxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcblxuICAgIC8vIERpc2FibGUgUG9wcGVyIGlmIHdlIGhhdmUgYSBzdGF0aWMgZGlzcGxheSBvciBEcm9wZG93biBpcyBpbiBOYXZiYXJcbiAgICBpZiAodGhpcy5faW5OYXZiYXIgfHwgdGhpcy5fY29uZmlnLmRpc3BsYXkgPT09ICdzdGF0aWMnKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKHRoaXMuX21lbnUsICdwb3BwZXInLCAnc3RhdGljJyk7IC8vIFRPRE86IHY2IHJlbW92ZVxuICAgICAgZGVmYXVsdEJzUG9wcGVyQ29uZmlnLm1vZGlmaWVycyA9IFt7XG4gICAgICAgIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZmF1bHRCc1BvcHBlckNvbmZpZyxcbiAgICAgIC4uLmV4ZWN1dGUodGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZywgW2RlZmF1bHRCc1BvcHBlckNvbmZpZ10pXG4gICAgfTtcbiAgfVxuICBfc2VsZWN0TWVudUl0ZW0oe1xuICAgIGtleSxcbiAgICB0YXJnZXRcbiAgfSkge1xuICAgIGNvbnN0IGl0ZW1zID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9WSVNJQkxFX0lURU1TLCB0aGlzLl9tZW51KS5maWx0ZXIoZWxlbWVudCA9PiBpc1Zpc2libGUoZWxlbWVudCkpO1xuICAgIGlmICghaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGFyZ2V0IGlzbid0IGluY2x1ZGVkIGluIGl0ZW1zIChlLmcuIHdoZW4gZXhwYW5kaW5nIHRoZSBkcm9wZG93bilcbiAgICAvLyBhbGxvdyBjeWNsaW5nIHRvIGdldCB0aGUgbGFzdCBpdGVtIGluIGNhc2Uga2V5IGVxdWFscyBBUlJPV19VUF9LRVlcbiAgICBnZXROZXh0QWN0aXZlRWxlbWVudChpdGVtcywgdGFyZ2V0LCBrZXkgPT09IEFSUk9XX0RPV05fS0VZJDEsICFpdGVtcy5pbmNsdWRlcyh0YXJnZXQpKS5mb2N1cygpO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGNsZWFyTWVudXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYnV0dG9uID09PSBSSUdIVF9NT1VTRV9CVVRUT04gfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgIT09IFRBQl9LRVkkMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcGVuVG9nZ2xlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04pO1xuICAgIGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKTtcbiAgICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpO1xuICAgICAgY29uc3QgaXNNZW51VGFyZ2V0ID0gY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX21lbnUpO1xuICAgICAgaWYgKGNvbXBvc2VkUGF0aC5pbmNsdWRlcyhjb250ZXh0Ll9lbGVtZW50KSB8fCBjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0IHx8IGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09ICdvdXRzaWRlJyAmJiBpc01lbnVUYXJnZXQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhYiBuYXZpZ2F0aW9uIHRocm91Z2ggdGhlIGRyb3Bkb3duIG1lbnUgb3IgZXZlbnRzIGZyb20gY29udGFpbmVkIGlucHV0cyBzaG91bGRuJ3QgY2xvc2UgdGhlIG1lbnVcbiAgICAgIGlmIChjb250ZXh0Ll9tZW51LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcgJiYgZXZlbnQua2V5ID09PSBUQUJfS0VZJDEgfHwgL2lucHV0fHNlbGVjdHxvcHRpb258dGV4dGFyZWF8Zm9ybS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IGNvbnRleHQuX2VsZW1lbnRcbiAgICAgIH07XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICByZWxhdGVkVGFyZ2V0LmNsaWNrRXZlbnQgPSBldmVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGRhdGFBcGlLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgIC8vIElmIG5vdCBhbiBVUCB8IERPV04gfCBFU0NBUEUga2V5ID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAvLyBJZiBpbnB1dC90ZXh0YXJlYSAmJiBpZiBrZXkgaXMgb3RoZXIgdGhhbiBFU0NBUEUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuXG4gICAgY29uc3QgaXNJbnB1dCA9IC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpO1xuICAgIGNvbnN0IGlzRXNjYXBlRXZlbnQgPSBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkkMjtcbiAgICBjb25zdCBpc1VwT3JEb3duRXZlbnQgPSBbQVJST1dfVVBfS0VZJDEsIEFSUk9XX0RPV05fS0VZJDFdLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgaWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzSW5wdXQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIFRPRE86IHY2IHJldmVydCAjMzcwMTEgJiBjaGFuZ2UgbWFya3VwIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMy9mb3Jtcy9pbnB1dC1ncm91cC9cbiAgICBjb25zdCBnZXRUb2dnbGVCdXR0b24gPSB0aGlzLm1hdGNoZXMoU0VMRUNUT1JfREFUQV9UT0dHTEUkMykgPyB0aGlzIDogU2VsZWN0b3JFbmdpbmUucHJldih0aGlzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzKVswXSB8fCBTZWxlY3RvckVuZ2luZS5uZXh0KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFJDMpWzBdIHx8IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfREFUQV9UT0dHTEUkMywgZXZlbnQuZGVsZWdhdGVUYXJnZXQucGFyZW50Tm9kZSk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBEcm9wZG93bi5nZXRPckNyZWF0ZUluc3RhbmNlKGdldFRvZ2dsZUJ1dHRvbik7XG4gICAgaWYgKGlzVXBPckRvd25FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UuX2lzU2hvd24oKSkge1xuICAgICAgLy8gZWxzZSBpcyBlc2NhcGUgYW5kIHdlIGNoZWNrIGlmIGl0IGlzIHNob3duXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICAgIGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJLCBTRUxFQ1RPUl9NRU5VLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBEcm9wZG93bi5jbGVhck1lbnVzKTtcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpO1xuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSQzLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQzLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS50b2dnbGUoKTtcbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihEcm9wZG93bik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2JhY2tkcm9wLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkOSA9ICdiYWNrZHJvcCc7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUkNCA9ICdmYWRlJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQ1ID0gJ3Nob3cnO1xuY29uc3QgRVZFTlRfTU9VU0VET1dOID0gYG1vdXNlZG93bi5icy4ke05BTUUkOX1gO1xuY29uc3QgRGVmYXVsdCQ4ID0ge1xuICBjbGFzc05hbWU6ICdtb2RhbC1iYWNrZHJvcCcsXG4gIGNsaWNrQ2FsbGJhY2s6IG51bGwsXG4gIGlzQW5pbWF0ZWQ6IGZhbHNlLFxuICBpc1Zpc2libGU6IHRydWUsXG4gIC8vIGlmIGZhbHNlLCB3ZSB1c2UgdGhlIGJhY2tkcm9wIGhlbHBlciB3aXRob3V0IGFkZGluZyBhbnkgZWxlbWVudCB0byB0aGUgZG9tXG4gIHJvb3RFbGVtZW50OiAnYm9keScgLy8gZ2l2ZSB0aGUgY2hvaWNlIHRvIHBsYWNlIGJhY2tkcm9wIHVuZGVyIGRpZmZlcmVudCBlbGVtZW50c1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDggPSB7XG4gIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gIGNsaWNrQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gIGlzVmlzaWJsZTogJ2Jvb2xlYW4nLFxuICByb290RWxlbWVudDogJyhlbGVtZW50fHN0cmluZyknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkODtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ4O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ5O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9hcHBlbmQoKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgcmVmbG93KGVsZW1lbnQpO1xuICAgIH1cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XJDUpO1xuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgaGlkZShjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2dldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ1KTtcbiAgICB0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgpID0+IHtcbiAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV04pO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0RWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lO1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICAgIGJhY2tkcm9wLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFJDQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudCA9IGJhY2tkcm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcbiAgfVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICBjb25maWcucm9vdEVsZW1lbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfYXBwZW5kKCkge1xuICAgIGlmICh0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KCk7XG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KTtcbiAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOLCAoKSA9PiB7XG4gICAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5jbGlja0NhbGxiYWNrKTtcbiAgICB9KTtcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gdHJ1ZTtcbiAgfVxuICBfZW11bGF0ZUFuaW1hdGlvbihjYWxsYmFjaykge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIHRoaXMuX2dldEVsZW1lbnQoKSwgdGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL2ZvY3VzdHJhcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDggPSAnZm9jdXN0cmFwJztcbmNvbnN0IERBVEFfS0VZJDUgPSAnYnMuZm9jdXN0cmFwJztcbmNvbnN0IEVWRU5UX0tFWSQ1ID0gYC4ke0RBVEFfS0VZJDV9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4kMiA9IGBmb2N1c2luJHtFVkVOVF9LRVkkNX1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWSQ1fWA7XG5jb25zdCBUQUJfS0VZID0gJ1RhYic7XG5jb25zdCBUQUJfTkFWX0ZPUldBUkQgPSAnZm9yd2FyZCc7XG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJztcbmNvbnN0IERlZmF1bHQkNyA9IHtcbiAgYXV0b2ZvY3VzOiB0cnVlLFxuICB0cmFwRWxlbWVudDogbnVsbCAvLyBUaGUgZWxlbWVudCB0byB0cmFwIGZvY3VzIGluc2lkZSBvZlxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDcgPSB7XG4gIGF1dG9mb2N1czogJ2Jvb2xlYW4nLFxuICB0cmFwRWxlbWVudDogJ2VsZW1lbnQnXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGw7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ3O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDc7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDg7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZJDUpOyAvLyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGZvY3VzIGxvb3BcbiAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0ZPQ1VTSU4kMiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlRm9jdXNpbihldmVudCkpO1xuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfS0VZRE9XTl9UQUIsIGV2ZW50ID0+IHRoaXMuX2hhbmRsZUtleWRvd24oZXZlbnQpKTtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gIH1cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgRXZlbnRIYW5kbGVyLm9mZihkb2N1bWVudCwgRVZFTlRfS0VZJDUpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyYXBFbGVtZW50XG4gICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBkb2N1bWVudCB8fCBldmVudC50YXJnZXQgPT09IHRyYXBFbGVtZW50IHx8IHRyYXBFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5mb2N1c2FibGVDaGlsZHJlbih0cmFwRWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPT09IFRBQl9OQVZfQkFDS1dBUkQpIHtcbiAgICAgIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRzWzBdLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gVEFCX0tFWSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0VGFiTmF2RGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXkgPyBUQUJfTkFWX0JBQ0tXQVJEIDogVEFCX05BVl9GT1JXQVJEO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCB1dGlsL3Njcm9sbEJhci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuY29uc3QgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnO1xuY29uc3QgUFJPUEVSVFlfUEFERElORyA9ICdwYWRkaW5nLXJpZ2h0JztcbmNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnO1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxCYXJIZWxwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBnZXRXaWR0aCgpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2lubmVyV2lkdGgjdXNhZ2Vfbm90ZXNcbiAgICBjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgdGhpcy5fZGlzYWJsZU92ZXJGbG93KCk7XG4gICAgLy8gZ2l2ZSBwYWRkaW5nIHRvIGVsZW1lbnQgdG8gYmFsYW5jZSB0aGUgaGlkZGVuIHNjcm9sbGJhciB3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgLy8gdHJpY2s6IFdlIGFkanVzdCBwb3NpdGl2ZSBwYWRkaW5nUmlnaHQgYW5kIG5lZ2F0aXZlIG1hcmdpblJpZ2h0IHRvIHN0aWNreS10b3AgZWxlbWVudHMgdG8ga2VlcCBzaG93aW5nIGZ1bGx3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKTtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HKTtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pO1xuICB9XG4gIGlzT3ZlcmZsb3dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDA7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUodGhpcy5fZWxlbWVudCwgJ292ZXJmbG93Jyk7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICB9XG4gIF9zZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuZ2V0V2lkdGgoKTtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQgJiYgd2luZG93LmlubmVyV2lkdGggPiBlbGVtZW50LmNsaWVudFdpZHRoICsgc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSk7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkVmFsdWUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApO1xuICAgIH07XG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spO1xuICB9XG4gIF9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSk7XG4gICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHksIGFjdHVhbFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoc2VsZWN0b3IsIHN0eWxlUHJvcGVydHkpIHtcbiAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvcGVydHkgaWYgdGhlIHZhbHVlIGlzIGBudWxsYDsgdGhlIHZhbHVlIGNhbiBhbHNvIGJlIHplcm9cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCB2YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjayk7XG4gIH1cbiAgX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxCYWNrKSB7XG4gICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxCYWNrKHNlbGVjdG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWwgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGNhbGxCYWNrKHNlbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBtb2RhbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDcgPSAnbW9kYWwnO1xuY29uc3QgREFUQV9LRVkkNCA9ICdicy5tb2RhbCc7XG5jb25zdCBFVkVOVF9LRVkkNCA9IGAuJHtEQVRBX0tFWSQ0fWA7XG5jb25zdCBEQVRBX0FQSV9LRVkkMiA9ICcuZGF0YS1hcGknO1xuY29uc3QgRVNDQVBFX0tFWSQxID0gJ0VzY2FwZSc7XG5jb25zdCBFVkVOVF9ISURFJDQgPSBgaGlkZSR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEJDEgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0hJRERFTiQ0ID0gYGhpZGRlbiR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1NIT1ckNCA9IGBzaG93JHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfU0hPV04kNCA9IGBzaG93biR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX1JFU0laRSQxID0gYHJlc2l6ZSR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX0NMSUNLX0RJU01JU1MgPSBgY2xpY2suZGlzbWlzcyR7RVZFTlRfS0VZJDR9YDtcbmNvbnN0IEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gYG1vdXNlZG93bi5kaXNtaXNzJHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTJDEgPSBga2V5ZG93bi5kaXNtaXNzJHtFVkVOVF9LRVkkNH1gO1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiA9IGBjbGljayR7RVZFTlRfS0VZJDR9JHtEQVRBX0FQSV9LRVkkMn1gO1xuY29uc3QgQ0xBU1NfTkFNRV9PUEVOID0gJ21vZGFsLW9wZW4nO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDMgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckNCA9ICdzaG93JztcbmNvbnN0IENMQVNTX05BTUVfU1RBVElDID0gJ21vZGFsLXN0YXRpYyc7XG5jb25zdCBPUEVOX1NFTEVDVE9SJDEgPSAnLm1vZGFsLnNob3cnO1xuY29uc3QgU0VMRUNUT1JfRElBTE9HID0gJy5tb2RhbC1kaWFsb2cnO1xuY29uc3QgU0VMRUNUT1JfTU9EQUxfQk9EWSA9ICcubW9kYWwtYm9keSc7XG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSQyID0gJ1tkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCJdJztcbmNvbnN0IERlZmF1bHQkNiA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGZvY3VzOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZVxufTtcbmNvbnN0IERlZmF1bHRUeXBlJDYgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGZvY3VzOiAnYm9vbGVhbicsXG4gIGtleWJvYXJkOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgdGhpcy5fZGlhbG9nID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9ESUFMT0csIHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKCk7XG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDY7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkNjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkNztcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gIH1cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1ckNCwge1xuICAgICAgcmVsYXRlZFRhcmdldFxuICAgIH0pO1xuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKCk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfT1BFTik7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygoKSA9PiB0aGlzLl9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSk7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUkNCk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCk7XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQ0KTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2hpZGVNb2RhbCgpLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9mZih3aW5kb3csIEVWRU5UX0tFWSQ0KTtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2RpYWxvZywgRVZFTlRfS0VZJDQpO1xuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgcmV0dXJuIG5ldyBCYWNrZHJvcCh7XG4gICAgICBpc1Zpc2libGU6IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKSxcbiAgICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRoaXMuX2lzQW5pbWF0ZWQoKVxuICAgIH0pO1xuICB9XG4gIF9pbml0aWFsaXplRm9jdXNUcmFwKCkge1xuICAgIHJldHVybiBuZXcgRm9jdXNUcmFwKHtcbiAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAvLyB0cnkgdG8gYXBwZW5kIGR5bmFtaWMgbW9kYWxcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG4gICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIGNvbnN0IG1vZGFsQm9keSA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTU9EQUxfQk9EWSwgdGhpcy5fZGlhbG9nKTtcbiAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckNCk7XG4gICAgY29uc3QgdHJhbnNpdGlvbkNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04kNCwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2sodHJhbnNpdGlvbkNvbXBsZXRlLCB0aGlzLl9kaWFsb2csIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gIH1cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MkMSwgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSQxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKTtcbiAgICB9KTtcbiAgICBFdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUkMSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgIXRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIC8vIGEgYmFkIHRyaWNrIHRvIHNlZ3JlZ2F0ZSBjbGlja3MgdGhhdCBtYXkgc3RhcnQgaW5zaWRlIGRpYWxvZyBidXQgZW5kIG91dHNpZGUsIGFuZCBhdm9pZCBsaXN0ZW4gdG8gc2Nyb2xsYmFyIGNsaWNrc1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9DTElDS19ESVNNSVNTLCBldmVudDIgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgX2hpZGVNb2RhbCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKTtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpO1xuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfT1BFTik7XG4gICAgICB0aGlzLl9yZXNldEFkanVzdG1lbnRzKCk7XG4gICAgICB0aGlzLl9zY3JvbGxCYXIucmVzZXQoKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQ0KTtcbiAgICB9KTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDMpO1xuICB9XG4gIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEJDEpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgaW5pdGlhbE92ZXJmbG93WSA9IHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZO1xuICAgIC8vIHJldHVybiBpZiB0aGUgZm9sbG93aW5nIGJhY2tncm91bmQgdHJhbnNpdGlvbiBoYXNuJ3QgeWV0IGNvbXBsZXRlZFxuICAgIGlmIChpbml0aWFsT3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NUQVRJQykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpO1xuICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gaW5pdGlhbE92ZXJmbG93WTtcbiAgICAgIH0sIHRoaXMuX2RpYWxvZyk7XG4gICAgfSwgdGhpcy5fZGlhbG9nKTtcbiAgICB0aGlzLl9lbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICovXG5cbiAgX2FkanVzdERpYWxvZygpIHtcbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl9zY3JvbGxCYXIuZ2V0V2lkdGgoKTtcbiAgICBjb25zdCBpc0JvZHlPdmVyZmxvd2luZyA9IHNjcm9sbGJhcldpZHRoID4gMDtcbiAgICBpZiAoaXNCb2R5T3ZlcmZsb3dpbmcgJiYgIWlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSBpc1JUTCgpID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgfVxuICAgIGlmICghaXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IGlzUlRMKCkgPyAncGFkZGluZ1JpZ2h0JyA6ICdwYWRkaW5nTGVmdCc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGAke3Njcm9sbGJhcldpZHRofXB4YDtcbiAgICB9XG4gIH1cbiAgX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdCA9ICcnO1xuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJyc7XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10ocmVsYXRlZFRhcmdldCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMiwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9TSE9XJDQsIHNob3dFdmVudCA9PiB7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4kNCwgKCkgPT4ge1xuICAgICAgaWYgKGlzVmlzaWJsZSh0aGlzKSkge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGF2b2lkIGNvbmZsaWN0IHdoZW4gY2xpY2tpbmcgbW9kYWwgdG9nZ2xlciB3aGlsZSBhbm90aGVyIG9uZSBpcyBvcGVuXG4gIGNvbnN0IGFscmVhZHlPcGVuID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShPUEVOX1NFTEVDVE9SJDEpO1xuICBpZiAoYWxyZWFkeU9wZW4pIHtcbiAgICBNb2RhbC5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpO1xuICB9XG4gIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gIGRhdGEudG9nZ2xlKHRoaXMpO1xufSk7XG5lbmFibGVEaXNtaXNzVHJpZ2dlcihNb2RhbCk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKTtcblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIG9mZmNhbnZhcy5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDYgPSAnb2ZmY2FudmFzJztcbmNvbnN0IERBVEFfS0VZJDMgPSAnYnMub2ZmY2FudmFzJztcbmNvbnN0IEVWRU5UX0tFWSQzID0gYC4ke0RBVEFfS0VZJDN9YDtcbmNvbnN0IERBVEFfQVBJX0tFWSQxID0gJy5kYXRhLWFwaSc7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDIgPSBgbG9hZCR7RVZFTlRfS0VZJDN9JHtEQVRBX0FQSV9LRVkkMX1gO1xuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnO1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XJDMgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkckMSA9ICdzaG93aW5nJztcbmNvbnN0IENMQVNTX05BTUVfSElESU5HID0gJ2hpZGluZyc7XG5jb25zdCBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ29mZmNhbnZhcy1iYWNrZHJvcCc7XG5jb25zdCBPUEVOX1NFTEVDVE9SID0gJy5vZmZjYW52YXMuc2hvdyc7XG5jb25zdCBFVkVOVF9TSE9XJDMgPSBgc2hvdyR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDMgPSBgc2hvd24ke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURFJDMgPSBgaGlkZSR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMyA9IGBoaWRkZW4ke0VWRU5UX0tFWSQzfWA7XG5jb25zdCBFVkVOVF9SRVNJWkUgPSBgcmVzaXplJHtFVkVOVF9LRVkkM31gO1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSA9IGBjbGljayR7RVZFTlRfS0VZJDN9JHtEQVRBX0FQSV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZJDN9YDtcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFJDEgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJztcbmNvbnN0IERlZmF1bHQkNSA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBzY3JvbGw6IGZhbHNlXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkNSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgc2Nyb2xsOiAnYm9vbGVhbidcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE9mZmNhbnZhcyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpO1xuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKTtcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkNTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQ1O1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQ2O1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgfVxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XJDMsIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNTaG93biA9IHRydWU7XG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygpO1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKTtcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XSU5HJDEpO1xuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwgfHwgdGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQzKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkckMSk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTiQzLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxCYWNrLCB0aGlzLl9lbGVtZW50LCB0cnVlKTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFJDMpO1xuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpO1xuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpO1xuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURJTkcpO1xuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKTtcbiAgICBjb25zdCBjb21wbGV0ZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQzLCBDTEFTU19OQU1FX0hJRElORyk7XG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgICBuZXcgU2Nyb2xsQmFySGVscGVyKCkucmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTiQzKTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSk7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKCk7XG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgY29uc3QgY2xpY2tDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfTtcblxuICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZVxuICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKTtcbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGNsYXNzTmFtZTogQ0xBU1NfTkFNRV9CQUNLRFJPUCxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRydWUsXG4gICAgICByb290RWxlbWVudDogdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgY2xpY2tDYWxsYmFjazogaXNWaXNpYmxlID8gY2xpY2tDYWxsYmFjayA6IG51bGxcbiAgICB9KTtcbiAgfVxuICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICB0cmFwRWxlbWVudDogdGhpcy5fZWxlbWVudFxuICAgIH0pO1xuICB9XG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSBFU0NBUEVfS0VZKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZyk7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICB9XG4gICAgICBkYXRhW2NvbmZpZ10odGhpcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEkkMSwgU0VMRUNUT1JfREFUQV9UT0dHTEUkMSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIEV2ZW50SGFuZGxlci5vbmUodGFyZ2V0LCBFVkVOVF9ISURERU4kMywgKCkgPT4ge1xuICAgIC8vIGZvY3VzIG9uIHRyaWdnZXIgd2hlbiBpdCBpcyBjbG9zZWRcbiAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUik7XG4gIGlmIChhbHJlYWR5T3BlbiAmJiBhbHJlYWR5T3BlbiAhPT0gdGFyZ2V0KSB7XG4gICAgT2ZmY2FudmFzLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKCk7XG4gIH1cbiAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldCk7XG4gIGRhdGEudG9nZ2xlKHRoaXMpO1xufSk7XG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJJDIsICgpID0+IHtcbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpKSB7XG4gICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2Uoc2VsZWN0b3IpLnNob3coKTtcbiAgfVxufSk7XG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoJ1thcmlhLW1vZGFsXVtjbGFzcyo9c2hvd11bY2xhc3MqPW9mZmNhbnZhcy1dJykpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCkuaGlkZSgpO1xuICAgIH1cbiAgfVxufSk7XG5lbmFibGVEaXNtaXNzVHJpZ2dlcihPZmZjYW52YXMpO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihPZmZjYW52YXMpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC9zYW5pdGl6ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vLyBqcy1kb2NzLXN0YXJ0IGFsbG93LWxpc3RcbmNvbnN0IEFSSUFfQVRUUklCVVRFX1BBVFRFUk4gPSAvXmFyaWEtW1xcdy1dKiQvaTtcbmNvbnN0IERlZmF1bHRBbGxvd2xpc3QgPSB7XG4gIC8vIEdsb2JhbCBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gYW55IHN1cHBsaWVkIGVsZW1lbnQgYmVsb3cuXG4gICcqJzogWydjbGFzcycsICdkaXInLCAnaWQnLCAnbGFuZycsICdyb2xlJywgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTl0sXG4gIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gIGFyZWE6IFtdLFxuICBiOiBbXSxcbiAgYnI6IFtdLFxuICBjb2w6IFtdLFxuICBjb2RlOiBbXSxcbiAgZGQ6IFtdLFxuICBkaXY6IFtdLFxuICBkbDogW10sXG4gIGR0OiBbXSxcbiAgZW06IFtdLFxuICBocjogW10sXG4gIGgxOiBbXSxcbiAgaDI6IFtdLFxuICBoMzogW10sXG4gIGg0OiBbXSxcbiAgaDU6IFtdLFxuICBoNjogW10sXG4gIGk6IFtdLFxuICBpbWc6IFsnc3JjJywgJ3NyY3NldCcsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIGxpOiBbXSxcbiAgb2w6IFtdLFxuICBwOiBbXSxcbiAgcHJlOiBbXSxcbiAgczogW10sXG4gIHNtYWxsOiBbXSxcbiAgc3BhbjogW10sXG4gIHN1YjogW10sXG4gIHN1cDogW10sXG4gIHN0cm9uZzogW10sXG4gIHU6IFtdLFxuICB1bDogW11cbn07XG4vLyBqcy1kb2NzLWVuZCBhbGxvdy1saXN0XG5cbmNvbnN0IHVyaUF0dHJpYnV0ZXMgPSBuZXcgU2V0KFsnYmFja2dyb3VuZCcsICdjaXRlJywgJ2hyZWYnLCAnaXRlbXR5cGUnLCAnbG9uZ2Rlc2MnLCAncG9zdGVyJywgJ3NyYycsICd4bGluazpocmVmJ10pO1xuXG4vKipcbiAqIEEgcGF0dGVybiB0aGF0IHJlY29nbml6ZXMgVVJMcyB0aGF0IGFyZSBzYWZlIHdydC4gWFNTIGluIFVSTCBuYXZpZ2F0aW9uXG4gKiBjb250ZXh0cy5cbiAqXG4gKiBTaG91dC1vdXQgdG8gQW5ndWxhciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvMTUuMi44L3BhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi91cmxfc2FuaXRpemVyLnRzI0wzOFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9iZXR0ZXItcmVnZXhcbmNvbnN0IFNBRkVfVVJMX1BBVFRFUk4gPSAvXig/IWphdmFzY3JpcHQ6KSg/OlthLXowLTkrLi1dKzp8W14mOi8/I10qKD86Wy8/I118JCkpL2k7XG5jb25zdCBhbGxvd2VkQXR0cmlidXRlID0gKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZUxpc3QpID0+IHtcbiAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoYWxsb3dlZEF0dHJpYnV0ZUxpc3QuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICBpZiAodXJpQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKFNBRkVfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGVzIHRoZSBhdHRyaWJ1dGUuXG4gIHJldHVybiBhbGxvd2VkQXR0cmlidXRlTGlzdC5maWx0ZXIoYXR0cmlidXRlUmVnZXggPT4gYXR0cmlidXRlUmVnZXggaW5zdGFuY2VvZiBSZWdFeHApLnNvbWUocmVnZXggPT4gcmVnZXgudGVzdChhdHRyaWJ1dGVOYW1lKSk7XG59O1xuZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWwsIGFsbG93TGlzdCwgc2FuaXRpemVGdW5jdGlvbikge1xuICBpZiAoIXVuc2FmZUh0bWwubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuc2FmZUh0bWw7XG4gIH1cbiAgaWYgKHNhbml0aXplRnVuY3Rpb24gJiYgdHlwZW9mIHNhbml0aXplRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FuaXRpemVGdW5jdGlvbih1bnNhZmVIdG1sKTtcbiAgfVxuICBjb25zdCBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuICBjb25zdCBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgY29uc3QgZWxlbWVudHMgPSBbXS5jb25jYXQoLi4uY3JlYXRlZERvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpKTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbGxvd0xpc3QpLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVMaXN0ID0gW10uY29uY2F0KC4uLmVsZW1lbnQuYXR0cmlidXRlcyk7XG4gICAgY29uc3QgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXS5jb25jYXQoYWxsb3dMaXN0WycqJ10gfHwgW10sIGFsbG93TGlzdFtlbGVtZW50TmFtZV0gfHwgW10pO1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUxpc3QpIHtcbiAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubm9kZU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY3JlYXRlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MO1xufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdXRpbC90ZW1wbGF0ZS1mYWN0b3J5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkNSA9ICdUZW1wbGF0ZUZhY3RvcnknO1xuY29uc3QgRGVmYXVsdCQ0ID0ge1xuICBhbGxvd0xpc3Q6IERlZmF1bHRBbGxvd2xpc3QsXG4gIGNvbnRlbnQ6IHt9LFxuICAvLyB7IHNlbGVjdG9yIDogdGV4dCAsICBzZWxlY3RvcjIgOiB0ZXh0MiAsIH1cbiAgZXh0cmFDbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBzYW5pdGl6ZTogdHJ1ZSxcbiAgc2FuaXRpemVGbjogbnVsbCxcbiAgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2Pidcbn07XG5jb25zdCBEZWZhdWx0VHlwZSQ0ID0ge1xuICBhbGxvd0xpc3Q6ICdvYmplY3QnLFxuICBjb250ZW50OiAnb2JqZWN0JyxcbiAgZXh0cmFDbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgaHRtbDogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnXG59O1xuY29uc3QgRGVmYXVsdENvbnRlbnRUeXBlID0ge1xuICBlbnRyeTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKScsXG4gIHNlbGVjdG9yOiAnKHN0cmluZ3xlbGVtZW50KSdcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRlbXBsYXRlRmFjdG9yeSBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQ0O1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDQ7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9jb25maWcuY29udGVudCkubWFwKGNvbmZpZyA9PiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihjb25maWcpKS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cbiAgaGFzQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoID4gMDtcbiAgfVxuICBjaGFuZ2VDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgdGhpcy5fY29uZmlnLmNvbnRlbnQgPSB7XG4gICAgICAuLi50aGlzLl9jb25maWcuY29udGVudCxcbiAgICAgIC4uLmNvbnRlbnRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRvSHRtbCgpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0ZW1wbGF0ZVdyYXBwZXIuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZSh0aGlzLl9jb25maWcudGVtcGxhdGUpO1xuICAgIGZvciAoY29uc3QgW3NlbGVjdG9yLCB0ZXh0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcuY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3NldENvbnRlbnQodGVtcGxhdGVXcmFwcGVyLCB0ZXh0LCBzZWxlY3Rvcik7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVXcmFwcGVyLmNoaWxkcmVuWzBdO1xuICAgIGNvbnN0IGV4dHJhQ2xhc3MgPSB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuZXh0cmFDbGFzcyk7XG4gICAgaWYgKGV4dHJhQ2xhc3MpIHtcbiAgICAgIHRlbXBsYXRlLmNsYXNzTGlzdC5hZGQoLi4uZXh0cmFDbGFzcy5zcGxpdCgnICcpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZykge1xuICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29uZmlnLmNvbnRlbnQpO1xuICB9XG4gIF9jaGVja0NvbnRlbnQoYXJnKSB7XG4gICAgZm9yIChjb25zdCBbc2VsZWN0b3IsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGFyZykpIHtcbiAgICAgIHN1cGVyLl90eXBlQ2hlY2tDb25maWcoe1xuICAgICAgICBzZWxlY3RvcixcbiAgICAgICAgZW50cnk6IGNvbnRlbnRcbiAgICAgIH0sIERlZmF1bHRDb250ZW50VHlwZSk7XG4gICAgfVxuICB9XG4gIF9zZXRDb250ZW50KHRlbXBsYXRlLCBjb250ZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIHRlbXBsYXRlKTtcbiAgICBpZiAoIXRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb250ZW50ID0gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oY29udGVudCk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQoY29udGVudCkpIHtcbiAgICAgIHRoaXMuX3B1dEVsZW1lbnRJblRlbXBsYXRlKGdldEVsZW1lbnQoY29udGVudCksIHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25maWcuaHRtbCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX21heWJlU2FuaXRpemUoY29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gIH1cbiAgX21heWJlU2FuaXRpemUoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSA/IHNhbml0aXplSHRtbChhcmcsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKSA6IGFyZztcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpc10pO1xuICB9XG4gIF9wdXRFbGVtZW50SW5UZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmh0bWwpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwIHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQ0ID0gJ3Rvb2x0aXAnO1xuY29uc3QgRElTQUxMT1dFRF9BVFRSSUJVVEVTID0gbmV3IFNldChbJ3Nhbml0aXplJywgJ2FsbG93TGlzdCcsICdzYW5pdGl6ZUZuJ10pO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDIgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX01PREFMID0gJ21vZGFsJztcbmNvbnN0IENMQVNTX05BTUVfU0hPVyQyID0gJ3Nob3cnO1xuY29uc3QgU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiA9ICcudG9vbHRpcC1pbm5lcic7XG5jb25zdCBTRUxFQ1RPUl9NT0RBTCA9IGAuJHtDTEFTU19OQU1FX01PREFMfWA7XG5jb25zdCBFVkVOVF9NT0RBTF9ISURFID0gJ2hpZGUuYnMubW9kYWwnO1xuY29uc3QgVFJJR0dFUl9IT1ZFUiA9ICdob3Zlcic7XG5jb25zdCBUUklHR0VSX0ZPQ1VTID0gJ2ZvY3VzJztcbmNvbnN0IFRSSUdHRVJfQ0xJQ0sgPSAnY2xpY2snO1xuY29uc3QgVFJJR0dFUl9NQU5VQUwgPSAnbWFudWFsJztcbmNvbnN0IEVWRU5UX0hJREUkMiA9ICdoaWRlJztcbmNvbnN0IEVWRU5UX0hJRERFTiQyID0gJ2hpZGRlbic7XG5jb25zdCBFVkVOVF9TSE9XJDIgPSAnc2hvdyc7XG5jb25zdCBFVkVOVF9TSE9XTiQyID0gJ3Nob3duJztcbmNvbnN0IEVWRU5UX0lOU0VSVEVEID0gJ2luc2VydGVkJztcbmNvbnN0IEVWRU5UX0NMSUNLJDEgPSAnY2xpY2snO1xuY29uc3QgRVZFTlRfRk9DVVNJTiQxID0gJ2ZvY3VzaW4nO1xuY29uc3QgRVZFTlRfRk9DVVNPVVQkMSA9ICdmb2N1c291dCc7XG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gJ21vdXNlZW50ZXInO1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSA9ICdtb3VzZWxlYXZlJztcbmNvbnN0IEF0dGFjaG1lbnRNYXAgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgVE9QOiAndG9wJyxcbiAgUklHSFQ6IGlzUlRMKCkgPyAnbGVmdCcgOiAncmlnaHQnLFxuICBCT1RUT006ICdib3R0b20nLFxuICBMRUZUOiBpc1JUTCgpID8gJ3JpZ2h0JyA6ICdsZWZ0J1xufTtcbmNvbnN0IERlZmF1bHQkMyA9IHtcbiAgYWxsb3dMaXN0OiBEZWZhdWx0QWxsb3dsaXN0LFxuICBhbmltYXRpb246IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgY29udGFpbmVyOiBmYWxzZSxcbiAgY3VzdG9tQ2xhc3M6ICcnLFxuICBkZWxheTogMCxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLFxuICBodG1sOiBmYWxzZSxcbiAgb2Zmc2V0OiBbMCwgNl0sXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgc2FuaXRpemU6IHRydWUsXG4gIHNhbml0aXplRm46IG51bGwsXG4gIHNlbGVjdG9yOiBmYWxzZSxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PicgKyAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj4nICsgJzwvZGl2PicsXG4gIHRpdGxlOiAnJyxcbiAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDMgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICBjb250YWluZXI6ICcoc3RyaW5nfGVsZW1lbnR8Ym9vbGVhbiknLFxuICBjdXN0b21DbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgZGVsYXk6ICcobnVtYmVyfG9iamVjdCknLFxuICBmYWxsYmFja1BsYWNlbWVudHM6ICdhcnJheScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgb2Zmc2V0OiAnKGFycmF5fHN0cmluZ3xmdW5jdGlvbiknLFxuICBwbGFjZW1lbnQ6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnLFxuICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICB0cmlnZ2VyOiAnc3RyaW5nJ1xufTtcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9vbHRpcCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgdG9vbHRpcHMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKTtcbiAgICB9XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX3RpbWVvdXQgPSAwO1xuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGw7XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IHt9O1xuICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbnVsbDtcbiAgICB0aGlzLl9uZXdDb250ZW50ID0gbnVsbDtcblxuICAgIC8vIFByb3RlY3RlZFxuICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKTtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdCQzO1xuICB9XG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlJDM7XG4gIH1cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FJDQ7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gIH1cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWQ7XG4gIH1cbiAgdG9nZ2xlKCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljaztcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9sZWF2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9lbnRlcigpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcik7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgfVxuICAgIGlmICghKHRoaXMuX2lzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1ckMikpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdCh0aGlzLl9lbGVtZW50KTtcbiAgICBjb25zdCBpc0luVGhlRG9tID0gKHNoYWRvd1Jvb3QgfHwgdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudCk7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVE9ETzogdjYgcmVtb3ZlIHRoaXMgb3IgbWFrZSBpdCBvcHRpb25hbFxuICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKTtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KCk7XG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXJcbiAgICB9ID0gdGhpcy5fY29uZmlnO1xuICAgIGlmICghdGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmQodGlwKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0lOU0VSVEVEKSk7XG4gICAgfVxuICAgIHRoaXMuX3BvcHBlciA9IHRoaXMuX2NyZWF0ZVBvcHBlcih0aXApO1xuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVyQyKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1dOJDIpKTtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSQyKSk7XG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKTtcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1ckMik7XG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlVHJpZ2dlcltUUklHR0VSX0NMSUNLXSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyW1RSSUdHRVJfSE9WRVJdID0gZmFsc2U7XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gbnVsbDsgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0hJRERFTiQyKSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb3RlY3RlZFxuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKTtcbiAgfVxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRpcDtcbiAgfVxuICBfY3JlYXRlVGlwRWxlbWVudChjb250ZW50KSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpLnRvSHRtbCgpO1xuXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY2hlY2sgaW4gdjZcbiAgICBpZiAoIXRpcCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSQyLCBDTEFTU19OQU1FX1NIT1ckMik7XG4gICAgLy8gVE9ETzogdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApO1xuICAgIGNvbnN0IHRpcElkID0gZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSkudG9TdHJpbmcoKTtcbiAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUkMik7XG4gICAgfVxuICAgIHJldHVybiB0aXA7XG4gIH1cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpO1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeS5jaGFuZ2VDb250ZW50KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUZhY3RvcnkgPSBuZXcgVGVtcGxhdGVGYWN0b3J5KHtcbiAgICAgICAgLi4udGhpcy5fY29uZmlnLFxuICAgICAgICAvLyB0aGUgYGNvbnRlbnRgIHZhciBoYXMgdG8gYmUgYWZ0ZXIgYHRoaXMuX2NvbmZpZ2BcbiAgICAgICAgLy8gdG8gb3ZlcnJpZGUgY29uZmlnLmNvbnRlbnQgaW4gY2FzZSBvZiBwb3BvdmVyXG4gICAgICAgIGNvbnRlbnQsXG4gICAgICAgIGV4dHJhQ2xhc3M6IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcylcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVGYWN0b3J5O1xuICB9XG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH07XG4gIH1cbiAgX2dldFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcudGl0bGUpIHx8IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJyk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgfVxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFJDIpO1xuICB9XG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLnRpcCAmJiB0aGlzLnRpcC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XJDIpO1xuICB9XG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gZXhlY3V0ZSh0aGlzLl9jb25maWcucGxhY2VtZW50LCBbdGhpcywgdGlwLCB0aGlzLl9lbGVtZW50XSk7XG4gICAgY29uc3QgYXR0YWNobWVudCA9IEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIHJldHVybiBQb3BwZXIuY3JlYXRlUG9wcGVyKHRoaXMuX2VsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKTtcbiAgfVxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFxuICAgIH0gPSB0aGlzLl9jb25maWc7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGUoYXJnLCBbdGhpcy5fZWxlbWVudF0pO1xuICB9XG4gIF9nZXRQb3BwZXJDb25maWcoYXR0YWNobWVudCkge1xuICAgIGNvbnN0IGRlZmF1bHRCc1BvcHBlckNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudDogYXR0YWNobWVudCxcbiAgICAgIG1vZGlmaWVyczogW3tcbiAgICAgICAgbmFtZTogJ2ZsaXAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBib3VuZGFyeTogdGhpcy5fY29uZmlnLmJvdW5kYXJ5XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgLy8gUHJlLXNldCBQb3BwZXIncyBwbGFjZW1lbnQgYXR0cmlidXRlIGluIG9yZGVyIHRvIHJlYWQgdGhlIGFycm93IHNpemVzIHByb3Blcmx5LlxuICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uZXhlY3V0ZSh0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnLCBbZGVmYXVsdEJzUG9wcGVyQ29uZmlnXSlcbiAgICB9O1xuICB9XG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLl9jb25maWcudHJpZ2dlci5zcGxpdCgnICcpO1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0cmlnZ2Vycykge1xuICAgICAgaWYgKHRyaWdnZXIgPT09ICdjbGljaycpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0NMSUNLJDEpLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0LnRvZ2dsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgPyB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9NT1VTRUVOVEVSKSA6IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4kMSk7XG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/IHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDogdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfRk9DVVNPVVQkMSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWU7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCk7XG4gICAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNvdXQnID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpO1xuICB9XG4gIF9maXhUaXRsZSgpIHtcbiAgICBjb25zdCB0aXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpICYmICF0aGlzLl9lbGVtZW50LnRleHRDb250ZW50LnRyaW0oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgfVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJywgdGl0bGUpOyAvLyBETyBOT1QgVVNFIElULiBJcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICB9XG4gIF9lbnRlcigpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpIHx8IHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LnNob3cpO1xuICB9XG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LmhpZGUpO1xuICB9XG4gIF9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCk7XG4gIH1cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXModHJ1ZSk7XG4gIH1cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZSBvZiBPYmplY3Qua2V5cyhkYXRhQXR0cmlidXRlcykpIHtcbiAgICAgIGlmIChESVNBTExPV0VEX0FUVFJJQlVURVMuaGFzKGRhdGFBdHRyaWJ1dGUpKSB7XG4gICAgICAgIGRlbGV0ZSBkYXRhQXR0cmlidXRlc1tkYXRhQXR0cmlidXRlXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uZGF0YUF0dHJpYnV0ZXMsXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pXG4gICAgfTtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpO1xuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKTtcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnKSkge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25maWcuc2VsZWN0b3IgPSBmYWxzZTtcbiAgICBjb25maWcudHJpZ2dlciA9ICdtYW51YWwnO1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICBfZGlzcG9zZVBvcHBlcigpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcC5yZW1vdmUoKTtcbiAgICAgIHRoaXMudGlwID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKTtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgIH1cbiAgICAgIGRhdGFbY29uZmlnXSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FJDMgPSAncG9wb3Zlcic7XG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInO1xuY29uc3QgU0VMRUNUT1JfQ09OVEVOVCA9ICcucG9wb3Zlci1ib2R5JztcbmNvbnN0IERlZmF1bHQkMiA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgKyAnPGgzIGNsYXNzPVwicG9wb3Zlci1oZWFkZXJcIj48L2gzPicgKyAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgKyAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufTtcbmNvbnN0IERlZmF1bHRUeXBlJDIgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdFR5cGUsXG4gIGNvbnRlbnQ6ICcobnVsbHxzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0JDI7XG4gIH1cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGUkMjtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMztcbiAgfVxuXG4gIC8vIE92ZXJyaWRlc1xuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VGl0bGUoKSB8fCB0aGlzLl9nZXRDb250ZW50KCk7XG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH07XG4gIH1cbiAgX2dldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jb250ZW50KTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oUG9wb3Zlcik7XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCBzY3JvbGxzcHkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSQyID0gJ3Njcm9sbHNweSc7XG5jb25zdCBEQVRBX0tFWSQyID0gJ2JzLnNjcm9sbHNweSc7XG5jb25zdCBFVkVOVF9LRVkkMiA9IGAuJHtEQVRBX0tFWSQyfWA7XG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVkkMn1gO1xuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWSQyfWA7XG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJJDEgPSBgbG9hZCR7RVZFTlRfS0VZJDJ9JHtEQVRBX0FQSV9LRVl9YDtcbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJztcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFJDEgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU1BZID0gJ1tkYXRhLWJzLXNweT1cInNjcm9sbFwiXSc7XG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJztcbmNvbnN0IFNFTEVDVE9SX05BVl9MSU5LUyA9ICcubmF2LWxpbmsnO1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSc7XG5jb25zdCBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nO1xuY29uc3QgU0VMRUNUT1JfTElOS19JVEVNUyA9IGAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTkFWX0lURU1TfSA+ICR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9MSVNUX0lURU1TfWA7XG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nO1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFJDEgPSAnLmRyb3Bkb3duLXRvZ2dsZSc7XG5jb25zdCBEZWZhdWx0JDEgPSB7XG4gIG9mZnNldDogbnVsbCxcbiAgLy8gVE9ETzogdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJzBweCAwcHggLTI1JScsXG4gIHNtb290aFNjcm9sbDogZmFsc2UsXG4gIHRhcmdldDogbnVsbCxcbiAgdGhyZXNob2xkOiBbMC4xLCAwLjUsIDFdXG59O1xuY29uc3QgRGVmYXVsdFR5cGUkMSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsXG4gIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50JyxcbiAgdGhyZXNob2xkOiAnYXJyYXknXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKTtcblxuICAgIC8vIHRoaXMuX2VsZW1lbnQgaXMgdGhlIG9ic2VydmFibGVzQ29udGFpbmVyIGFuZCBjb25maWcudGFyZ2V0IHRoZSBtZW51IGxpbmtzIHdyYXBwZXJcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnQ7XG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG51bGw7XG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfTtcbiAgICB0aGlzLnJlZnJlc2goKTsgLy8gaW5pdGlhbGl6ZVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHQkMTtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZSQxO1xuICB9XG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRSQyO1xuICB9XG5cbiAgLy8gUHVibGljXG4gIHJlZnJlc2goKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpO1xuICAgIHRoaXMuX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCk7XG4gICAgaWYgKHRoaXMuX29ic2VydmVyKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29ic2VydmVyID0gdGhpcy5fZ2V0TmV3T2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZShzZWN0aW9uKTtcbiAgICB9XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyBUT0RPOiBvbiB2NiB0YXJnZXQgc2hvdWxkIGJlIGdpdmVuIGV4cGxpY2l0bHkgJiByZW1vdmUgdGhlIHt0YXJnZXQ6ICdzcy10YXJnZXQnfSBjYXNlXG4gICAgY29uZmlnLnRhcmdldCA9IGdldEVsZW1lbnQoY29uZmlnLnRhcmdldCkgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luO1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnRocmVzaG9sZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZy50aHJlc2hvbGQgPSBjb25maWcudGhyZXNob2xkLnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVucmVnaXN0ZXIgYW55IHByZXZpb3VzIGxpc3RlbmVyc1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fY29uZmlnLnRhcmdldCwgRVZFTlRfQ0xJQ0spO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpO1xuICAgICAgaWYgKG9ic2VydmFibGVTZWN0aW9uKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290RWxlbWVudCB8fCB3aW5kb3c7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICBpZiAocm9vdC5zY3JvbGxUbykge1xuICAgICAgICAgIHJvb3Quc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wOiBoZWlnaHQsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaHJvbWUgNjAgZG9lc24ndCBzdXBwb3J0IGBzY3JvbGxUb2BcbiAgICAgICAgcm9vdC5zY3JvbGxUb3AgPSBoZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgX2dldE5ld09ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLl9yb290RWxlbWVudCxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fY29uZmlnLnRocmVzaG9sZCxcbiAgICAgIHJvb3RNYXJnaW46IHRoaXMuX2NvbmZpZy5yb290TWFyZ2luXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBUaGUgbG9naWMgb2Ygc2VsZWN0aW9uXG4gIF9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZW50cnkgPT4gdGhpcy5fdGFyZ2V0TGlua3MuZ2V0KGAjJHtlbnRyeS50YXJnZXQuaWR9YCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcDtcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgIH07XG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHVzZXJTY3JvbGxzRG93biA9IHBhcmVudFNjcm9sbFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wO1xuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3A7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcDtcbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgZG93biwgcGljayB0aGUgYmlnZ2VyIG9mZnNldFRvcFxuICAgICAgaWYgKHVzZXJTY3JvbGxzRG93biAmJiBlbnRyeUlzTG93ZXJUaGFuUHJldmlvdXMpIHtcbiAgICAgICAgYWN0aXZhdGUoZW50cnkpO1xuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKSB7XG4gICAgdGhpcy5fdGFyZ2V0TGlua3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHRhcmdldExpbmtzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9UQVJHRVRfTElOS1MsIHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmFibGVTZWN0aW9uID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCB0aGlzLl9lbGVtZW50KTtcblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIG9ic2VydmFibGVTZWN0aW9uIGV4aXN0cyAmIGlzIHZpc2libGVcbiAgICAgIGlmIChpc1Zpc2libGUob2JzZXJ2YWJsZVNlY3Rpb24pKSB7XG4gICAgICAgIHRoaXMuX3RhcmdldExpbmtzLnNldChkZWNvZGVVUkkoYW5jaG9yLmhhc2gpLCBhbmNob3IpO1xuICAgICAgICB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMuc2V0KGFuY2hvci5oYXNoLCBvYnNlcnZhYmxlU2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9wcm9jZXNzKHRhcmdldCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmVUYXJnZXQgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpO1xuICAgIHRoaXMuX2FjdGl2ZVRhcmdldCA9IHRhcmdldDtcbiAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB0aGlzLl9hY3RpdmF0ZVBhcmVudHModGFyZ2V0KTtcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9BQ1RJVkFURSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGFyZ2V0XG4gICAgfSk7XG4gIH1cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUkMSwgdGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfRFJPUERPV04pKS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFJDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY2xlYXJBY3RpdmVDbGFzcyhwYXJlbnQpIHtcbiAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICBjb25zdCBhY3RpdmVOb2RlcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoYCR7U0VMRUNUT1JfVEFSR0VUX0xJTktTfS4ke0NMQVNTX05BTUVfQUNUSVZFJDF9YCwgcGFyZW50KTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYWN0aXZlTm9kZXMpIHtcbiAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSQxKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBTY3JvbGxTcHkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEkkMSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihTY3JvbGxTcHkpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUkMSA9ICd0YWInO1xuY29uc3QgREFUQV9LRVkkMSA9ICdicy50YWInO1xuY29uc3QgRVZFTlRfS0VZJDEgPSBgLiR7REFUQV9LRVkkMX1gO1xuY29uc3QgRVZFTlRfSElERSQxID0gYGhpZGUke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9ISURERU4kMSA9IGBoaWRkZW4ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9TSE9XJDEgPSBgc2hvdyR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX1NIT1dOJDEgPSBgc2hvd24ke0VWRU5UX0tFWSQxfWA7XG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0tFWURPV04gPSBga2V5ZG93biR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZJDF9YDtcbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCc7XG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCc7XG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nO1xuY29uc3QgSE9NRV9LRVkgPSAnSG9tZSc7XG5jb25zdCBFTkRfS0VZID0gJ0VuZCc7XG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnO1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFJDEgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1ckMSA9ICdzaG93JztcbmNvbnN0IENMQVNTX0RST1BET1dOID0gJ2Ryb3Bkb3duJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJztcbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnO1xuY29uc3QgTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9IGA6bm90KCR7U0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSlgO1xuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nO1xuY29uc3QgU0VMRUNUT1JfT1VURVIgPSAnLm5hdi1pdGVtLCAubGlzdC1ncm91cC1pdGVtJztcbmNvbnN0IFNFTEVDVE9SX0lOTkVSID0gYC5uYXYtbGluayR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX0sIC5saXN0LWdyb3VwLWl0ZW0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCBbcm9sZT1cInRhYlwiXSR7Tk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJzsgLy8gVE9ETzogY291bGQgb25seSBiZSBgdGFiYCBpbiB2NlxuY29uc3QgU0VMRUNUT1JfSU5ORVJfRUxFTSA9IGAke1NFTEVDVE9SX0lOTkVSfSwgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX1gO1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWA7XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRhYiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XG4gICAgc3VwZXIoZWxlbWVudCk7XG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX1RBQl9QQU5FTCk7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW4gdjZcbiAgICAgIC8vIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZWxlbWVudC5vdXRlckhUTUx9IGhhcyBub3QgYSB2YWxpZCBwYXJlbnQgJHtTRUxFQ1RPUl9JTk5FUl9FTEVNfWApXG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIGluaXRpYWwgYXJpYSBhdHRyaWJ1dGVzXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXModGhpcy5fcGFyZW50LCB0aGlzLl9nZXRDaGlsZHJlbigpKTtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpO1xuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUUkMTtcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIC8vIFNob3dzIHRoaXMgZWxlbSBhbmQgZGVhY3RpdmF0ZSB0aGUgYWN0aXZlIHNpYmxpbmcgaWYgZXhpc3RzXG4gICAgY29uc3QgaW5uZXJFbGVtID0gdGhpcy5fZWxlbWVudDtcbiAgICBpZiAodGhpcy5fZWxlbUlzQWN0aXZlKGlubmVyRWxlbSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKTtcbiAgICBjb25zdCBoaWRlRXZlbnQgPSBhY3RpdmUgPyBFdmVudEhhbmRsZXIudHJpZ2dlcihhY3RpdmUsIEVWRU5UX0hJREUkMSwge1xuICAgICAgcmVsYXRlZFRhcmdldDogaW5uZXJFbGVtXG4gICAgfSkgOiBudWxsO1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKGlubmVyRWxlbSwgRVZFTlRfU0hPVyQxLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiBhY3RpdmVcbiAgICB9KTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaGlkZUV2ZW50ICYmIGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RlYWN0aXZhdGUoYWN0aXZlLCBpbm5lckVsZW0pO1xuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2FjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgdGhpcy5fYWN0aXZhdGUoU2VsZWN0b3JFbmdpbmUuZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSk7IC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1ckMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIHRydWUpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04kMSwge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiByZWxhdGVkRWxlbVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUkMSkpO1xuICB9XG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSk7XG4gICAgZWxlbWVudC5ibHVyKCk7XG4gICAgdGhpcy5fZGVhY3RpdmF0ZShTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGVsZW1lbnQpKTsgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVyQxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCBmYWxzZSk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX0hJRERFTiQxLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSQxKSk7XG4gIH1cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIVtBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBIT01FX0tFWSwgRU5EX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maWx0ZXIoZWxlbWVudCA9PiAhaXNEaXNhYmxlZChlbGVtZW50KSk7XG4gICAgbGV0IG5leHRBY3RpdmVFbGVtZW50O1xuICAgIGlmIChbSE9NRV9LRVksIEVORF9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50ID0gY2hpbGRyZW5bZXZlbnQua2V5ID09PSBIT01FX0tFWSA/IDAgOiBjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgICBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KGNoaWxkcmVuLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgbmV4dEFjdGl2ZUVsZW1lbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKG5leHRBY3RpdmVFbGVtZW50KS5zaG93KCk7XG4gICAgfVxuICB9XG4gIF9nZXRDaGlsZHJlbigpIHtcbiAgICAvLyBjb2xsZWN0aW9uIG9mIGlubmVyIGVsZW1lbnRzXG4gICAgcmV0dXJuIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfSU5ORVJfRUxFTSwgdGhpcy5fcGFyZW50KTtcbiAgfVxuICBfZ2V0QWN0aXZlRWxlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRyZW4oKS5maW5kKGNoaWxkID0+IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZCkpIHx8IG51bGw7XG4gIH1cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfVxuICBfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKSB7XG4gICAgY2hpbGQgPSB0aGlzLl9nZXRJbm5lckVsZW1lbnQoY2hpbGQpO1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKTtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpO1xuICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGlzQWN0aXZlKTtcbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhjaGlsZCwgJ3JvbGUnLCAndGFiJyk7XG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyB0byB0aGUgcmVsYXRlZCBwYW5lbCB0b29cbiAgICB0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpO1xuICB9XG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwoY2hpbGQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKGNoaWxkKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdyb2xlJywgJ3RhYnBhbmVsJyk7XG4gICAgaWYgKGNoaWxkLmlkKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0YXJnZXQsICdhcmlhLWxhYmVsbGVkYnknLCBgJHtjaGlsZC5pZH1gKTtcbiAgICB9XG4gIH1cbiAgX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIG9wZW4pIHtcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2dnbGUgPSAoc2VsZWN0b3IsIGNsYXNzTmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoc2VsZWN0b3IsIG91dGVyRWxlbSk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKTtcbiAgICB0b2dnbGUoU0VMRUNUT1JfRFJPUERPV05fTUVOVSwgQ0xBU1NfTkFNRV9TSE9XJDEpO1xuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKTtcbiAgfVxuICBfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIF9lbGVtSXNBY3RpdmUoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0FDVElWRSk7XG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBpbm5lciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWxpbmspXG4gIF9nZXRJbm5lckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLm1hdGNoZXMoU0VMRUNUT1JfSU5ORVJfRUxFTSkgPyBlbGVtIDogU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTk5FUl9FTEVNLCBlbGVtKTtcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbTtcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApO1xuICAgICAgfVxuICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpO1xufSk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KTtcbiAgfVxufSk7XG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpO1xuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICd0b2FzdCc7XG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCc7XG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YDtcbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfTU9VU0VPVVQgPSBgbW91c2VvdXQke0VWRU5UX0tFWX1gO1xuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YDtcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWA7XG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWA7XG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSc7XG5jb25zdCBDTEFTU19OQU1FX0hJREUgPSAnaGlkZSc7IC8vIEBkZXByZWNhdGVkIC0ga2VwdCBoZXJlIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZyc7XG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGF1dG9oaWRlOiAnYm9vbGVhbicsXG4gIGRlbGF5OiAnbnVtYmVyJ1xufTtcbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgYXV0b2hpZGU6IHRydWUsXG4gIGRlbGF5OiA1MDAwXG59O1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb2FzdCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdDtcbiAgfVxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgfVxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUU7XG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHtcbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XKTtcbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KCk7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pO1xuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKTtcbiAgICB9O1xuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpOyAvLyBAZGVwcmVjYXRlZFxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XLCBDTEFTU19OQU1FX1NIT1dJTkcpO1xuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2NvbmZpZy5hbmltYXRpb24pO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKTtcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcsIENMQVNTX05BTUVfU0hPVyk7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pO1xuICAgIH07XG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORyk7XG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbik7XG4gIH1cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICBpZiAodGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpO1xuICAgIH1cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKTtcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfbWF5YmVTY2hlZHVsZUhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gfHwgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkpO1xuICB9XG4gIF9vbkludGVyYWN0aW9uKGV2ZW50LCBpc0ludGVyYWN0aW5nKSB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3Rpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgICB7XG4gICAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3Rpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW50ZXJhY3RpbmcpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgPT09IG5leHRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnQuY29udGFpbnMobmV4dEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKCk7XG4gIH1cbiAgX3NldExpc3RlbmVycygpIHtcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VPVkVSLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpO1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSk7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0ZPQ1VTT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpO1xuICB9XG4gIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9hc3QuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtjb25maWddKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihUb2FzdCk7XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvYXN0KTtcblxuZXhwb3J0IHsgQWxlcnQsIEJ1dHRvbiwgQ2Fyb3VzZWwsIENvbGxhcHNlLCBEcm9wZG93biwgTW9kYWwsIE9mZmNhbnZhcywgUG9wb3ZlciwgU2Nyb2xsU3B5LCBUYWIsIFRvYXN0LCBUb29sdGlwIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAuZXNtLmpzLm1hcFxuIiwiaW1wb3J0IHtcbiAgSUFjdGlvbixcbiAgSUFjdGlvblJlc3VsdCxcbiAgSUFjdGlvbk5vZGUsXG4gIElBY3Rpb25Qcm9wZXJ0eSxcbiAgSUNvbnRleHQsXG4gIElGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5cbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgdHlwZSB7IFJlY29yZH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC90eXBlc1wiO1xuaW1wb3J0IHsgS2ludG9uZUFsbFJlY29yZHNFcnJvciwgS2ludG9uZVJlc3RBUElDbGllbnR9IGZyb20gXCJAa2ludG9uZS9yZXN0LWFwaS1jbGllbnRcIjtcbmltcG9ydCBcIi4vYXV0by1sb29rdXAuc2Nzc1wiO1xuaW1wb3J0IFwiYm9vdHN0cmFwL2pzL2Rpc3QvbW9kYWxcIjtcbi8vIGltcG9ydCBcImJvb3RzdHJhcC9qcy9kaXN0L3NwaW5uZXJcIjtcbmltcG9ydCB7TW9kYWx9IGZyb20gXCJib290c3RyYXBcIlxuaW1wb3J0ICQgZnJvbSBcImpxdWVyeVwiO1xuXG5pbnRlcmZhY2UgSUF1dG9Mb29rVXBQcm9wcyB7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGxvb2t1cEZpZWxkOiBMb29rdXBGaWVsZDtcbiAgY29uZGl0aW9uOiBDb25kaXRpb247XG59XG5cbmludGVyZmFjZSBDb25kaXRpb24ge1xuICBxdWVyeVN0cmluZzogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBDaGlsZFtdO1xuICBwYXJlbnQ6IG51bGw7XG4gIGxvZ2ljYWxPcGVyYXRvcjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hpbGQge1xuICBpbmRleDogbnVtYmVyO1xuICB0eXBlOiBzdHJpbmc7XG4gIHBhcmVudDogc3RyaW5nO1xuICBvYmplY3Q6IGFueTtcbiAgb3BlcmF0b3I6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvb2t1cEZpZWxkIHtcbiAgYXBwOiBBcHA7XG4gIGZpZWxkczogRmllbGRbXTtcbn1cblxuaW50ZXJmYWNlIEZpZWxkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGNvZGU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgbm9MYWJlbDogYm9vbGVhbjtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGxvb2t1cDogTG9va3VwO1xufSBcblxuaW50ZXJmYWNlIExvb2t1cCB7XG4gIHJlbGF0ZWRBcHA6IFJlbGF0ZWRBcHA7XG4gIHJlbGF0ZWRLZXlGaWVsZDogc3RyaW5nO1xuICBmaWVsZE1hcHBpbmdzOiBGaWVsZE1hcHBpbmdbXTtcbiAgbG9va3VwUGlja2VyRmllbGRzOiBhbnlbXTtcbiAgZmlsdGVyQ29uZDogc3RyaW5nO1xuICBzb3J0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGaWVsZE1hcHBpbmcge1xuICBmaWVsZDogc3RyaW5nO1xuICByZWxhdGVkRmllbGQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlbGF0ZWRBcHAge1xuICBhcHA6IHN0cmluZztcbiAgY29kZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkYXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRvTG9va1VwQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICBwcm9wczogSUF1dG9Mb29rVXBQcm9wcztcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lID0gXCLjg6vjg4Pjgq/jgqLjg4Pjg5fmm7TmlrBcIjtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gW107XG4gICAgdGhpcy5wcm9wcyA9IHt9IGFzIElBdXRvTG9va1VwUHJvcHM7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICB9XG5cbiAgLyoqKlxuICAgKiDjgqLjgq/jgrvjgrnjga7jg6HjgqTjg7Pjga7lh6bnkIbplqLmlbBcbiAgICovXG4gIGFzeW5jIHByb2Nlc3MoXG4gICAgYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsXG4gICAgZXZlbnQ6IGFueSxcbiAgICBjb250ZXh0OiBJQ29udGV4dFxuICApOiBQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gYWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICB0aGlzLnByb3BzID0ge1xuICAgICAgLi4uYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSxcbiAgICAgIGNvbmRpdGlvbjogSlNPTi5wYXJzZSgoYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBhbnkpLmNvbmRpdGlvbiB8fCAne30nKSxcbiAgICB9IGFzIElBdXRvTG9va1VwUHJvcHM7XG4gICAgLy8gY29uc29sZS5sb2coY29udGV4dCk7XG5cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgY2FuTmV4dDogdHJ1ZSxcbiAgICAgIHJlc3VsdDogXCJcIixcbiAgICB9IGFzIElBY3Rpb25SZXN1bHQ7XG4gICAgY29uc3QgbG9va1VwRmllbGRzID0gdGhpcy5wcm9wcy5sb29rdXBGaWVsZC5maWVsZHMuZmlsdGVyKFxuICAgICAgKGYpID0+IGYubG9va3VwICYmIGYubG9va3VwLnJlbGF0ZWRBcHAuYXBwID09PSBTdHJpbmcoa2ludG9uZS5hcHAuZ2V0SWQoKSlcbiAgICApO1xuICAgIGlmICghbG9va1VwRmllbGRzIHx8IGxvb2tVcEZpZWxkcy5sZW5ndGg9PT0wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGDjg6vjg4Pjgq/jgqLjg4Pjg5fjga7oqK3lrprjga/kuI3mraPjgafjgZnjgIIke3RoaXMucHJvcHMubG9va3VwRmllbGQuZmllbGRzWzBdLmxhYmVsfSBgXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9va1VwRmllbGQgPSB0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmZpZWxkc1swXTsgXG4gICAgICB0aGlzLnNob3dTcGlubmVyTW9kZWwodGhpcy5wcm9wcy5sb29rdXBGaWVsZC5hcHAsIGxvb2tVcEZpZWxkKTtcbiAgICAgIGNvbnN0IGtleSA9IGV2ZW50LnJlY29yZFtsb29rVXBGaWVsZC5sb29rdXAucmVsYXRlZEtleUZpZWxkXS52YWx1ZTtcbiAgICAgIGNvbnN0IHRhcmdldFJlY29yZHMgPSBhd2FpdCB0aGlzLmdldFVwZGF0ZVJlY29yZHMobG9va1VwRmllbGQsIGtleSk7XG4gICAgICAvL+abtOaWsOWvvuixoeOBjOOBquOBhOaZguOBq+OCueOCreODg+ODl1xuICAgICAgaWYodGFyZ2V0UmVjb3Jkcy5sZW5ndGg9PT0wKXtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZVJlY29yZHMgPSB0aGlzLmNvbnZlcnRGb3JMb29rdXAodGFyZ2V0UmVjb3Jkcyxsb29rVXBGaWVsZCxrZXkpO1xuICAgICAgY29uc29sZS5sb2coXCJ1cGRhdGVSZWNvcmRzXCIsIHVwZGF0ZVJlY29yZHMpO1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy51cGRhdGVMb29rdXBUYXJnZXQodXBkYXRlUmVjb3Jkcyk7XG4gICAgICBpZih1cGRhdGVSZXN1bHQpe1xuICAgICAgICB0aGlzLnNob3dSZXN1bHQodGhpcy5wcm9wcy5sb29rdXBGaWVsZC5hcHAsbG9va1VwRmllbGQsdXBkYXRlUmVjb3Jkcy5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsYWN0aW9uTm9kZSxcIuODq+ODg+OCr+OCouODg+ODl+abtOaWsOS4reS+i+WkluOBjOeZuueUn+OBl+OBvuOBl+OBn1wiKTtcbiAgICAgICAgcmVzdWx0LmNhbk5leHQgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSRVNUIEFQSeeUqOOCr+OCqOODquS9nOaIkFxuICAgKiBUT0RPOuWFsemAmumWouaVsOOBqOOBl+OBpuS9nOaIkFxuICAgKiBAcGFyYW0gbG9va1VwRmllbGQgXG4gICAqIEBwYXJhbSBrZXkgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgbWFrZVF1ZXJ5PShsb29rVXBGaWVsZDpGaWVsZCxrZXk6YW55KT0+e1xuICAgIGxldCBxdWVyeSA9XCJcIjtcbiAgICBpZih0eXBlb2Yga2V5PT09J251bWJlcicpe1xuICAgICAgcXVlcnkgPSBgJHtsb29rVXBGaWVsZC5jb2RlfSA9ICR7a2V5fWBcbiAgICB9XG4gICAgaWYodHlwZW9mIGtleT09PSdzdHJpbmcnKXtcbiAgICAgIHF1ZXJ5ID0gYCR7bG9va1VwRmllbGQuY29kZX0gPSBcIiR7a2V5fVwiYFxuICAgIH1cbiAgICBpZighIXRoaXMucHJvcHMuY29uZGl0aW9uLnF1ZXJ5U3RyaW5nKXtcbiAgICAgIHF1ZXJ5ID0gYCR7cXVlcnl9IGFuZCAoJHt0aGlzLnByb3BzLmNvbmRpdGlvbi5xdWVyeVN0cmluZ30pYFxuICAgIH1cbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICog5pu05paw5a++6LGh44Gu44Os44Kz44O844OJ44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBnZXRVcGRhdGVSZWNvcmRzID0gYXN5bmMgKGxvb2tVcEZpZWxkOkZpZWxkLGtleTphbnkpOlByb21pc2U8IFJlY29yZFtdPj0+e1xuICAgIGNvbnN0IGNsaWVudD1uZXcgS2ludG9uZVJlc3RBUElDbGllbnQoKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgY2xpZW50LnJlY29yZC5nZXRBbGxSZWNvcmRzKHtcbiAgICAgIGFwcDp0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmFwcC5pZCxcbiAgICAgIGZpZWxkczpbXCIkaWRcIl0sXG4gICAgICBjb25kaXRpb246dGhpcy5tYWtlUXVlcnkobG9va1VwRmllbGQsa2V5KVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwO1xuICB9XG5cbiAvKipcbiAgKiDjg6vjg4Pjgq/jgqLjg4Pjg5fmm7TmlrDnlKjjg6zjgrPjg7zjg4njgavlpInmj5vjgZnjgotcbiAgKiBAcGFyYW0gdGFyZ2V0UmVjb3JkcyDmm7TmlrDlr77osaHjg6zjgrPjg7zjg4lcbiAgKiBAcGFyYW0gbG9va1VwRmllbGQg44Or44OD44Kv44Ki44OD44OX44OV44Kj44O844Or44OJXG4gICogQHBhcmFtIGtleSDjg6vjg4Pjgq/jgqLjg4Pjg5fjg5XjgqPjg7zjg6vjg4njga7lgKRcbiAgKiBAcmV0dXJucyBcbiAgKi9cbiAgY29udmVydEZvckxvb2t1cCA9ICh0YXJnZXRSZWNvcmRzOlJlY29yZFtdLGxvb2tVcEZpZWxkOkZpZWxkLGtleTphbnkpOkFycmF5PGFueT49PntcbiAgICByZXR1cm4gdGFyZ2V0UmVjb3Jkcy5tYXAoKHIpID0+ICh7XG4gICAgICBpZDogTnVtYmVyKHJbXCIkaWRcIl0udmFsdWUpLFxuICAgICAgcmVjb3JkOiB7IFtsb29rVXBGaWVsZC5jb2RlXTogeyB2YWx1ZToga2V5IH0gfSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICog44Or44OD44Kv44Ki44OD44OX5YWI44KS5pu05paw44GZ44KLXG4gICAqIEBwYXJhbSB1cGRhdGVSZWNvcmRzIFxuICAgKi9cbiAgdXBkYXRlTG9va3VwVGFyZ2V0ID0gYXN5bmMgKHVwZGF0ZVJlY29yZHM6QXJyYXk8YW55Pik6UHJvbWlzZTxib29sZWFuPj0+e1xuICAgIGlmICh1cGRhdGVSZWNvcmRzICYmIHVwZGF0ZVJlY29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5e1xuICAgICAgICBjb25zdCBjbGllbnQ9bmV3IEtpbnRvbmVSZXN0QVBJQ2xpZW50KCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5yZWNvcmQudXBkYXRlQWxsUmVjb3Jkcyh7XG4gICAgICAgICAgYXBwOnRoaXMucHJvcHMubG9va3VwRmllbGQuYXBwLmlkLFxuICAgICAgICAgIHJlY29yZHM6dXBkYXRlUmVjb3Jkc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9Y2F0Y2goZXJyb3IgKXtcbiAgICAgICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBLaW50b25lQWxsUmVjb3Jkc0Vycm9yKXtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcih0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmFwcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmZpZWxkc1swXSwgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIGFzIEtpbnRvbmVBbGxSZWNvcmRzRXJyb3IsdXBkYXRlUmVjb3Jkcy5sZW5ndGgpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gXG4gICAgICB9XG4gICAgICAvLyBhd2FpdCBraW50b25lLmFwaShraW50b25lLmFwaS51cmwoXCIvay92MS9yZWNvcmRzLmpzb25cIiwgdHJ1ZSksIFwiUFVUXCIsIHtcbiAgICAgIC8vICAgYXBwOiB0aGlzLnByb3BzLmxvb2t1cEZpZWxkLmFwcC5pZCxcbiAgICAgIC8vICAgcmVjb3JkczogdXBkYXRlUmVjb3Jkc1xuICAgICAgLy8gfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDkuK3jga7jg4DjgqTjgqLjg63jgrDooajnpLpcbiAgICogQHBhcmFtIGFwcCBcbiAgICovXG4gIHNob3dTcGlubmVyTW9kZWwgPSAoYXBwOkFwcCxsb29rdXA6RmllbGQpID0+IHtcbiAgICBsZXQgZGlhbG9nID0gJChcIiNhbGNMb29rdXBNb2RhbFwiKTtcbiAgICBpZihkaWFsb2cubGVuZ3RoPT09MCl7XG4gICAgICBjb25zdCBtb2RhbEhUTUwgPSBgPGRpdiBjbGFzcz1cImJzLXNjb3BlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImFsY0xvb2t1cE1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cInN0YXRpY0JhY2tkcm9wTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJtb2RhbC10aXRsZSBmcy01XCIgaWQ9XCJhbGNMb29rdXBNb2RhbExhYmVsXCI+44Or44OD44Kv44Ki44OD44OX5ZCM5pyf5Yem55CGPC9oMT5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgaWQ9XCJhcHAke2FwcC5pZH1fJHtsb29rdXAuY29kZX1cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXNlY29uZGFyeSBjb2wtMSBcIiByb2xlPVwiYWxlcnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj4ke2FwcC5uYW1lfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+T0s8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PmA7XG4gICAgICAkKG1vZGFsSFRNTCkuYXBwZW5kVG8oXCJib2R5XCIpO1xuICAgICAgZGlhbG9nID0gJChcIiNhbGNMb29rdXBNb2RhbFwiKTtcbiAgICAgIGRpYWxvZy5nZXQoKVswXS5hZGRFdmVudExpc3RlbmVyKCdoaWRkZW4uYnMubW9kYWwnLChldik9PntcbiAgICAgICAgTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZShkaWFsb2cuZ2V0KClbMF0pLmRpc3Bvc2UoKTtcbiAgICAgICAgJChcIiNhbGNMb29rdXBNb2RhbFwiKS5wYXJlbnQoKS5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgIH1lbHNle1xuICAgICAgY29uc3QgZGlhbG9nQm9keT0kKFwiI2FsY0xvb2t1cE1vZGFsIC5tb2RhbC1ib2R5XCIpO1xuICAgICAgY29uc3QgaHRtbHJvdz1gIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBpZD1cImFwcCR7YXBwLmlkfV8ke2xvb2t1cC5jb2RlfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHRleHQtc2Vjb25kYXJ5IGNvbC0xIFwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+JHthcHAubmFtZX08L2Rpdj5cbiAgICAgICAgICA8ZGl2PmA7XG4gICAgICBkaWFsb2dCb2R5LmFwcGVuZChodG1scm93KTtcbiAgICB9XG4gICAgTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZShkaWFsb2cuZ2V0KClbMF0pLnNob3coKTsgXG4gIH1cblxuICAvKipcbiAgICog5pu05paw57WQ5p6c44KS6KGo56S644GZ44KLXG4gICAqIEBwYXJhbSBhcHAg44CA5pu05paw5YWI44Ki44OX44Oq5oOF5aCxXG4gICAqIEBwYXJhbSBjb3VudCDmm7TmlrDku7bmlbBcbiAgICovXG4gIHNob3dSZXN1bHQ9KGFwcDpBcHAsbG9va3VwOkZpZWxkLGNvdW50Om51bWJlcik9PntcbiAgICBjb25zdCBkaWFsb2dCb2R5PSQoYCNhbGNMb29rdXBNb2RhbCAubW9kYWwtYm9keSAjYXBwJHthcHAuaWR9XyR7bG9va3VwLmNvZGV9YCk7XG4gICAgY29uc3QgaHRtbD1gICAgIDxkaXYgY2xhc3M9XCJjb2wtMSB0ZXh0LXN1Y2Nlc3NcIj7inJQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPiR7YXBwLm5hbWV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj7mm7TmlrDku7bmlbA6JHtjb3VudH3ku7Y8L2Rpdj5gO1xuICAgIGRpYWxvZ0JvZHkuaHRtbChodG1sKTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIOabtOaWsOe1kOaenOOCkuihqOekuuOBmeOCi1xuICAgKiBAcGFyYW0gYXBwIOOAgOabtOaWsOWFiOOCouODl+ODquaDheWgsVxuICAgKiBAcGFyYW0gY291bnQg5pu05paw5Lu25pWwXG4gICAqL1xuICAgIHNob3dFcnJvcj0oYXBwOkFwcCxsb29rdXA6RmllbGQsZXJyb3I6S2ludG9uZUFsbFJlY29yZHNFcnJvcixhbGxDb3VudDpOdW1iZXIpPT57XG4gICAgICBjb25zdCBtZXNzYWdlPWVycm9yLmVycm9yLm1lc3NhZ2U7XG4gICAgICBjb25zdCBwcm9SZWNvcmRzID0gZXJyb3IubnVtT2ZQcm9jZXNzZWRSZWNvcmRzO1xuICAgICAgY29uc3QgYWxsUmVjb3Jkcz1lcnJvci5udW1PZkFsbFJlY29yZHM7XG4gICAgICBjb25zdCBkaWFsb2dCb2R5PSQoYCNhbGNMb29rdXBNb2RhbCAubW9kYWwtYm9keSAjYXBwJHthcHAuaWR9XyR7bG9va3VwLmNvZGV9YCk7XG4gICAgICBjb25zdCBodG1sPWA8ZGl2IGNsYXNzPVwiY29sLTEgdGV4dC1kYW5nZXJcIj7inJY8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj4ke2FwcC5uYW1lfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPuabtOaWsOS7tuaVsDoke3Byb1JlY29yZHN9LyR7YWxsUmVjb3Jkc308L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdGV4dC1kYW5nZXJcIj4ke21lc3NhZ2V9PGRpdj5gO1xuICAgICAgZGlhbG9nQm9keS5odG1sKGh0bWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjg4DjgqTjgqLjg63jgrDnlLvpnaLjgpLplonjgZjjgotcbiAgICAgKi9cbiAgICBjbG9zZURpYWxvZz0oKT0+e1xuICAgICAgY29uc3QgZGlhbG9nID0gJChcIiNhbGNMb29rdXBNb2RhbFwiKTtcbiAgICAgIE1vZGFsLmdldE9yQ3JlYXRlSW5zdGFuY2UoZGlhbG9nLmdldCgpWzBdKS5kaXNwb3NlKCk7XG4gICAgICAkKFwiI2FsY0xvb2t1cE1vZGFsXCIpLnBhcmVudCgpLnJlbW92ZSgpO1xuICAgIH1cblxuICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gIH1cbn1cblxubmV3IEF1dG9Mb29rVXBBY3Rpb24oKTsiLCJcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyAgSUFjdGlvbixJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQsIElDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25UcmVlIH0gZnJvbSAnLi4vdHlwZXMvQ29uZGl0aW9ucyc7XG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruWxnuaAp+Wumue+qVxuICovXG5pbnRlcmZhY2UgSURpc2FibGVQcm9wc3tcbiAgICAvL+WvvuixoeODleOCo+ODvOODq+ODiVxuICAgIGZpZWxkOklGaWVsZDtcbiAgICAvL+e3qOmbhuWPry/kuI3lj6/oqK3lrppcbiAgICBlZGl0YWJsZTon57eo6ZuG5Y+vJ3wn57eo6ZuG5LiN5Y+vJ3wnJzsgXG4gICAgY29uZGl0aW9uOnN0cmluZztcbn1cbi8qKlxuICog57eo6ZuG5Y+v77yP5LiN5Y+v44Ki44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWVsZERpc2FibGVBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9ue1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gICAgcHJvcHM6SURpc2FibGVQcm9wcztcbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLm5hbWU9XCLnt6jpm4blj6/vvI/kuI3lj69cIjtcbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICB0aGlzLnByb3BzPXtcbiAgICAgICAgICAgIGZpZWxkOntjb2RlOicnfSxcbiAgICAgICAgICAgIGVkaXRhYmxlOicnLFxuICAgICAgICAgICAgY29uZGl0aW9uOicnXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnZWRpdGFibGUnIGluIGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSURpc2FibGVQcm9wcztcbiAgICAgICAgICAgIC8v5p2h5Lu25byP44Gu6KiI566X57WQ5p6c44KS5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25SZXN1bHQgPSB0aGlzLmdldENvbmRpdGlvblJlc3VsdChjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGV2ZW50LnJlY29yZDtcbiAgICAgICAgICAgIGlmKCEodGhpcy5wcm9wcy5maWVsZC5jb2RlIGluIHJlY29yZCkpe1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg44OV44Kj44O844Or44OJ44CMJHt0aGlzLnByb3BzLmZpZWxkLmNvZGV944CN44GM6KaL44Gk44GL44KK44G+44Gb44KT44CCYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihjb25kaXRpb25SZXN1bHQpe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMucHJvcHMuZWRpdGFibGU9PT0n57eo6ZuG5Y+vJyl7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFt0aGlzLnByb3BzLmZpZWxkLmNvZGVdLmRpc2FibGVkPWZhbHNlO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmICh0aGlzLnByb3BzLmVkaXRhYmxlPT09J+e3qOmbhuS4jeWPrycpe1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRbdGhpcy5wcm9wcy5maWVsZC5jb2RlXS5kaXNhYmxlZD10cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdD0ge1xuICAgICAgICAgICAgY2FuTmV4dDp0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OnRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgfVxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQg5p2h5Lu25byP44KS5a6f6KGM44GZ44KLXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBnZXRDb25kaXRpb25SZXN1bHQoY29udGV4dDphbnkpOmJvb2xlYW57XG4gICAgICAgIGNvbnN0IHRyZWUgPXRoaXMuZ2V0Q29uZGl0aW9uKHRoaXMucHJvcHMuY29uZGl0aW9uKTtcbiAgICAgICAgaWYoIXRyZWUpe1xuICAgICAgICAgICAgLy/mnaHku7bjgpLoqK3lrprjgZXjgozjgabjgYTjgb7jgZvjgpNcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmVlLmV2YWx1YXRlKHRyZWUucm9vdCxjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uIOadoeS7tuW8j+ODhOODquODvOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZ2V0Q29uZGl0aW9uKGNvbmRpdGlvbjpzdHJpbmcpOkNvbmRpdGlvblRyZWV8bnVsbHtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgY29uc3QgdHJlZSA9IG5ldyBDb25kaXRpb25UcmVlKCk7XG4gICAgICAgICAgICB0cmVlLmZyb21Kc29uKGNvbmRpdGlvbik7XG4gICAgICAgICAgICBpZih0cmVlLmdldENvbmRpdGlvbnModHJlZS5yb290KS5sZW5ndGg+MCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgICAgIGFjdGlvbkFkZGluc1t0aGlzLm5hbWVdPXRoaXM7XG4gICAgfVxufVxubmV3IEZpZWxkRGlzYWJsZUFjdGlvbigpOyIsIlxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSBcIkBraW50b25lL3Jlc3QtYXBpLWNsaWVudC9saWIvc3JjL2NsaWVudC90eXBlc1wiO1xuaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7ICBJQWN0aW9uLElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCwgSUNvbnRleHQgfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IENvbmRpdGlvblRyZWUgfSBmcm9tICcuLi90eXBlcy9Db25kaXRpb25zJztcblxudHlwZSBUZXh0U3R5bGUgPSBcIuWkquWtl1wiIHwgXCLmlpzkvZNcIiB8IFwi5LiL57eaXCIgfCBcIuaJk+OBoea2iOOBl+e3mlwiO1xudHlwZSBTdHlsZVJpZ2lvbiA9IFwi5pu45byP5aSJ5pu044OV44Kj44O844Or44OJXCIgfCBcIuihjOWFqOS9k1wifFwiXCI7XG5cblxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElTdHlsZUZpZWxkUHJvcHN7XG4gICAgZmllbGQ6SUZpZWxkO1xuICAgIGZvbnRDb2xvcjpzdHJpbmc7IFxuICAgIGJnQ29sb3I6c3RyaW5nO1xuICAgIGZvbnRTdHlsZTpUZXh0U3R5bGVbXTtcbiAgICBhbGxSb3c6U3R5bGVSaWdpb247XG4gICAgY29uZGl0aW9uOnN0cmluZztcbn1cbi8qKlxuICog5p2h5Lu25pu45byP6KGo56S644Ki44Kv44K344On44OzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZUZpZWxkQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbntcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xuICAgIHByb3BzOklTdHlsZUZpZWxkUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5p2h5Lu25pu45byP6KGo56S6XCI7XG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9W107XG4gICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICBmaWVsZDp7Y29kZTonJ30sXG4gICAgICAgICAgICBmb250Q29sb3I6JycsXG4gICAgICAgICAgICBiZ0NvbG9yOicnLFxuICAgICAgICAgICAgZm9udFN0eWxlOltdLFxuICAgICAgICAgICAgYWxsUm93OicnLFxuICAgICAgICAgICAgY29uZGl0aW9uOicnXG4gICAgICAgIH1cbiAgICAgICAgLy/jgqLjgq/jgrfjg6fjg7PjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcbiAgICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6ZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5e1xuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHM9YWN0aW9uTm9kZS5hY3Rpb25Qcm9wcztcbiAgICAgICAgICAgIGlmICghKCdmaWVsZCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgnYWxsUm93JyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvcHMgPSBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlIGFzIElTdHlsZUZpZWxkUHJvcHM7XG4gICAgICAgICAgICAvL+abuOW8j+ioreWumlxuICAgICAgICAgICAgY29uc29sZS5sb2coZXZlbnQudHlwZSlcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcImFwcC5yZWNvcmQuaW5kZXguc2hvd1wiKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3R5bGVGb3JWaWV3KGV2ZW50LCB0aGlzLnByb3BzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJhcHAucmVjb3JkLmRldGFpbC5zaG93XCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdHlsZUZvckRldGFpbChldmVudCwgdGhpcy5wcm9wcywgY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBldmVudC50eXBlLmluY2x1ZGVzKFwiYXBwLnJlY29yZC5jcmVhdGUuY2hhbmdlLlwiKSB8fFxuICAgICAgICAgICAgICBldmVudC50eXBlLmluY2x1ZGVzKFwiYXBwLnJlY29yZC5lZGl0LmNoYW5nZS5cIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLnNldFN0eWxlRm9yRWRpdChldmVudCwgdGhpcy5wcm9wcywgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQ9IHtcbiAgICAgICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICAgICAgcmVzdWx0OnRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5oYW5kbGVFcnJvcihlcnJvcixhY3Rpb25Ob2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5OZXh0PWZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgc2V0U3R5bGVGb3JFZGl0KGV2ZW50OmFueSxwcm9wczpJU3R5bGVGaWVsZFByb3BzLGNvbnRleHQ6SUNvbnRleHQpe1xuICAgICAgICBjb25zdCByZWNvcmRUYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNvcmQtZ2FpYScpO1xuICAgICAgICBpZiAocmVjb3JkVGFibGUpIHtcbiAgICAgICAgICAgIEFycmF5LmZyb20oXG4gICAgICAgICAgICAgIHJlY29yZFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3BhblwiKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuZmlsdGVyKChzcGFuKSA9PiBzcGFuLmlubmVyVGV4dCA9PT0gcHJvcHMuZmllbGQuY29kZSlcbiAgICAgICAgICAgICAgLm1hcCgoc3BhbikgPT5cbiAgICAgICAgICAgICAgICBzcGFuLnBhcmVudEVsZW1lbnQ/Lm5leHRFbGVtZW50U2libGluZ1xuICAgICAgICAgICAgICAgICAgPy5xdWVyeVNlbGVjdG9yKFwiLmlucHV0LXRleHQtb3V0ZXItY3lib3p1XCIpXG4gICAgICAgICAgICAgICAgICA/LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50IHwgbnVsbFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGlucHV0RWxlbWVudCk6IGlucHV0RWxlbWVudCBpcyBIVE1MRWxlbWVudCA9PiAhIWlucHV0RWxlbWVudClcbiAgICAgICAgICAgICAgLmZvckVhY2goKGlucHV0RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KFxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb25kaXRpb24ocHJvcHMuY29uZGl0aW9uKSxcbiAgICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb25SZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RmllbGRTdHlsZShwcm9wcywgaW5wdXRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5wdXRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIFxuXG4gICAgLyoqXG4gICAgICog6Kmz57Sw6KGo56S65pmC44Gu44K544K/44Kk44Or6Kit5a6aXG4gICAgICogQHBhcmFtIGV2ZW50IFxuICAgICAqIEBwYXJhbSBwcm9wcyBcbiAgICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBzZXRTdHlsZUZvckRldGFpbChldmVudDphbnkscHJvcHM6SVN0eWxlRmllbGRQcm9wcyxjb250ZXh0OklDb250ZXh0KXtcbiAgICAgICAgY29uc3QgZWxlbSA9IGtpbnRvbmUuYXBwLnJlY29yZC5nZXRGaWVsZEVsZW1lbnQocHJvcHMuZmllbGQuY29kZSk7XG4gICAgICAgIGlmKCFlbGVtKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMuZ2V0Q29uZGl0aW9uKHByb3BzLmNvbmRpdGlvbik7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMuZ2V0Q29uZGl0aW9uUmVzdWx0KHRyZWUsY29udGV4dCk7XG4gICAgICAgIGlmKGNvbmRpdGlvblJlc3VsdCl7XG4gICAgICAgICAgICB0aGlzLnNldEZpZWxkU3R5bGUocHJvcHMsZWxlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuIDopqfooajnpLrmmYLjga7mm7jlvI/oqK3lrppcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHBhcmFtIHByb3BzIFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHNldFN0eWxlRm9yVmlldyhldmVudDphbnkscHJvcHM6SVN0eWxlRmllbGRQcm9wcyxjb250ZXh0OklDb250ZXh0KXtcbiAgICAgICAgY29uc3QgcmVjb3JkczpSZWNvcmRbXSA9IGV2ZW50LnJlY29yZHM7XG4gICAgICAgIGNvbnN0IGNlbGxzID0ga2ludG9uZS5hcHAuZ2V0RmllbGRFbGVtZW50cyhwcm9wcy5maWVsZC5jb2RlKTtcbiAgICAgICAgaWYoIWNlbGxzKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZWxlbSA6SFRNTEVsZW1lbnR8bnVsbDtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uVHJlZSA9IHRoaXMuZ2V0Q29uZGl0aW9uKHByb3BzLmNvbmRpdGlvbik7XG4gICAgICAgIHJlY29yZHMuZm9yRWFjaCgocmVjb3JkOlJlY29yZCxpbmRleDpudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJDb250ZXh0OklDb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlczpjb250ZXh0LnZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICByZWNvcmQ6cmVjb3JkLFxuICAgICAgICAgICAgICAgIGVycm9yczpjb250ZXh0LmVycm9yc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0ID0gdGhpcy5nZXRDb25kaXRpb25SZXN1bHQoY29uZGl0aW9uVHJlZSxjdXJyQ29udGV4dCk7XG4gICAgICAgICAgICBpZihjb25kaXRpb25SZXN1bHQpe1xuICAgICAgICAgICAgICAgIGVsZW0gPSBjZWxsc1tpbmRleF07XG4gICAgICAgICAgICAgICAgaWYocHJvcHMuYWxsUm93PT09XCLooYzlhajkvZNcIil7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBjZWxsc1tpbmRleF0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoZWxlbSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RmllbGRTdHlsZShwcm9wcyxlbGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcm9wcyBIdG1sRWxlbWVudOabuOW8j+ioreWumlxuICAgICAqL1xuICAgIHNldEZpZWxkU3R5bGUocHJvcHM6SVN0eWxlRmllbGRQcm9wcyxlbGVtOkhUTUxFbGVtZW50KXtcbiAgICAgICBcbiAgICAgICAgICAgIGlmKHByb3BzLmZvbnRDb2xvcil7XG4gICAgICAgICAgICAgICAgZWxlbS5zdHlsZS5jb2xvcj1wcm9wcy5mb250Q29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihwcm9wcy5iZ0NvbG9yKXtcbiAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmJhY2tncm91bmRDb2xvcj1wcm9wcy5iZ0NvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYocHJvcHMuZm9udFN0eWxlLmxlbmd0aD4wKXtcbiAgICAgICAgICAgICAgICBpZihwcm9wcy5mb250U3R5bGUuaW5jbHVkZXMoXCLmlpzkvZNcIikpe1xuICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmZvbnRTdHlsZT1cIml0YWxpY1wiO1xuICAgICAgICAgICAgICAgIH1cbiBcbiAgICAgICAgICAgICAgICBpZihwcm9wcy5mb250U3R5bGUuaW5jbHVkZXMoXCLlpKrlrZdcIikpe1xuICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSBcImJvbGRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHRleHREZWNvcmF0aW9uPVwiXCI7XG4gICAgICAgICAgICAgICAgaWYocHJvcHMuZm9udFN0eWxlLmluY2x1ZGVzKFwi5LiL57eaXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERlY29yYXRpb249XCJ1bmRlcmxpbmVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYocHJvcHMuZm9udFN0eWxlLmluY2x1ZGVzKFwi5omT44Gh5raI44GX57eaXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERlY29yYXRpb24gPSB0ZXh0RGVjb3JhdGlvbj8gdGV4dERlY29yYXRpb24gKyBcIiBsaW5lLXRocm91Z2hcIjpcImxpbmUtdGhyb3VnaFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZih0ZXh0RGVjb3JhdGlvbil7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uc3R5bGUudGV4dERlY29yYXRpb249dGV4dERlY29yYXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOadoeS7tuW8j+OCkuWun+ihjOOBmeOCi1xuICAgICAqIEBwYXJhbSB0cmVlIOadoeS7tuW8j+OCquODluOCuOOCp+OCr+ODiFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGdldENvbmRpdGlvblJlc3VsdCh0cmVlOkNvbmRpdGlvblRyZWV8bnVsbCwgY29udGV4dDphbnkpOmJvb2xlYW57XG4gICAgICAgIGlmKCF0cmVlKXtcbiAgICAgICAgICAgIC8v5p2h5Lu244KS6Kit5a6a44GV44KM44Gm44GE44G+44Gb44KTXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJlZS5ldmFsdWF0ZSh0cmVlLnJvb3QsY29udGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmRpdGlvbiDmnaHku7blvI/jg4Tjg6rjg7zjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGdldENvbmRpdGlvbihjb25kaXRpb246c3RyaW5nKTpDb25kaXRpb25UcmVlfG51bGx7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSBuZXcgQ29uZGl0aW9uVHJlZSgpO1xuICAgICAgICAgICAgdHJlZS5mcm9tSnNvbihjb25kaXRpb24pO1xuICAgICAgICAgICAgaWYodHJlZS5nZXRDb25kaXRpb25zKHRyZWUucm9vdCkubGVuZ3RoPjApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1jYXRjaChlcnJvcil7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgICAgICBhY3Rpb25BZGRpbnNbdGhpcy5uYW1lXT10aGlzO1xuICAgIH1cbn1cbm5ldyBTdHlsZUZpZWxkQWN0aW9uKCk7IiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IElBY3Rpb24sIElBY3Rpb25SZXN1bHQsIElBY3Rpb25Ob2RlLCBJQWN0aW9uUHJvcGVydHksIElGaWVsZCAsSUNvbnRleHQsIElWYXJOYW1lfSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcblxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcbiAqL1xuaW50ZXJmYWNlIElEYXRlVGltZUNhbGNQcm9wc3tcbiAgICB2ZXJOYW1lR2V0OnN0cmluZztcbiAgICBjYWxjT3B0aW9uOnN0cmluZztcbiAgICB2ZXJOYW1lOklWYXJOYW1lO1xuICAgIHllYXI6c3RyaW5nO1xuICAgIG1vbnRoOnN0cmluZztcbiAgICBkYXRlOnN0cmluZztcbiAgICBob3VyOnN0cmluZztcbiAgICBtaW51dGU6c3RyaW5nO1xuICAgIHNlY29uZDpzdHJpbmc7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGVUaW1lQ2FsY0FjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb257XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcbiAgICBwcm9wczpJRGF0ZVRpbWVDYWxjUHJvcHM7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgdGhpcy5uYW1lPVwi5pel5pmC44KS5Yqg566X77yP5rib566X44GZ44KLXCI7Ly8gRELjgavnmbvpjLLjgZfjgZ/jgqLjgq/jgrfjg6fjg7PlkI1cbiAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcz1bXTtcbiAgICAgICAgLy/jg5fjg63jg5Hjg4bjgqPlsZ7mgKfjga7liJ3mnJ/ljJZcbiAgICAgICAgdGhpcy5wcm9wcz17XG4gICAgICAgICAgICB2ZXJOYW1lR2V0OicnLFxuICAgICAgICAgICAgY2FsY09wdGlvbjonJyxcbiAgICAgICAgICAgIHZlck5hbWU6e25hbWU6Jyd9LFxuICAgICAgICAgICAgeWVhcjpcIjBcIixcbiAgICAgICAgICAgIG1vbnRoOlwiMFwiLFxuICAgICAgICAgICAgZGF0ZTpcIjBcIixcbiAgICAgICAgICAgIGhvdXI6XCIwXCIsXG4gICAgICAgICAgICBtaW51dGU6XCIwXCIsXG4gICAgICAgICAgICBzZWNvbmQ6XCIwXCJcbiAgICAgICAgfVxuICAgICAgICAvL+OCouOCr+OCt+ODp+ODs+OCkueZu+mMsuOBmeOCi1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Z+65rqW5pel44Go44Gq44KL5aSJ5pWw44Gu5YCk44GM44CB5pel5LuY44O75pel5pmC44Gu5b2i5byP44Gn44GC44KL44GL44CB5Yik5pat44GZ44KLXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVWYWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzRGF0ZVZhbHVlKGRhdGVWYWx1ZSA6c3RyaW5nKXtcbiAgICAgICAgbGV0IGRhdGU7XG5cbiAgICAgICAgLy/mraPopo/ooajnj77jg4Hjgqfjg4Pjgq9cbiAgICAgICAgbGV0IHNpbmdsZURpZ2l0TW9udGggPSBkYXRlVmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7MX0pLShcXGR7MX0pJC8pOy8vNOahgeOBruaVsOWtly0x5qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZdcbiAgICAgICAgbGV0IHR3b0RpZ2l0TW9udGggPSBkYXRlVmFsdWUubWF0Y2goLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pJC8pOy8vNOahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZdcbiAgICAgICAgbGV0IHNpbmdsZURpZ2l0RGF0ZSA9IGRhdGVWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsxfSkkLyk7Ly805qGB44Gu5pWw5a2XLTLmoYHjga7mlbDlrZctMeahgeOBruaVsOWtl1xuICAgICAgICBsZXQgdHdvRGlnaXREYXRlID0gZGF0ZVZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezF9KS0oXFxkezJ9KSQvKTsvLzTmoYHjga7mlbDlrZctMeahgeOBruaVsOWtly0y5qGB44Gu5pWw5a2XXG4gICAgICAgIGxldCBkYXRlVGltZU1pbGxpU2Vjb25kID0gZGF0ZVZhbHVlLm1hdGNoKC8oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KVQoXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KS4oXFxkezIsM30pWiQvKTsvL+aZguWIu+WFpeOCiuOBrlVUQ+OBruaXpeS7mOW9ouW8jyjjg5/jg6rnp5IpXG4gICAgICAgIGxldCBkYXRlVGltZSA9IGRhdGVWYWx1ZS5tYXRjaCgvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlUKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSlaJC8pOy8v5pmC5Yi75YWl44KK44GuVVRD44Gu5pel5LuY5b2i5byPXG5cbiAgICAgICAgLy9kYXRl5Z6L44Gr5aSJ5o+bXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vZGF0ZeWei+WkieaPm+OBp+OBjeOBn+OBi+eiuuiqjVxuICAgICAgICBpZihkYXRlICE9PSB1bmRlZmluZWQgJiYgIWlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSl7XG4gICAgICAgICAgICAvL+ato+imj+ihqOePvuODgeOCp+ODg+OCr+eiuuiqjVxuICAgICAgICAgICAgaWYodHdvRGlnaXRNb250aCA9PT0gbnVsbCAmJiBzaW5nbGVEaWdpdE1vbnRoID09PSBudWxsICYmIHNpbmdsZURpZ2l0RGF0ZSA9PT0gbnVsbCAmJiB0d29EaWdpdERhdGUgPT09IG51bGwgJiYgZGF0ZVRpbWUgPT09IG51bGwgJiYgZGF0ZVRpbWVNaWxsaVNlY29uZCA9PT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi6KiI566X44Gu5Z+65rqW5pel44Go44Gq44KL5YCk44GM44CB6YGp5YiH44Gq5pel5LuY44O75pel5pmC44Gu5b2i5byP44Gn44Gv44GC44KK44G+44Gb44KT44CC44CM5pel5pmC44KS5Yqg566XL+a4m+eul+OBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlgKTjgpLmlbDlgKTjgavlpInmj5vjgZnjgotcbiAgICAgKiBAcGFyYW0ge2FueX0gY29udGV4dFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxjVmFsdWUsY2FsY09wdGlvblxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgdmFsdWVUb051bWJlcihjb250ZXh0IDphbnksY2FsY1ZhbHVlIDpzdHJpbmcsY2FsY09wdGlvbiA6c3RyaW5nKTogbnVtYmVye1xuXG4gICAgICAgIGNvbnN0IGdldENvbnRleHRWYXJCeVBhdGggPSAob2JqOiBhbnksIHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoXCIuXCIpLnJlZHVjZSgobywgaykgPT4gKG8gfHwge30pW2tdLCBvYmopO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8v6KiI566X5YCk44GM5aSJ5pWw44Gu5aC05ZCI44Gv44CB5aSJ5pWw44Gu5YCk44KS5Y+W5b6XXG4gICAgICAgIGlmKGNhbGNPcHRpb24gPT09IFwi5aSJ5pWwXCIgJiYgaXNOYU4oTnVtYmVyKGNhbGNWYWx1ZSkpKXtcbiAgICAgICAgICAgIGNhbGNWYWx1ZSA9IGdldENvbnRleHRWYXJCeVBhdGggKGNvbnRleHQudmFyaWFibGVzLGNhbGNWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL+aVsOWApOWei+OBq+WkieaPm1xuICAgICAgICBsZXQgbnVtYmVyID0gTnVtYmVyKGNhbGNWYWx1ZSk7XG5cbiAgICAgICAgLy/mnInpmZDmlbDjgYvjganjgYbjgYvliKTlrppcbiAgICAgICAgaWYoIWlzRmluaXRlKG51bWJlcikpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi6KiI566X5YCk44GM44CB5pWw5YCk44Gn44Gv44GC44KK44G+44Gb44KT44CC44CM5pel5pmC44KS5Yqg566XL+a4m+eul+OBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaXpeS7mOODu+aXpeaZguOCkuWKoOeul+ODu+a4m+eul+OBmeOCi1xuICAgICAqIEBwYXJhbSB7YW55fSBkYXRlVmFsdWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geWVhciBtb250aCBkYXkgaG91ciBtaW51dGUgc2Vjb25kXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBjYWxjRGF0ZShkYXRlVmFsdWU6YW55LHllYXI6bnVtYmVyLG1vbnRoOm51bWJlcixkYXRlOm51bWJlcixob3VyOm51bWJlcixtaW51dGU6bnVtYmVyLHNlY29uZDpudW1iZXIpOnN0cmluZ3tcblxuICAgICAgICBsZXQgY2FsY1Jlc3VsdDtcbiAgICAgICAgLy/jg5XjgqPjg7zjg6vjg4njga7lgKTvvIjmloflrZfliJfvvInjgpJkYXRl5Z6L44Gr5aSJ5o+b44GZ44KLXG4gICAgICAgIGRhdGVWYWx1ZSA9IG5ldyBEYXRlKGRhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8g5bm044KS6KiI566XXG4gICAgICAgIGRhdGVWYWx1ZS5zZXRGdWxsWWVhcihkYXRlVmFsdWUuZ2V0RnVsbFllYXIoKSt5ZWFyKTtcbiAgICAgICAgLy/mnIjjgpLoqIjnrpdcbiAgICAgICAgZGF0ZVZhbHVlLnNldE1vbnRoKGRhdGVWYWx1ZS5nZXRNb250aCgpK21vbnRoKTtcbiAgICAgICAgLy/ml6XjgpLoqIjnrpdcbiAgICAgICAgZGF0ZVZhbHVlLnNldERhdGUoZGF0ZVZhbHVlLmdldERhdGUoKStkYXRlKTtcbiAgICAgICAgLy/mmYLplpPjgpLoqIjnrpdcbiAgICAgICAgZGF0ZVZhbHVlLnNldEhvdXJzKGRhdGVWYWx1ZS5nZXRIb3VycygpK2hvdXIpO1xuICAgICAgICAvL+WIhuOCkuioiOeul1xuICAgICAgICBkYXRlVmFsdWUuc2V0TWludXRlcyhkYXRlVmFsdWUuZ2V0TWludXRlcygpK21pbnV0ZSk7XG4gICAgICAgIC8v56eS44KS6KiI566XXG4gICAgICAgIGRhdGVWYWx1ZS5zZXRTZWNvbmRzKGRhdGVWYWx1ZS5nZXRTZWNvbmRzKCkrc2Vjb25kKTtcblxuICAgICAgICAvL1VUQ+W9ouW8j+OBq+WkieaPm1xuICAgICAgICBjYWxjUmVzdWx0ID0gZGF0ZVZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBjYWxjUmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlXG4gICAgICogQHBhcmFtIGV2ZW50XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBhc3luYyBwcm9jZXNzKGFjdGlvbk5vZGU6SUFjdGlvbk5vZGUsZXZlbnQ6YW55LGNvbnRleHQ6SUNvbnRleHQpOlByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xuICAgICAgICBsZXQgcmVzdWx0PXtcbiAgICAgICAgICAgIGNhbk5leHQ6dHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDpmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICAvL+WxnuaAp+ioreWumuOCkuWPluW+l+OBmeOCi1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJRGF0ZVRpbWVDYWxjUHJvcHM7XG5cbiAgICAgICAgICAgIGNvbnN0IGdldENvbnRleHRWYXJCeVBhdGggPSAob2JqOiBhbnksIHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLnNwbGl0KFwiLlwiKS5yZWR1Y2UoKG8sIGspID0+IChvIHx8IHt9KVtrXSwgb2JqKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8v5Z+65rqW5pel44Go44Gq44KL5aSJ5pWw44Gu5YCk5Y+W5b6XXG4gICAgICAgICAgICBjb25zdCBkYXRlVmFsdWUgPSBnZXRDb250ZXh0VmFyQnlQYXRoIChjb250ZXh0LnZhcmlhYmxlcyx0aGlzLnByb3BzLnZlck5hbWVHZXQpO1xuXG4gICAgICAgICAgICAvL+Wfuua6luaXpeOBqOOBquOCi+WkieaVsOOBruWApOOBjOepuuOBruWgtOWQiOOAgeWHpueQhuOCkue1guS6huOBmeOCi1xuICAgICAgICAgICAgaWYoIWRhdGVWYWx1ZSl7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi5Z+65rqW5YCk44Go44Gq44KL5aSJ5pWw44Gu5YCk44GM56m644CB44G+44Gf44Gv5a2Y5Zyo44GX44G+44Gb44KT44CC44CM5pel5pmC44KS5Yqg566XL+a4m+eul+OBmeOCi+OAjeOCs+ODs+ODneODvOODjeODs+ODiOOBruWHpueQhuOCkuS4reaWreOBl+OBvuOBl+OBn+OAglwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNoZWNrRGF0ZVZhbHVlO1xuICAgICAgICAgICAgLy/ln7rmupblgKTjgajjgarjgovlpInmlbDjga7lgKTjgIHml6XmmYLjgIHml6Xku5jlvaLlvI/jgYvnorroqo3jgZnjgotcbiAgICAgICAgICAgIGNoZWNrRGF0ZVZhbHVlID0gdGhpcy5pc0RhdGVWYWx1ZShkYXRlVmFsdWUpO1xuXG4gICAgICAgICAgICBpZihjaGVja0RhdGVWYWx1ZSl7XG4gICAgICAgICAgICAgICAgLy/oqIjnrpflgKTjga7lhaXlipvmlrnms5XjgpLlj5blvpfjgZnjgotcbiAgICAgICAgICAgICAgICBsZXQgY2FsY09wdGlvbnMgPSB0aGlzLnByb3BzLmNhbGNPcHRpb247XG5cbiAgICAgICAgICAgICAgICAvL+ioiOeul+WApOOCkuaVsOWApOWei+OBq+WkieaPm+OBmeOCi1xuICAgICAgICAgICAgICAgIGxldCB5ZWFyID0gdGhpcy52YWx1ZVRvTnVtYmVyKGNvbnRleHQsdGhpcy5wcm9wcy55ZWFyLGNhbGNPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBsZXQgbW9udGggPSB0aGlzLnZhbHVlVG9OdW1iZXIoY29udGV4dCx0aGlzLnByb3BzLm1vbnRoLGNhbGNPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IHRoaXMudmFsdWVUb051bWJlcihjb250ZXh0LHRoaXMucHJvcHMuZGF0ZSxjYWxjT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgbGV0IGhvdXIgPSB0aGlzLnZhbHVlVG9OdW1iZXIoY29udGV4dCx0aGlzLnByb3BzLmhvdXIsY2FsY09wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGxldCBtaW51dGUgPSB0aGlzLnZhbHVlVG9OdW1iZXIoY29udGV4dCx0aGlzLnByb3BzLm1pbnV0ZSxjYWxjT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgbGV0IHNlY29uZCA9IHRoaXMudmFsdWVUb051bWJlcihjb250ZXh0LHRoaXMucHJvcHMuc2Vjb25kLGNhbGNPcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8v6KiI566X57WQ5p6c44Gu5pel5LuY44KS5qC857SN44GZ44KL5aSJ5pWwXG4gICAgICAgICAgICAgICAgbGV0IGNhbGN1bGF0ZWREYXRlO1xuXG4gICAgICAgICAgICAgICAgLy/ml6Xku5jjgpLliqDnrpfjgIHmuJvnrpfjgZnjgotcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkRGF0ZSA9IHRoaXMuY2FsY0RhdGUoZGF0ZVZhbHVlLHllYXIsbW9udGgsZGF0ZSxob3VyLG1pbnV0ZSxzZWNvbmQpO1xuXG4gICAgICAgICAgICAgICAgLy/oqIjnrpfntZDmnpzjgpLlpInmlbDjgavku6PlhaXjgZnjgotcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV0gPSBjYWxjdWxhdGVkRGF0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0PSB7XG4gICAgICAgICAgICBjYW5OZXh0OnRydWUsXG4gICAgICAgICAgICByZXN1bHQ6dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfWNhdGNoKGVycm9yKXtcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xuICAgICAgICAgICAgcmVzdWx0LmNhbk5leHQ9ZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZWdpc3RlcigpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV09dGhpcztcbiAgICB9XG59XG5uZXcgRGF0ZVRpbWVDYWxjQWN0aW9uKCk7XG4iLCJpbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLlwiO1xyXG5pbXBvcnQgeyBJQWN0aW9uLCBJQWN0aW9uUmVzdWx0LCBJQWN0aW9uTm9kZSwgSUFjdGlvblByb3BlcnR5LCBJRmllbGQgLElDb250ZXh0LCBJVmFyTmFtZX0gZnJvbSBcIi4uL3R5cGVzL0FjdGlvblR5cGVzXCI7XHJcbi8qKlxyXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7lsZ7mgKflrprnvqlcclxuICovXHJcbmludGVyZmFjZSBJRW5kT2ZNb250aFByb3BzIHtcclxuICAgIHZlck5hbWVHZXQ6c3RyaW5nO1xyXG4gICAgdmVyTmFtZTpJVmFyTmFtZTtcclxufVxyXG4vKipcclxuICog5pyI5pyr566X5Ye644Ki44Kv44K344On44OzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRW5kT2ZNb250aEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24ge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgYWN0aW9uUHJvcHM6IElBY3Rpb25Qcm9wZXJ0eVtdO1xyXG4gICAgcHJvcHM6IElFbmRPZk1vbnRoUHJvcHM7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIuaciOacq+eul+WHulwiO1xyXG4gICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcclxuICAgICAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICAgICAgICB2ZXJOYW1lR2V0OicnLFxyXG4gICAgICAgICAgICB2ZXJOYW1lOntuYW1lOicnfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOOCouOCr+OCt+ODp+ODs+OBruWun+ihjOOCkuWRvOOBs+WHuuOBmVxyXG4gICAgICogQHBhcmFtIGFjdGlvbk5vZGUgXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcHJvY2VzcyhhY3Rpb25Ob2RlOiBJQWN0aW9uTm9kZSwgZXZlbnQ6IGFueSxjb250ZXh0OklDb250ZXh0KTogUHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgY2FuTmV4dDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzdWx0OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy/lsZ7mgKfoqK3lrprjgpLlj5blvpfjgZnjgotcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XHJcbiAgICAgICAgICAgIGlmICghKCd2ZXJOYW1lJyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSAmJiAhKCd2ZXJOYW1lR2V0JyBpbiBhY3Rpb25Ob2RlLkFjdGlvblZhbHVlKSApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb3BzID0gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSBhcyBJRW5kT2ZNb250aFByb3BzO1xyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgLy/mnKznlarjgrPjg7zjg4nplovlp4vvvJpcclxuICAgICAgICAgICAgLy/lj5blvpflpInmlbDjga7lgKTjgpLlkbzjgbPlh7rjgZfjgabku6PlhaXjgZnjgovvvJpcclxuICAgICAgICAgICAgY29uc3QgZ2V0Q29udGV4dFZhckJ5UGF0aCA9IChvYmo6IGFueSwgcGF0aDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5zcGxpdChcIi5cIikucmVkdWNlKChvLCBrKSA9PiAobyB8fCB7fSlba10sIG9iaik7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGxldCB2ZXJOYW1lR2V0VmFsdWUgPSBnZXRDb250ZXh0VmFyQnlQYXRoKGNvbnRleHQudmFyaWFibGVzLHRoaXMucHJvcHMudmVyTmFtZUdldCk7XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICAgICAgICAgICAvL+WPluW+l+WkieaVsOOBruWApERhdGXjgqrjg5bjgrjjgqfjgq/jg4jjgavlpInmj5vvvJpcclxuICAgICAgICAgICAgbGV0IGRhdGVPYmogPSBuZXcgRGF0ZSh2ZXJOYW1lR2V0VmFsdWUpO1xyXG4gICAgICAgICAgICAvLyDmnIjmnKvjgpLoqIjnrpdcclxuICAgICAgICAgICAgbGV0IHllYXIgPSBkYXRlT2JqLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgICAgICAgIGxldCBtb250aCA9IGRhdGVPYmouZ2V0TW9udGgoKSArIDE7IC8v5pyI44GvMOOBi+OCieWni+OBvuOCi+OBn+OCgeOAgTHjgpLotrPjgZlcclxuICAgICAgICAgICAgbGV0IGxhc3REYXlPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApOyAvLyDnv4zmnIjjga4w5pel55uu44Gv5LuK5pyI44Gu5pyI5pyrXHJcbiAgICAgICAgICAgIGlmKHRoaXMucHJvcHMudmVyTmFtZSAmJiB0aGlzLnByb3BzLnZlck5hbWUubmFtZSE9PScnKXtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQudmFyaWFibGVzW3RoaXMucHJvcHMudmVyTmFtZS5uYW1lXT1sYXN0RGF5T2ZNb250aC50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1jYXRjaChlcnJvcil7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xyXG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG59XHJcbm5ldyBFbmRPZk1vbnRoQWN0aW9uKCk7IiwiaW1wb3J0IHsgYWN0aW9uQWRkaW5zIH0gZnJvbSBcIi5cIjtcclxuaW1wb3J0IHsgSUFjdGlvbiwgSUFjdGlvblJlc3VsdCwgSUFjdGlvbk5vZGUsIElBY3Rpb25Qcm9wZXJ0eSwgSUZpZWxkICxJQ29udGV4dCwgSVZhck5hbWV9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xyXG4vKipcclxuICog44Ki44Kv44K344On44Oz44Gu5bGe5oCn5a6a576pXHJcbiAqL1xyXG5pbnRlcmZhY2UgSURhdGVTcGVjaWZpZWRQcm9wcyB7XHJcbiAgICB2ZXJOYW1lR2V0OnN0cmluZztcclxuICAgIG5ld1llYXI6bnVtYmVyO1xyXG4gICAgbmV3TW9udGg6bnVtYmVyO1xyXG4gICAgbmV3RGF5Om51bWJlcjtcclxuICAgIHZlck5hbWU6SVZhck5hbWU7XHJcbn1cclxuLyoqXHJcbiAqIOaXpeS7mOaMh+WumuOCouOCr+OCt+ODp+ODs1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERhdGVTcGVjaWZpZWRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGFjdGlvblByb3BzOiBJQWN0aW9uUHJvcGVydHlbXTtcclxuICAgIHByb3BzOiBJRGF0ZVNwZWNpZmllZFByb3BzO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCLml6Xku5jmjIflrppcIjtcclxuICAgICAgICB0aGlzLmFjdGlvblByb3BzID0gW107XHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHtcclxuICAgICAgICAgICAgdmVyTmFtZUdldDonJyxcclxuICAgICAgICAgICAgbmV3WWVhcjowLFxyXG4gICAgICAgICAgICBuZXdNb250aDowLFxyXG4gICAgICAgICAgICBuZXdEYXk6MCxcclxuICAgICAgICAgICAgdmVyTmFtZTp7bmFtZTonJ31cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDjgqLjgq/jgrfjg6fjg7Pjga7lrp/ooYzjgpLlkbzjgbPlh7rjgZlcclxuICAgICAqIEBwYXJhbSBhY3Rpb25Ob2RlIFxyXG4gICAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHByb2Nlc3MoYWN0aW9uTm9kZTogSUFjdGlvbk5vZGUsIGV2ZW50OiBhbnksY29udGV4dDpJQ29udGV4dCk6IFByb21pc2U8SUFjdGlvblJlc3VsdD4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIGNhbk5leHQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8v5bGe5oCn6Kit5a6a44KS5Y+W5b6X44GZ44KLXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBhY3Rpb25Ob2RlLmFjdGlvblByb3BzO1xyXG4gICAgICAgICAgICBpZiAoISgndmVyTmFtZScgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgJiYgISgndmVyTmFtZUdldCcgaW4gYWN0aW9uTm9kZS5BY3Rpb25WYWx1ZSkgKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSURhdGVTcGVjaWZpZWRQcm9wcztcclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgICAgICAgICAgIC8v5pys55Wq44Kz44O844OJ6ZaL5aeL77yaXHJcbiAgICAgICAgICAgIC8v5Y+W5b6X5aSJ5pWw44Gu5YCk44KS5ZG844Gz5Ye644GX44Gm5Luj5YWl44GZ44KL77yaXHJcbiAgICAgICAgICAgIGNvbnN0IGdldENvbnRleHRWYXJCeVBhdGggPSAob2JqOiBhbnksIHBhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoXCIuXCIpLnJlZHVjZSgobywgaykgPT4gKG8gfHwge30pW2tdLCBvYmopO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBsZXQgdmVyTmFtZUdldFZhbHVlID0gZ2V0Q29udGV4dFZhckJ5UGF0aChjb250ZXh0LnZhcmlhYmxlcyx0aGlzLnByb3BzLnZlck5hbWVHZXQpO1xyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgICAgICAgICAgLy/lj5blvpflpInmlbDjga7lgKREYXRl44Kq44OW44K444Kn44Kv44OI44Gr5aSJ5o+b77yaXHJcbiAgICAgICAgICAgIGxldCBkYXRlT2JqID0gbmV3IERhdGUodmVyTmFtZUdldFZhbHVlKTtcclxuICAgICAgICAgICAgaWYodmVyTmFtZUdldFZhbHVlID09PSB1bmRlZmluZWQgfHwgdmVyTmFtZUdldFZhbHVlID09PSBudWxsIHx8IHZlck5hbWVHZXRWYWx1ZSA9PT0gJycgfHwgaXNOYU4oZGF0ZU9iai5nZXREYXRlKCkpKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcclxuICAgICAgICAgICAgfSAgICAgICAgICBcclxuICAgICAgICAgICAgLy8g5bm044Gu6Kit5a6a77yIbmV3WWVhcuOBjOioreWumuOBleOCjOOBpuOBhOOBquOBhOWgtOWQiOOBr+OAgeWFg+OBruWApOOCkuS9v+eUqO+8iVxyXG4gICAgICAgICAgICBkYXRlT2JqLnNldEZ1bGxZZWFyKHRoaXMucHJvcHMubmV3WWVhciA+PTE5MDAgJiYgdGhpcy5wcm9wcy5uZXdZZWFyIDw9OTk5OSA/IHRoaXMucHJvcHMubmV3WWVhciA6IGRhdGVPYmouZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgICAgICAgIC8vIOaciOOBruioreWumu+8iG5ld01vbnRo44GM6Kit5a6a44GV44KM44Gm44GE44Gq44GE5aC05ZCI44Gv44CB5YWD44Gu5YCk44KS5L2/55So77yJLy8g5pyI44GvMOWni+OBvuOCiuOBquOBruOBp+OAgTEy5pyI44GvMTHjgIJcclxuICAgICAgICAgICAgZGF0ZU9iai5zZXRNb250aCh0aGlzLnByb3BzLm5ld01vbnRoID49MSAmJiB0aGlzLnByb3BzLm5ld01vbnRoIDw9MTIgPyB0aGlzLnByb3BzLm5ld01vbnRoLTEgIDogZGF0ZU9iai5nZXRNb250aCgpKTtcclxuICAgICAgICAgICAgLy8g5pel44Gu6Kit5a6a77yIbmV3RGF544GM6Kit5a6a44GV44KM44Gm44GE44Gq44GE5aC05ZCI44Gv44CB5YWD44Gu5YCk44KS5L2/55So77yJXHJcbiAgICAgICAgICAgIGRhdGVPYmouc2V0RGF0ZSh0aGlzLnByb3BzLm5ld0RheSA+PTEgJiYgdGhpcy5wcm9wcy5uZXdEYXkgPD0zMSA/dGhpcy5wcm9wcy5uZXdEYXkgOiBkYXRlT2JqLmdldERhdGUoKSk7XHJcbiAgICAgICAgICAgIC8vIOWkieaVsOOBq+aWsOOBl+OBhOWApOOCkuioreWumlxyXG4gICAgICAgICAgICBpZih0aGlzLnByb3BzLnZlck5hbWUgJiYgdGhpcy5wcm9wcy52ZXJOYW1lLm5hbWUhPT0nJyl7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZhcmlhYmxlc1t0aGlzLnByb3BzLnZlck5hbWUubmFtZV09ZGF0ZU9iai50b0lTT1N0cmluZygpO1xyXG4gICAgICAgICAgICB9XHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBjYW5OZXh0OnRydWUsXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ6dHJ1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1jYXRjaChlcnJvcil7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLmhhbmRsZUVycm9yKGVycm9yLGFjdGlvbk5vZGUpO1xyXG4gICAgICAgICAgICByZXN1bHQuY2FuTmV4dD1mYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmVnaXN0ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xyXG4gICAgfVxyXG59XHJcbm5ldyBEYXRlU3BlY2lmaWVkQWN0aW9uKCk7IiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5Jztcbi8qKlxuICog55S76Z2i5Yem55CG5Lit44GuTG9hZGRpbmfooajnpLpcbiAqL1xuZXhwb3J0IGNsYXNzIFNuaXBwZXIge1xuICAgIHByaXZhdGUgc3Bpbm5lckVsZW1lbnQ6IEpRdWVyeTxIVE1MRWxlbWVudD47O1xuICAgIHByaXZhdGUgY29udGFpbmVyIDpKUXVlcnk8SFRNTEVsZW1lbnQ+O1xuICAgIGNvbnN0cnVjdG9yKHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gJChzZWxlY3Rvcj8/J2JvZHknKTtcbiAgICAgIHRoaXMuc3Bpbm5lckVsZW1lbnQ9dGhpcy5jcmVhdGVTcGlubmVyKCk7XG4gICAgfVxuICBcbiAgICBjcmVhdGVTcGlubmVyKCkge1xuICAgICAgY29uc3QgaHRtbCA9W1xuICAgICAgICAnPGRpdiBjbGFzcz1cImJzLXNjb3BlIGFsYy1sb2FkaW5nIGFsYy1kbm9uZVwiPicsXG4gICAgICAgICc8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXJcIiBzdHlsZT1cIndpZHRoOiAzcmVtOyBoZWlnaHQ6IDNyZW07XCIgcm9sZT1cInN0YXR1c1wiPicsXG4gICAgICAgICc8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPjwvc3Bhbj4nLFxuICAgICAgICAnPC9kaXY+PC9kaXY+J1xuICAgICAgICBdLmpvaW4oXCJcIik7XG4gICAgICBjb25zdCBzcGlubmVyID0gJChodG1sKTtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzcGlubmVyKTtcbiAgICAgIHJldHVybiBzcGlubmVyO1xuICAgIH1cbiAgXG4gICAgcmVtb3ZlU3Bpbm5lcigpIHtcbiAgICAgICAgdGhpcy5zcGlubmVyRWxlbWVudC5yZW1vdmUoKTtcbiAgICB9XG4gIFxuICAgIHNob3dTcGlubmVyKCkge1xuICAgICAgICB0aGlzLnNwaW5uZXJFbGVtZW50LnJlbW92ZUNsYXNzKCdhbGMtZG5vbmUnKTtcbiAgICB9XG4gIFxuICAgIGhpZGVTcGlubmVyKCkge1xuICAgICAgICB0aGlzLnNwaW5uZXJFbGVtZW50LmFkZENsYXNzKCdhbGMtZG5vbmUnKTtcbiAgICB9XG4gIH1cbiAgIiwiLyoqXG4gKiDjg5rjg7zjgrjjga7nqK7poZ7jgpLooajjgZnlnotcbiAqL1xuZXhwb3J0IHR5cGUgUGFnZVR5cGUgPSAnYXBwJyB8ICdzaG93JyB8ICdlZGl0JyB8ICdvdGhlcic7XG5cbi8qKlxuICogc2hvd+ODmuODvOOCuOOBruODouODvOODieOCkuihqOOBmeWei1xuICovXG5leHBvcnQgdHlwZSBTaG93UGFnZU1vZGUgPSAnc2hvdycgfCAnZWRpdCcgfCBudWxsO1xuXG4vKipcbiAqIOODmuODvOOCuOOBrueKtuaFi+OCkuihqOOBmeOCpOODs+OCv+ODvOODleOCp+ODvOOCuVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTdGF0ZSB7XG4gIHR5cGU6IFBhZ2VUeXBlO1xuICBtb2RlOiBTaG93UGFnZU1vZGU7XG59XG5cbi8qKlxuICogVVJM44Gu54m55a6a44Gu44K744Kw44Oh44Oz44OI44KS5Y+W5b6X44GZ44KLXG4gKiBAcGFyYW0gdXJsIOWIhuaekOWvvuixoeOBrlVSTFxuICogQHBhcmFtIGluZGV4IOWPluW+l+OBl+OBn+OBhOOCu+OCsOODoeODs+ODiOOBruOCpOODs+ODh+ODg+OCr+OCue+8iOiyoOOBruaVsOOBr+acq+WwvuOBi+OCieOBruOCpOODs+ODh+ODg+OCr+OCue+8iVxuICovXG5jb25zdCBnZXRTZWdtZW50ID0gKHVybDogVVJMLCBpbmRleDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2VnbWVudHMgPSB1cmwucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBzZWdtZW50cy5hdChpbmRleCkgPz8gJyc7XG59O1xuXG4vKipcbiAqIFVSTOOBqOOCouODl+ODqklE44Gr5Z+644Gl44GE44Gm54++5Zyo44Gu44Oa44O844K444Gu54q25oWL44KS5Yik5pat44GZ44KLXG4gKiBAcGFyYW0gdXJsIOWIhuaekOWvvuixoeOBrlVSTFxuICogQHBhcmFtIGFwcElkIOeiuuiqjeOBmeOCi+OCouODl+ODqklEXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQYWdlU3RhdGUgPSAodXJsOiBzdHJpbmcsIGFwcElkOiBzdHJpbmcpOiBQYWdlU3RhdGUgPT4ge1xuICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gZ2V0U2VnbWVudChwYXJzZWRVcmwsIC0xKTtcbiAgY29uc3Qgc2Vjb25kTGFzdFNlZ21lbnQgPSBnZXRTZWdtZW50KHBhcnNlZFVybCwgLTIpO1xuXG4gIGlmIChsYXN0U2VnbWVudCA9PT0gYXBwSWQgJiYgL15cXGQrJC8udGVzdChhcHBJZCkpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnYXBwJywgbW9kZTogbnVsbCB9O1xuICB9XG5cbiAgaWYgKGxhc3RTZWdtZW50LnRvTG93ZXJDYXNlKCkgPT09ICdzaG93JyAmJiBzZWNvbmRMYXN0U2VnbWVudCA9PT0gYXBwSWQgJiYgL15cXGQrJC8udGVzdChhcHBJZCkpIHtcbiAgICBjb25zdCBtb2RlID0gcGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5nZXQoJ21vZGUnKTtcbiAgICByZXR1cm4geyBcbiAgICAgIHR5cGU6ICdzaG93JywgXG4gICAgICBtb2RlOiAobW9kZSA9PT0gJ3Nob3cnIHx8IG1vZGUgPT09ICdlZGl0JykgPyBtb2RlIDogbnVsbCBcbiAgICB9O1xuICB9XG5cbiAgaWYgKGxhc3RTZWdtZW50LnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0JyAmJiBzZWNvbmRMYXN0U2VnbWVudCA9PT0gYXBwSWQgJiYgL15cXGQrJC8udGVzdChhcHBJZCkpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnZWRpdCcsIG1vZGU6IG51bGwgfTtcbiAgfVxuXG4gIHJldHVybiB7IHR5cGU6ICdvdGhlcicsIG1vZGU6IG51bGwgfTtcbn07XG5cbi8qKlxuICog54++5Zyo44Gu44Oa44O844K444Gu54q25oWL44KS5Yik5pat44GZ44KL77yI54++5Zyo44GuVVJM44KS5L2/55So77yJXG4gKiBAcGFyYW0gYXBwSWQg56K66KqN44GZ44KL44Ki44OX44OqSURcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRQYWdlU3RhdGUgPSAoYXBwSWQ6IHN0cmluZyk6IFBhZ2VTdGF0ZSA9PiBcbiAgZ2V0UGFnZVN0YXRlKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBhcHBJZCk7XG5cbi8qKlxuICogVVJM44KS5q2j6KaP5YyW44GZ44KL77yI5pyr5bC+44Gu44K544Op44OD44K344Ol44KS5YmK6Zmk77yJXG4gKiBAcGFyYW0gdXJsIOato+imj+WMluWvvuixoeOBrlVSTFxuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplVXJsID0gKHVybDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICBwYXJzZWRVcmwucGF0aG5hbWUgPSBwYXJzZWRVcmwucGF0aG5hbWUucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgcmV0dXJuIHBhcnNlZFVybC50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBVUkzjgpLlronlhajjgavop6PmnpDjgZnjgotcbiAqIEBwYXJhbSB1cmwg6Kej5p6Q5a++6LGh44GuVVJM5paH5a2X5YiXXG4gKi9cbmV4cG9ydCBjb25zdCBzYWZlUGFyc2VVcmwgPSAodXJsOiBzdHJpbmcpOiBVUkwgfCBudWxsID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuIiwiaW1wb3J0IHtJRmllbGQsSUFjdGlvbk5vZGV9IGZyb20gXCIuLi90eXBlcy9BY3Rpb25UeXBlc1wiO1xuaW1wb3J0IHsgS2ludG9uZVJlc3RBUElDbGllbnQgfSBmcm9tIFwiQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50XCI7XG5pbXBvcnQgeyBnZXRQYWdlU3RhdGUgfSBmcm9tIFwiLi4vdXRpbC91cmxcIjtcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBSZWNvcmQgYXMgS1RSZWNvcmQgfSBmcm9tIFwiQGtpbnRvbmUvcmVzdC1hcGktY2xpZW50L2xpYi9zcmMvY2xpZW50L3R5cGVzXCI7XG5cblxuLy8g6ZqO5bGk5YyW44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Gu6Kit5a6a44Kk44Oz44K/44O844OV44Kn44O844K5XG5leHBvcnQgaW50ZXJmYWNlIElDYXNjYWRpbmdEcm9wRG93biB7XG4gIHNvdXJjZUFwcDogSUFwcDtcbiAgZHJvcERvd25BcHA6IElBcHA7XG4gIGZpZWxkTGlzdDogSUZpZWxkTGlzdFtdO1xufVxuXG4vLyDjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PjgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrlcbmV4cG9ydCBpbnRlcmZhY2UgSUFwcCB7XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbn1cbi8vIOODleOCo+ODvOODq+ODieODquOCueODiOOCpOODs+OCv+ODvOODleOCp+ODvOOCuVxuZXhwb3J0IGludGVyZmFjZSBJRmllbGRMaXN0IHtcbiAgc291cmNlOiBJRmllbGQ7XG4gIGRyb3BEb3duOiBJRmllbGQ7XG59XG5cblxuLy8g44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Gu6L6e5pu444K/44Kk44OX44CB44OJ44Ot44OD44OX44OA44Km44Oz44Kq44OX44K344On44Oz44Gu5qSc57Si44KS6auY6YCf5YyW44GZ44KL44Gf44KB44Gr5L2/55SoXG50eXBlIERyb3Bkb3duRGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuLy8g44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Gu5Yem55CG44Kv44Op44K5XG5leHBvcnQgY2xhc3MgRHJvcERvd25NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBkaWN0aW9uYXJ5OiBEcm9wZG93bkRpY3Rpb25hcnkgPSB7fTtcbiAgcHJpdmF0ZSBzdGF0ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHNlbGVjdHM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjb2x1bW5NYXA6IE1hcDxIVE1MRWxlbWVudCwgSUZpZWxkTGlzdD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgY29sdW1NYXBWYWx1ZUFycmF5OiBJRmllbGRMaXN0W10gPSBbXTtcbiAgcHJpdmF0ZSBjb2x1bU1hcEFycmF5OiBbSFRNTEVsZW1lbnQsIElGaWVsZExpc3RdW10gPSBbXTtcbiAgcHJpdmF0ZSBwcm9wcyA6SUNhc2NhZGluZ0Ryb3BEb3duO1xuICBwcml2YXRlIGV2ZW50OkV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJQ2FzY2FkaW5nRHJvcERvd24sZXZlbnQ6YW55KXtcbiAgICB0aGlzLnByb3BzPXByb3BzO1xuICAgIHRoaXMuZXZlbnQ9ZXZlbnQ7XG4gIH1cblxuICAvLyDliJ3mnJ/ljJbjg6Hjgr3jg4Pjg4lcbiAgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IEtpbnRvbmVSZXN0QVBJQ2xpZW50KCk7XG4gICAgICBjb25zdCBzb3VyY2VBcHBJZCA9IHRoaXMucHJvcHMuc291cmNlQXBwLmlkO1xuICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5wcm9wcy5maWVsZExpc3QubWFwKChmKSA9PiBmLnNvdXJjZS5jb2RlKTtcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBjbGllbnQucmVjb3JkLmdldEFsbFJlY29yZHMoe1xuICAgICAgICBhcHA6IHNvdXJjZUFwcElkLFxuICAgICAgICBmaWVsZHMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGljdGlvbmFyeSA9dGhpcy5idWlsZERyb3Bkb3duRGljdGlvbmFyeShyZWNvcmRzLCB0aGlzLnByb3BzLmZpZWxkTGlzdCk7XG4gICAgICAvLyBjb25zdCBoYXNoID0gYXdhaXQgdGhpcy5jYWxjdWxhdGVIYXNoKHJlY29yZHMsIHRoaXMuYWN0aW9uTm9kZSk7XG4gICAgICAvLyBjb25zdCBzdG9yYWdlS2V5ID0gYGRyb3Bkb3duX2RpY3Rpb25hcnk6OiR7dGhpcy5wcm9wcy5kcm9wRG93bkFwcC5pZH1fJHtoYXNofWA7XG5cbiAgICAgIC8vIGNvbnN0IGxzRGljdGlvbmFyeSA9IHRoaXMuZ2V0RnJvbUxvY2FsU3RvcmFnZShzdG9yYWdlS2V5KTtcbiAgICAgIC8vIHRoaXMuZGljdGlvbmFyeSA9XG4gICAgICAvLyAgIGxzRGljdGlvbmFyeSB8fCB0aGlzLmJ1aWxkRHJvcGRvd25EaWN0aW9uYXJ5KHJlY29yZHMsIHRoaXMucHJvcHMuZmllbGRMaXN0KTtcbiAgICAgIC8vIGlmICghbHNEaWN0aW9uYXJ5KSB7XG4gICAgICAvLyAgIHRoaXMuc2F2ZVRvTG9jYWxTdG9yYWdlKHN0b3JhZ2VLZXksIHRoaXMuZGljdGlvbmFyeSk7XG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwi6ZqO5bGk5YyW44OJ44Ot44OD44OX44OA44Km44Oz44Gu5Yid5pyf5YyW5Lit44Gr44Ko44Op44O844GM55m655Sf44GX44G+44GX44GfOlwiLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlYiBDcnlwdG8gQVBJ44KS5L2/55So44GX44Gm44OP44OD44K344Ol5YCk44KS6KiI566XXG4gIHByaXZhdGUgYXN5bmMgY2FsY3VsYXRlSGFzaChcbiAgICByZWNvcmRzOiBLVFJlY29yZFtdLFxuICAgIGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkocmVjb3JkcykgKyBKU09OLnN0cmluZ2lmeShhY3Rpb25Ob2RlKTtcbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKHN0cik7XG4gICAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTFcIiwgZGF0YSk7XG4gICAgY29uc3QgaGFzaEFycmF5ID0gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShoYXNoQnVmZmVyKSk7XG4gICAgY29uc3QgaGFzaEhleCA9IGhhc2hBcnJheVxuICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgLmpvaW4oXCJcIik7XG4gICAgcmV0dXJuIGhhc2hIZXg7XG4gIH1cblxuICAvKipcbiAgICog44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Gu6L6e5pu444KS5qeL56+JXG4gICAqIEBwYXJhbSByZWNvcmRzIOODh+ODvOOCv+OCveODvOOCueOBruODrOOCs+ODvOODiVxuICAgKiBAcGFyYW0gZmllbGRMaXN0IOODh+ODvOOCv+OCveODvOOCueOBrumajuWxpOODleOCo+ODvOODq+ODiVxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIHByaXZhdGUgYnVpbGREcm9wZG93bkRpY3Rpb25hcnkocmVjb3JkczogS1RSZWNvcmRbXSxmaWVsZExpc3Q6IElGaWVsZExpc3RbXSk6IERyb3Bkb3duRGljdGlvbmFyeSB7XG4gICAgY29uc3QgdGVtcERpY3Rpb25hcnk6IFJlY29yZDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IHsgXCIwX1RPUFwiOiBuZXcgU2V0KCkgfTtcbiAgICBjb25zdCBmaWVsZENvZGVUb0luZGV4TWFwID0gbmV3IE1hcChcbiAgICAgIGZpZWxkTGlzdC5tYXAoKGZpZWxkLCBpbmRleCkgPT4gW2ZpZWxkLnNvdXJjZS5jb2RlLCBpbmRleF0pXG4gICAgKTtcblxuICAgIHJlY29yZHNcbiAgICAgIC5tYXAoKHJlY29yZCkgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKVxuICAgICAgICAgIC5tYXAoKFtmaWVsZENvZGUsIGZpZWxkRGF0YV0pID0+ICh7XG4gICAgICAgICAgICBmaWVsZENvZGUsXG4gICAgICAgICAgICB2YWx1ZTogZmllbGREYXRhLnZhbHVlLFxuICAgICAgICAgICAgaW5kZXg6IGZpZWxkQ29kZVRvSW5kZXhNYXAuZ2V0KGZpZWxkQ29kZSksXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pbmRleCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4ISAtIGIuaW5kZXghKVxuICAgICAgKVxuICAgICAgLmZvckVhY2goKHJlY29yZEFycmF5KSA9PiB7XG4gICAgICAgIHJlY29yZEFycmF5LmZvckVhY2goKGl0ZW0sIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGZpZWxkQ29kZSB9ID0gaXRlbTtcbiAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdiA9IHZhbHVlIGFzIHN0cmluZztcblxuICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGVtcERpY3Rpb25hcnlbXCIwX1RPUFwiXS5hZGQodik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGFycmF5W2luZGV4IC0gMV07XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0tleSA9IGAke3ByZXZpb3VzSXRlbS5pbmRleH1fJHtwcmV2aW91c0l0ZW0udmFsdWV9YDtcbiAgICAgICAgICAgIHRlbXBEaWN0aW9uYXJ5W3ByZXZpb3VzS2V5XSA9XG4gICAgICAgICAgICAgIHRlbXBEaWN0aW9uYXJ5W3ByZXZpb3VzS2V5XSB8fCBuZXcgU2V0KCk7XG4gICAgICAgICAgICB0ZW1wRGljdGlvbmFyeVtwcmV2aW91c0tleV0uYWRkKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IGRpY3Rpb25hcnk6IERyb3Bkb3duRGljdGlvbmFyeSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgc2V0XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wRGljdGlvbmFyeSkpIHtcbiAgICAgIGRpY3Rpb25hcnlba2V5XSA9IEFycmF5LmZyb20oc2V0KS5zb3J0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpY3Rpb25hcnk7XG4gIH1cblxuICAvLyDjg63jg7zjgqvjg6vjgrnjg4jjg6zjg7zjgrjjgYvjgonovp7mm7jjgpLlj5blvpdcbiAgcHJpdmF0ZSBnZXRGcm9tTG9jYWxTdG9yYWdlKGtleTogc3RyaW5nKTogRHJvcGRvd25EaWN0aW9uYXJ5IHwgbnVsbCB7XG4gICAgY29uc3QgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgdGhpcy5jbGVhclVwRGljdGlvbmFyeShrZXkpO1xuICAgIHJldHVybiBkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IG51bGw7XG4gIH1cblxuICAvLyDlj6TjgYTovp7mm7jjgpLjgq/jg6rjgqJcbiAgcHJpdmF0ZSBjbGVhclVwRGljdGlvbmFyeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKGxvY2FsU3RvcmFnZSlcbiAgICAgIC5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChcImRyb3Bkb3duX2RpY3Rpb25hcnk6OlwiKSAmJiAhay5lbmRzV2l0aChrZXkpKVxuICAgICAgLmZvckVhY2goKGspID0+IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGspKTtcbiAgfVxuXG4gIC8vIOODreODvOOCq+ODq+OCueODiOODrOODvOOCuOOBq+i+nuabuOOCkuS/neWtmFxuICBwcml2YXRlIHNhdmVUb0xvY2FsU3RvcmFnZShrZXk6IHN0cmluZywgZGF0YTogRHJvcGRvd25EaWN0aW9uYXJ5KTogdm9pZCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gIH1cblxuICAvLyDjg5rjg7zjgrjjga7nirbmhYvjgpLlh6bnkIZcbiAgYXN5bmMgaGFuZGxlUGFnZVN0YXRlKGFwcElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBnZXRQYWdlU3RhdGUoXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKFwiI1wiLCBcIj9cIiksXG4gICAgICBhcHBJZFxuICAgICk7XG5cbiAgICBzd2l0Y2ggKGN1cnJlbnRTdGF0ZS50eXBlKSB7XG4gICAgICBjYXNlIFwiYXBwXCI6XG4gICAgICBjYXNlIFwiZWRpdFwiOlxuICAgICAgY2FzZSBcInNob3dcIjpcbiAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZS50eXBlID09PSBcInNob3dcIiAmJiBjdXJyZW50U3RhdGUubW9kZSAhPT0gXCJlZGl0XCIpIGJyZWFrO1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgdGhpcy5zZXR1cENhc2NhZGluZ0Ryb3BEb3duKGN1cnJlbnRTdGF0ZS50eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8g6ZqO5bGk5YyW44OJ44Ot44OD44OX44OA44Km44Oz44KS6Kit5a6a44GZ44KLXG4gIHNldHVwQ2FzY2FkaW5nRHJvcERvd24ocGFnZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgcGFnZVR5cGUgPT09IFwiYXBwXCIgPyBcInZpZXctbGlzdC1kYXRhLWdhaWFcIiA6IFwicmVjb3JkLWdhaWFcIlxuICAgICk7XG4gICAgaWYgKCF0YWJsZUVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCLjg6vjg7zjg4jopoHntKDjgYzopovjgaTjgYvjgorjgb7jgZvjgpNcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKHBhZ2VUeXBlPT09XCJhcHBcIil7XG4gICAgICB0aGlzLmluaXREcm9wZG93bkNvbnRhaW5lckZvckxpc3QoKTtcbiAgICB9ZWxzZXtcbiAgICAgIHRoaXMuaW5pdERyb3Bkb3duQ29udGFpbmVyZm9yRGV0YWlsKHRhYmxlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyRHJvcGRvd25Db250YWluZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIOODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOCs+ODs+ODhuODiuOCkuWIneacn+WMlijkuIDopqfnt6jpm4bnlLvpnaIpXG4gICAqIEBwYXJhbSB0YWJsZUVsZW1lbnQgXG4gICAqL1xuICBwcml2YXRlIGluaXREcm9wZG93bkNvbnRhaW5lckZvckxpc3QoKXtcbiAgICBjb25zdCBmaWVsZExpc3RzID0gdGhpcy5wcm9wcy5maWVsZExpc3Q7XG4gICAgZmllbGRMaXN0cy5mb3JFYWNoKChmbGQsaW5kZXgsYXJyYXkpPT57XG4gICAgICAgY29uc3QgZWxlbXMgPSBraW50b25lLmFwcC5nZXRGaWVsZEVsZW1lbnRzKGZsZC5kcm9wRG93bi5jb2RlKTtcbiAgICAgICBpZihlbGVtcyl7XG4gICAgICAgIGNvbnN0IGVkaXRFbGVtID0gJChlbGVtcykuZmlsdGVyKFwiLnJlY29yZGxpc3QtZWRpdGNlbGwtZ2FpYVwiKS5nZXQoMCk7XG4gICAgICAgIGlmKGVkaXRFbGVtIT09dW5kZWZpbmVkKXtcbiAgICAgICAgICB0aGlzLmNvbHVtbk1hcC5zZXQoZWRpdEVsZW0sIGZsZCk7XG4gICAgICAgIH1cbiAgICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jb2x1bU1hcEFycmF5ID0gQXJyYXkuZnJvbSh0aGlzLmNvbHVtbk1hcC5lbnRyaWVzKCkpO1xuICAgIHRoaXMuY29sdW1NYXBWYWx1ZUFycmF5ID0gQXJyYXkuZnJvbSh0aGlzLmNvbHVtbk1hcC52YWx1ZXMoKSk7XG4gIH1cblxuICAvLyDjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg6Hjg4vjg6Xjg7zjgrPjg7Pjg4bjg4rjgpLliJ3mnJ/ljJYo5piO57Sw57eo6ZuG55S76Z2iKVxuICBwcml2YXRlIGluaXREcm9wZG93bkNvbnRhaW5lcmZvckRldGFpbCh0YWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRMaXN0ID0gdGhpcy5wcm9wcy5maWVsZExpc3Q7XG4gICAgbGV0IGhlYWRlckNlbGxzID0gJCh0YWJsZUVsZW1lbnQpLmZpbmQoXCIuY29udHJvbC1nYWlhXCIpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRMaXN0KSB7XG4gICAgICBjb25zdCBjZWxsID0gaGVhZGVyQ2VsbHMuaGFzKGBkaXYuY29udHJvbC1sYWJlbC1nYWlhIHNwYW46Y29udGFpbnMoXCIke2ZpZWxkLmRyb3BEb3duLmxhYmVsfVwiKWApLmdldCgwKTtcbiAgICAgIGlmKGNlbGwhPT11bmRlZmluZWQpe1xuICAgICAgICBjb25zdCB2YWx1ZUVsZW0gPSAkKGNlbGwpLmZpbmQoXCIuY29udHJvbC12YWx1ZS1nYWlhXCIpLmdldCgwKTtcbiAgICAgICAgaWYodmFsdWVFbGVtIT09dW5kZWZpbmVkKXtcbiAgICAgICAgICB0aGlzLmNvbHVtbk1hcC5zZXQoY2VsbCwgZmllbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29sdW1NYXBBcnJheSA9IEFycmF5LmZyb20odGhpcy5jb2x1bW5NYXAuZW50cmllcygpKTtcbiAgICB0aGlzLmNvbHVtTWFwVmFsdWVBcnJheSA9IEFycmF5LmZyb20odGhpcy5jb2x1bW5NYXAudmFsdWVzKCkpO1xuICB9XG5cbiAgLy8g44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844KS44Os44Oz44OA44Oq44Oz44KwXG4gIHByaXZhdGUgcmVuZGVyRHJvcGRvd25Db250YWluZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5NYXAuZm9yRWFjaCgoZmllbGQsIGNlbGwpID0+IHtcbiAgICAgIC8vIGNvbnN0IGNlbGwgPSBjZWxsc1tjb2x1bW5JbmRleF07XG4gICAgICBpZiAoIWNlbGwpIHJldHVybjtcblxuICAgICAgY29uc3QgaW5wdXQgPSBjZWxsLnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oXCJpbnB1dFwiKTtcbiAgICAgIGlmICghaW5wdXQpIHJldHVybjtcblxuICAgICAgdGhpcy5jcmVhdGVTZWxlY3QoaW5wdXQsIGZpZWxkLmRyb3BEb3duLmNvZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844KS5L2c5oiQXG4gIHByaXZhdGUgY3JlYXRlU2VsZWN0KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBmaWVsZENvZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmNsYXNzTmFtZSA9IFwiYnMtc2NvcGVcIjtcbiAgICBkaXYuc3R5bGUubWFyZ2luID0gXCIwLjEycmVtXCI7XG4gICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbiAgICBzZWxlY3QuY2xhc3NOYW1lID0gXCJjdXN0b20tZHJvcGRvd24gZm9ybS1zZWxlY3RcIjtcbiAgICBzZWxlY3QuZGF0YXNldC5maWVsZCA9IGZpZWxkQ29kZTtcbiAgICBzZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCAoZXZlbnQpID0+e1xuICAgICAgdGhpcy5zZWxlY3RvckNoYW5nZUhhbmRsZShmaWVsZENvZGUsIGV2ZW50KTtcbiAgICAgIGlucHV0LnZhbHVlPXRoaXMuc3RhdGVbZmllbGRDb2RlXTtcbiAgICB9KTtcbiAgICBkaXYuYXBwZW5kQ2hpbGQoc2VsZWN0KTtcbiAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoZmllbGRDb2RlLCBzZWxlY3QsIGlucHV0LnZhbHVlKTtcbiAgICBpbnB1dC5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoZGl2LCBpbnB1dC5uZXh0U2libGluZyk7XG4gICAgaW5wdXQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIHRoaXMuc2VsZWN0cy5zZXQoZmllbGRDb2RlLCBkaXYpO1xuXG4gIH1cblxuICAvLyDjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg6Hjg4vjg6Xjg7zjga7jgqrjg5fjgrfjg6fjg7PjgpLmm7TmlrBcbiAgcHJpdmF0ZSB1cGRhdGVPcHRpb25zKFxuICAgIGZpZWxkQ29kZTogc3RyaW5nLFxuICAgIGluaXRTZWxlY3Q/OiBIVE1MU2VsZWN0RWxlbWVudCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgdmFsdWU/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgbGV0IHNlbGVjdCA9IGluaXRTZWxlY3Q7XG4gICAgaWYgKCFpbml0U2VsZWN0KSB7XG4gICAgICBzZWxlY3QgPSB0aGlzLnNlbGVjdHNcbiAgICAgICAgLmdldChmaWVsZENvZGUpXG4gICAgICAgID8ucXVlcnlTZWxlY3RvcjxIVE1MU2VsZWN0RWxlbWVudD4oXCJzZWxlY3RcIik7XG4gICAgICBpZiAoIXNlbGVjdCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGDjg5XjgqPjg7zjg6vjg4kgJHtmaWVsZENvZGV9IOOBruODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk2BcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlW2ZpZWxkQ29kZV0gPSB2YWx1ZSE7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLnByb3BzLmZpZWxkTGlzdC5maW5kKChmKSA9PiBmLmRyb3BEb3duLmNvZGUgPT09IGZpZWxkQ29kZSk7XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgY29uc29sZS5lcnJvcihg44OV44Kj44O844Or44OJICR7ZmllbGRDb2RlfSDjga7oqK3lrprjgYzopovjgaTjgYvjgorjgb7jgZvjgpNgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg44OV44Kj44O844Or44OJICR7ZmllbGRDb2RlfSDjga7oqK3lrprjgYzopovjgaTjgYvjgorjgb7jgZvjgpNgKTtcbiAgICB9XG5cbiAgICBjb25zdCBsZXZlbCA9IHRoaXMuZ2V0TGV2ZWwoZmllbGRDb2RlKTtcbiAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5nZXRQcmV2aW91c1ZhbHVlRnJvbVN0YXRlKGZpZWxkQ29kZSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucyhsZXZlbCwgcHJldmlvdXNWYWx1ZSk7XG4gICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj7pgbjmip7jgZfjgabjgY/jgaDjgZXjgYQ8L29wdGlvbj4nO1xuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBvcHRpb247XG4gICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uO1xuICAgICAgc2VsZWN0Py5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHNlbGVjdC52YWx1ZSA9IHZhbHVlID8/IHRoaXMuc3RhdGVbZmllbGRDb2RlXSA/PyBcIlwiO1xuICAgIHNlbGVjdC5kaXNhYmxlZCA9IGxldmVsID4gMCAmJiAhcHJldmlvdXNWYWx1ZTtcbiAgfVxuXG4gIC8vIOODieODreODg+ODl+ODgOOCpuODs+ODoeODi+ODpeODvOOBjOWkieabtOOBleOCjOOBn+W+jOOBq+ODiOODquOCrOODvOOBleOCjOOCi+mWouaVsFxuICBwcml2YXRlIHNlbGVjdG9yQ2hhbmdlSGFuZGxlPShmaWVsZENvZGU6IHN0cmluZywgZXZlbnQ6IEV2ZW50KT0+IHtcbiAgICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgdGhpcy5zdGF0ZVtmaWVsZENvZGVdID0gc2VsZWN0LnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0TGV2ZWwoZmllbGRDb2RlKTtcbiAgICB0aGlzLmNvbHVtTWFwQXJyYXlcbiAgICAgIC5maWx0ZXIoKF8sIGFycmF5SW5kZXgpID0+IGFycmF5SW5kZXggPiBjdXJyZW50TGV2ZWwpXG4gICAgICAuZm9yRWFjaCgoW18sIGZpZWxkXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZENvZGUgPSBmaWVsZC5kcm9wRG93bi5jb2RlO1xuICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoZmllbGRDb2RlKTtcbiAgICAgICAgY29uc3QgaW5wdXRFbGVtID0gdGhpcy5zZWxlY3RzLmdldChmaWVsZENvZGUpPy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGlmKGlucHV0RWxlbSl7XG4gICAgICAgICAgaW5wdXRFbGVtLnZhbHVlPVwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuc3RhdGVbZmllbGRDb2RlXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8g44OV44Kj44O844Or44OJ44Gu44Os44OZ44Or44KS5Y+W5b6XXG4gIHByaXZhdGUgZ2V0TGV2ZWwoZmllbGRDb2RlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbHVtTWFwVmFsdWVBcnJheS5maW5kSW5kZXgoXG4gICAgICAoZmllbGQpID0+IGZpZWxkLmRyb3BEb3duLmNvZGUgPT09IGZpZWxkQ29kZVxuICAgICk7XG4gIH1cblxuICAvLyDliY3jga7jg6zjg5njg6vjga7jg5XjgqPjg7zjg6vjg4njga7lgKTjgpLlj5blvpdcbiAgcHJpdmF0ZSBnZXRQcmV2aW91c1ZhbHVlRnJvbVN0YXRlKGZpZWxkQ29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmdldExldmVsKGZpZWxkQ29kZSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA8PSAwKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwcmV2aW91c0ZpZWxkID0gdGhpcy5jb2x1bU1hcFZhbHVlQXJyYXlbY3VycmVudEluZGV4IC0gMV07XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVbcHJldmlvdXNGaWVsZC5kcm9wRG93bi5jb2RlXSA/PyBcIlwiO1xuICB9XG5cbiAgLy8g5oyH5a6a44GV44KM44Gf6ZqO5bGk44Go5YCk44Gu44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Kq44OX44K344On44Oz44KS5Y+W5b6XXG4gIHByaXZhdGUgZ2V0T3B0aW9ucyhsZXZlbDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGtleSA9IGxldmVsID09PSAwID8gXCIwX1RPUFwiIDogdGhpcy5idWlsZEtleShsZXZlbCAtIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5W2tleV0gfHwgW107XG4gIH1cblxuICAvLyDjg4njg63jg4Pjg5fjg4Djgqbjg7Pjg6Hjg4vjg6Xjg7zjga7jgq3jg7zjgpLmp4vnr4lcbiAgcHJpdmF0ZSBidWlsZEtleShsZXZlbDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bGV2ZWx9XyR7dmFsdWV9YDtcbiAgfVxufSIsImltcG9ydCB7XG4gIElBY3Rpb24sXG4gIElBY3Rpb25SZXN1bHQsXG4gIElBY3Rpb25Ob2RlLFxuICBJQWN0aW9uUHJvcGVydHksXG4gIElDb250ZXh0LFxufSBmcm9tIFwiLi4vdHlwZXMvQWN0aW9uVHlwZXNcIjtcbmltcG9ydCB7IGFjdGlvbkFkZGlucyB9IGZyb20gXCIuXCI7XG4vLyBpbXBvcnQgeyBLaW50b25lUmVzdEFQSUNsaWVudCB9IGZyb20gXCJAa2ludG9uZS9yZXN0LWFwaS1jbGllbnRcIjtcbi8vIGltcG9ydCB7IGdldFBhZ2VTdGF0ZSB9IGZyb20gXCIuLi91dGlsL3VybFwiO1xuaW1wb3J0IHsgU25pcHBlciB9IGZyb20gJy4uL3V0aWwvdWktaGVscGVyJztcbmltcG9ydCB7IERyb3BEb3duTWFuYWdlcixJQ2FzY2FkaW5nRHJvcERvd24sIElGaWVsZExpc3R9IGZyb20gJy4uL3R5cGVzL0Nhc2NhZGluZ0Ryb3BEb3duTWFuYWdlcidcbmltcG9ydCBcIi4vY2FzY2FkaW5nLWRyb3Bkb3duLnNjc3NcIjtcbi8vIGltcG9ydCB7IFJlY29yZCBhcyBLVFJlY29yZCB9IGZyb20gXCJAa2ludG9uZS9yZXN0LWFwaS1jbGllbnQvbGliL3NyYy9jbGllbnQvdHlwZXNcIjtcblxuLy8g6ZqO5bGk5YyW44OJ44Ot44OD44OX44OA44Km44Oz44Oh44OL44Ol44O844Gu44OX44Ot44OR44OG44Kj44Kk44Oz44K/44O844OV44Kn44O844K5XG5pbnRlcmZhY2UgSUNhc2NhZGluZ0Ryb3BEb3duUHJvcHMge1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBjYXNjYWRpbmdEcm9wRG93bjogSUNhc2NhZGluZ0Ryb3BEb3duO1xufVxuXG4vKipcbiAqIOmajuWxpOWMluODieODreODg+ODl+ODgOOCpuODs+OBruOCr+ODqeOCueWun+ijhVxuICovXG5leHBvcnQgY2xhc3MgQ2FzY2FkaW5nRHJvcERvd25BY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhY3Rpb25Qcm9wczogSUFjdGlvblByb3BlcnR5W107XG4gIHByb3BzOiBJQ2FzY2FkaW5nRHJvcERvd25Qcm9wcztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5hbWUgPSBcIumajuWxpOWMluODieODreODg+ODl+ODgOOCpuODs1wiO1xuICAgIHRoaXMuYWN0aW9uUHJvcHMgPSBbXTtcbiAgICB0aGlzLnByb3BzID0ge30gYXMgSUNhc2NhZGluZ0Ryb3BEb3duUHJvcHM7XG4gICAgdGhpcy5yZWdpc3RlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIOOCouOCr+OCt+ODp+ODs+OBruODl+ODreOCu+OCueWun+ihjFxuICAgKiBAcGFyYW0gYWN0aW9uTm9kZSBcbiAgICogQHBhcmFtIGV2ZW50IFxuICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBhc3luYyBwcm9jZXNzKFxuICAgIGFjdGlvbk5vZGU6IElBY3Rpb25Ob2RlLFxuICAgIGV2ZW50OiBhbnksXG4gICAgY29udGV4dDogSUNvbnRleHRcbiAgKTogUHJvbWlzZTxJQWN0aW9uUmVzdWx0PiB7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IGFjdGlvbk5vZGUuYWN0aW9uUHJvcHM7XG4gICAgdGhpcy5wcm9wcyA9IGFjdGlvbk5vZGUuQWN0aW9uVmFsdWUgYXMgSUNhc2NhZGluZ0Ryb3BEb3duUHJvcHM7XG5cbiAgICBjb25zdCByZXN1bHQ6IElBY3Rpb25SZXN1bHQgPSB7IGNhbk5leHQ6IHRydWUsIHJlc3VsdDogXCJcIiB9O1xuICAgIGNvbnN0IHNuaXBwZXIgPSBuZXcgU25pcHBlcihcImJvZHlcIik7XG4gICAgY29uc3QgZHJvcERvd25NYW5hZ2VyPSBuZXcgRHJvcERvd25NYW5hZ2VyKHRoaXMucHJvcHMuY2FzY2FkaW5nRHJvcERvd24sZXZlbnQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMpIHJldHVybiByZXN1bHQ7XG4gICAgICBjb25zdCBhcHBJZCA9IHRoaXMucHJvcHMuY2FzY2FkaW5nRHJvcERvd24uZHJvcERvd25BcHAuaWQ7XG4gICAgICAvL3NuaXBwZXLooajnpLpcbiAgICAgIHNuaXBwZXIuc2hvd1NwaW5uZXIoKTtcbiAgICAgIGF3YWl0IGRyb3BEb3duTWFuYWdlci5oYW5kbGVQYWdlU3RhdGUoYXBwSWQpO1xuICAgICAgc25pcHBlci5oaWRlU3Bpbm5lcigpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJDYXNjYWRpbmdEcm9wRG93bkFjdGlvbiDjg5fjg63jgrvjgrnkuK3jgavjgqjjg6njg7zjgYznmbrnlJ/jgZfjgb7jgZfjgZ86XCIsXG4gICAgICAgIGVycm9yXG4gICAgICApO1xuICAgICAgY29udGV4dC5lcnJvcnMuaGFuZGxlRXJyb3IoZXJyb3IsIGFjdGlvbk5vZGUpO1xuICAgICAgcmV0dXJuIHsgY2FuTmV4dDogZmFsc2UsIHJlc3VsdDogXCJcIiB9O1xuICAgIH1maW5hbGx5e1xuICAgICAgc25pcHBlci5yZW1vdmVTcGlubmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgYWN0aW9uQWRkaW5zW3RoaXMubmFtZV0gPSB0aGlzO1xuICB9XG59XG5cbm5ldyBDYXNjYWRpbmdEcm9wRG93bkFjdGlvbigpO1xuIiwiLyoqXG4gKiDjgqLjg5fjg6rmg4XloLFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBJbmZvIHtcbiAgYXBwSWQ6IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4qIOOCouOCr+OCt+ODp+ODs+OBruODl+ODreODkeODhuOCo+Wumue+qVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBY3Rpb25Qcm9wZXJ0eSB7XG4gIGNvbXBvbmVudDogc3RyaW5nO1xuICBwcm9wczoge1xuICAgIC8v44OX44Ot44OR44OG44Kj5ZCNXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8v44OX44Ot44OR44OG44Kj6KGo56S65ZCNXG4gICAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIC8v44OX44Ot44OR44OG44Kj6Kit5a6a5YCkXG4gICAgbW9kZWxWYWx1ZTogYW55O1xuICB9O1xufVxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjgr/jgqTjg5flrprnvqlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uTm9kZSB7XG4gIGlkOiBzdHJpbmc7XG4gIC8v44Ki44Kv44K344On44Oz5ZCNXG4gIG5hbWU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgc3ViVGl0bGU6IHN0cmluZztcbiAgaW5wdXRQb2ludDogc3RyaW5nO1xuICAvL+WHuuWKm+ODneOCpOODs+ODiO+8iOadoeS7tuWIhuWykOS7peWkluacquS9v+eUqO+8iVxuICBvdXRwdXRQb2ludHM6IEFycmF5PHN0cmluZz47XG4gIC8v44Or44O844OI44Ki44Kv44K344On44Oz77yIS2ludG9uZSBldmVudO+8iVxuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIC8v44Ki44Kv44K344On44Oz44Gu44OX44Ot44OR44OG44Kj5a6a576pXG4gIGFjdGlvblByb3BzOiBBcnJheTxJQWN0aW9uUHJvcGVydHk+O1xuICAvL+OCouOCr+OCt+ODp+ODs+OBruODl+ODreODkeODhuOCo+ioreWumuWApOaKveWHulxuICBBY3Rpb25WYWx1ZTogb2JqZWN0XG4gIHByZXZOb2RlSWQ/OiBzdHJpbmc7XG4gIG5leHROb2RlSWRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufVxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjg5Xjg63jg7zjga7lrprnvqlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uRmxvdyB7XG4gIGlkOiBzdHJpbmc7XG4gIGFjdGlvbk5vZGVzOiBJQWN0aW9uTm9kZVtdO1xuICBmaW5kTm9kZUJ5SWQoaWQ6IHN0cmluZyk6IElBY3Rpb25Ob2RlIHwgdW5kZWZpbmVkO1xuICB0b0pTT04oKTogYW55O1xuICBnZXRSb290KCk6IElBY3Rpb25Ob2RlIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBY3Rpb25SZXN1bHR7XG4gIGNhbk5leHQ6Ym9vbGVhbjtcbiAgcmVzdWx0Pzphbnk7XG59XG5cbi8qKlxuICog44Kz44Oz44OG44Kt44K544OIXG4gKiDjg6zjgrPjg7zjg4njgajjg5Xjg63jg7zjga7lpInmlbDjgpLmjIHjgaRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29udGV4dHtcbiAgcmVjb3JkOmFueSxcbiAgdmFyaWFibGVzOmFueSxcbiAgZXJyb3JzOkVycm9yTWFuYWdlclxufVxuXG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+OBruOCpOODs+OCv+ODvOODleOCp+ODvOOCuVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBY3Rpb257XG4gIC8v44Ki44Kv44K344On44Oz44Gu5ZCN5YmN77yI44Om44O844OL44OD44Kv5ZCN44GM5b+F6KaB77yJXG4gIG5hbWU6c3RyaW5nO1xuICAvL+WxnuaAp+ioreWumuaDheWgsVxuICBhY3Rpb25Qcm9wczogQXJyYXk8SUFjdGlvblByb3BlcnR5PjtcbiAgLy/jgqLjgq/jgrfjg6fjg7Pjga7jg5fjg63jgrvjgrnlrp/ooYzplqLmlbBcbiAgcHJvY2Vzcyhwcm9wOklBY3Rpb25Ob2RlLGV2ZW50OmFueSxjb250ZXh0OklDb250ZXh0KTpQcm9taXNlPElBY3Rpb25SZXN1bHQ+O1xuICAvL+OCouOCr+OCt+ODp+ODs+OBrueZu+mMsumWouaVsFxuICByZWdpc3RlcigpOnZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZpZWxke1xuICBuYW1lPzpzdHJpbmc7XG4gIGNvZGU6c3RyaW5nO1xuICB0eXBlPzpzdHJpbmc7XG4gIHJlcXVpcmVkPzpib29sZWFuO1xuICBvcHRpb25zPzpzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xufVxuLy/lpInmlbDjga7jgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrlcbmV4cG9ydCBpbnRlcmZhY2UgSVZhck5hbWV7XG4gIG5hbWU6c3RyaW5nO1xuICBmaWVsZHM/OklWYXJOYW1lW107XG59XG5cbi8qKlxuICog44Om44O844K244O844CB44Kw44Or44O844OX44CB57WE57mU44Gq44Gp44Kq44OW44K444Kn44Kv44OI6aGe5Z6LXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVWYWx1ZSB7XG4gIGNvZGU6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiDjgqLjgq/jgrfjg6fjg7Pjga7jg5fjg63jg5Hjg4bjgqPlrprnvqnjgavln7rjgaXjgYTjgZ/jgq/jg6njgrlcbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGlvblByb3BlcnR5IGltcGxlbWVudHMgSUFjdGlvblByb3BlcnR5IHtcbiAgY29tcG9uZW50OiBzdHJpbmc7XG4gIHByb3BzOiB7XG4gICAgLy8g44OX44Ot44OR44OG44Kj5ZCNXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8vIOODl+ODreODkeODhuOCo+ihqOekuuWQjVxuICAgIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICAvLyDjg5fjg63jg5Hjg4bjgqPoqK3lrprlgKRcbiAgICBtb2RlbFZhbHVlOiBhbnk7XG4gIH07XG5cbiAgc3RhdGljIGRlZmF1bHRQcm9wZXJ0eSgpOiBJQWN0aW9uUHJvcGVydHkge1xuICAgIHJldHVybiBuZXcgQWN0aW9uUHJvcGVydHkoJ0lucHV0VGV4dCcsICdkaXNwbGF5TmFtZScsICfooajnpLrlkI0nLCAn6KGo56S644KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEJywgJycpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbXBvbmVudDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4gICAgbW9kZWxWYWx1ZTogYW55XG4gICkge1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLFxuICAgICAgbW9kZWxWYWx1ZTogbW9kZWxWYWx1ZVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBJQWN0aW9uTm9kZeOBruWun+ijheOAgVJvb3RBY3Rpb25Ob2Rl5Lul5aSW44Gu44Ki44Kv44K344On44Oz5a6a576pXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25Ob2RlIGltcGxlbWVudHMgSUFjdGlvbk5vZGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLmFjdGlvblByb3BzLmZpbmQoKHByb3ApID0+IHByb3AucHJvcHMubmFtZSA9PT0gXCJkaXNwbGF5TmFtZVwiKTtcbiAgICByZXR1cm4gcHJvcD8ucHJvcHMubW9kZWxWYWx1ZTtcbiAgfTtcbiAgZ2V0IHN1YlRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfTtcbiAgaW5wdXRQb2ludDogc3RyaW5nO1xuICAvL+WHuuWKm+ODneOCpOODs+ODiO+8iOadoeS7tuWIhuWykOS7peWkluacquS9v+eUqO+8iVxuICBvdXRwdXRQb2ludHM6IEFycmF5PHN0cmluZz47XG4gIGFjdGlvblByb3BzOiBBcnJheTxJQWN0aW9uUHJvcGVydHk+O1xuICBnZXQgaXNSb290KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgZ2V0IEFjdGlvblZhbHVlKCk6IG9iamVjdCB7XG4gICAgY29uc3QgcHJvcFZhbHVlOiBhbnkgPSB7fTtcbiAgICB0aGlzLmFjdGlvblByb3BzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBwcm9wVmFsdWVbdmFsdWUucHJvcHMubmFtZV0gPSB2YWx1ZS5wcm9wcy5tb2RlbFZhbHVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3BWYWx1ZTtcbiAgfTtcbiAgcHJldk5vZGVJZD86IHN0cmluZztcbiAgbmV4dE5vZGVJZHM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHtpZCxuYW1lLHRpdGxlLGlucHV0UG9pbnQsb3V0cHV0UG9pbnRzLGFjdGlvblByb3BzfTpcbiAgICB7XG4gICAgICBpZDpzdHJpbmcsXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgaW5wdXRQb2ludDogc3RyaW5nLFxuICAgICAgb3V0cHV0UG9pbnRzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgYWN0aW9uUHJvcHM6IEFycmF5PElBY3Rpb25Qcm9wZXJ0eT59XG4gICkge1xuICAgIHRoaXMuaWQ9aWQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmlucHV0UG9pbnQgPSBpbnB1dFBvaW50O1xuICAgIHRoaXMub3V0cHV0UG9pbnRzID0gb3V0cHV0UG9pbnRzO1xuICAgIGNvbnN0IGRlZlByb3AgPSBBY3Rpb25Qcm9wZXJ0eS5kZWZhdWx0UHJvcGVydHkoKTtcbiAgICBkZWZQcm9wLnByb3BzLm1vZGVsVmFsdWUgPSB0aXRsZTtcbiAgICB0aGlzLmFjdGlvblByb3BzID0gYWN0aW9uUHJvcHM7XG4gICAgdGhpcy5uZXh0Tm9kZUlkcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIH1cblxufVxuLyoqXG4gKiDjg6vjg7zjg4jjgqLjgq/jgrfjg6fjg7PlrprnvqlcbiAqL1xuZXhwb3J0IGNsYXNzIFJvb3RBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uTm9kZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgc3ViVGl0bGU6IHN0cmluZztcbiAgaW5wdXRQb2ludDogc3RyaW5nO1xuICAvL+WHuuWKm+ODneOCpOODs+ODiO+8iOadoeS7tuWIhuWykOS7peWkluacquS9v+eUqO+8iVxuICBvdXRwdXRQb2ludHM6IEFycmF5PHN0cmluZz47XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgYWN0aW9uUHJvcHM6IEFycmF5PElBY3Rpb25Qcm9wZXJ0eT47XG4gIEFjdGlvblZhbHVlOiBvYmplY3Q7XG4gIHByZXZOb2RlSWQ/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gIG5leHROb2RlSWRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBjb25zdHJ1Y3RvcihcbiAgICB7aWQsbmFtZSx0aXRsZSxzdWJUaXRsZX06e1xuICAgICAgaWQ6c3RyaW5nLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgIHN1YlRpdGxlOiBzdHJpbmd9XG4gICkge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB0aGlzLnN1YlRpdGxlID0gc3ViVGl0bGU7XG4gICAgdGhpcy5pbnB1dFBvaW50ID0gJyc7XG4gICAgdGhpcy5vdXRwdXRQb2ludHMgPSBbXTtcbiAgICB0aGlzLmlzUm9vdCA9IHRydWU7XG4gICAgdGhpcy5hY3Rpb25Qcm9wcyA9IFtdO1xuICAgIHRoaXMuQWN0aW9uVmFsdWUgPSB7fTtcbiAgICB0aGlzLm5leHROb2RlSWRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgfVxufVxuXG4vKipcbiAqIOOCouOCr+OCt+ODp+ODs+ODleODreODvOOBruWumue+qVxuICovXG5leHBvcnQgY2xhc3MgQWN0aW9uRmxvdyBpbXBsZW1lbnRzIElBY3Rpb25GbG93IHtcbiAgaWQ6IHN0cmluZztcbiAgYWN0aW9uTm9kZXM6IEFycmF5PElBY3Rpb25Ob2RlPjtcbiAgY29uc3RydWN0b3IoYWN0aW9uTm9kZXM6IEFycmF5PElBY3Rpb25Ob2RlPiB8IFJvb3RBY3Rpb24pIHtcbiAgICBpZiAoYWN0aW9uTm9kZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdGhpcy5hY3Rpb25Ob2RlcyA9IGFjdGlvbk5vZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGlvbk5vZGVzID0gW2FjdGlvbk5vZGVzXTtcbiAgICB9XG4gICAgdGhpcy5pZCA9ICcnO1xuICB9XG4gIC8qKipcbiAgICogSUTjgadBY3Rpb25Ob2Rl44KS5Y+W5b6X44GZ44KLXG4gICAqL1xuICBmaW5kTm9kZUJ5SWQoaWQ6IHN0cmluZyk6IElBY3Rpb25Ob2RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb25Ob2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmlkID09PSBpZCk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgYWN0aW9uTm9kZXM6IHRoaXMuYWN0aW9uTm9kZXMubWFwKG5vZGUgPT4ge1xuICAgICAgICBjb25zdCB7IG5leHROb2RlSWRzLCAuLi5yZXN0IH0gPSBub2RlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgbmV4dE5vZGVJZHM6IEFycmF5LmZyb20obmV4dE5vZGVJZHMuZW50cmllcygpKVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgZ2V0Um9vdCgpOiBJQWN0aW9uTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aW9uTm9kZXMuZmluZChub2RlID0+IG5vZGUuaXNSb290KVxuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb246IHN0cmluZyk6IEFjdGlvbkZsb3cge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IEpTT04ucGFyc2UoanNvbik7XG5cbiAgICBjb25zdCBhY3Rpb25Ob2RlcyA9IHBhcnNlZE9iamVjdC5hY3Rpb25Ob2Rlcy5tYXAoKG5vZGU6IGFueSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZUNsYXNzID0gIW5vZGUuaXNSb290ID8gbmV3IEFjdGlvbk5vZGUobm9kZSlcbiAgICAgICAgOiBuZXcgUm9vdEFjdGlvbihub2RlKTtcbiAgICAgIG5vZGVDbGFzcy5uZXh0Tm9kZUlkcyA9IG5ldyBNYXA8c3RyaW5nLHN0cmluZz4oT2JqZWN0LmVudHJpZXMobm9kZS5uZXh0Tm9kZUlkcykpO1xuICAgICAgbm9kZUNsYXNzLnByZXZOb2RlSWQgPSBub2RlLnByZXZOb2RlSWQ7XG4gICAgICBub2RlQ2xhc3MuaWQgPSBub2RlLmlkO1xuICAgICAgcmV0dXJuIG5vZGVDbGFzcztcbiAgICB9KTtcbiAgICBjb25zdCBhY3Rpb25GbG93ID0gbmV3IEFjdGlvbkZsb3coYWN0aW9uTm9kZXMpO1xuICAgIGFjdGlvbkZsb3cuaWQgPSBwYXJzZWRPYmplY3QuaWQ7XG4gICAgcmV0dXJuIGFjdGlvbkZsb3c7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uRXJyb3J7XG4gIGFjdGlvbjogSUFjdGlvbk5vZGUsXG4gIGVycm9yOnN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JNYW5hZ2Vye1xuICBwcml2YXRlIGVycm9yczpJQWN0aW9uRXJyb3JbXT1bXTtcbiAgXG4gIHB1YmxpYyBnZXQgaGFzRXJyb3IoKTpib29sZWFue1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGg+MDtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFcnJvcihlcnI6YW55LGFjdGlvbjpJQWN0aW9uTm9kZSxkZWZhdWx0TWVzc2FnZT86c3RyaW5nKXtcbiAgICBjb25zdCBkZWZNc2cgPSBkZWZhdWx0TWVzc2FnZSA/IGRlZmF1bHRNZXNzYWdlIDogJyc7XG4gICAgbGV0IGVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3I/IGAke2RlZk1zZ30gJHtlcnIubWVzc2FnZX1gIDogZGVmTXNnIDtcbiAgICBjb25zb2xlLmVycm9yKGDjgIwke2FjdGlvbi5uYW1lfeOAjeWHpueQhuS4reS+i+WklueZuueUn+OBl+OBvuOBl+OBn+OAgmAsZXJyKTtcbiAgICB0aGlzLmVycm9ycy5wdXNoKHtlcnJvcixhY3Rpb259KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFdmVudChldmVudDphbnkpe1xuICAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuZXJyb3JzLm1hcCgoZXJyKT0+e1xuICAgICAgICByZXR1cm4gYOOAjCR7ZXJyLmFjdGlvbi5uYW1lfeOAjeWHpueQhuS4reS+i+WklueZuueUn+OBl+OBvuOBl+OBn+OAglxcbuips+e0sDoke2Vyci5lcnJvcn1gO1xuICAgICB9KTsgXG4gICAgIGV2ZW50LmVycm9yPW1lc3NhZ2VzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHVibGljIHNob3dFcnJvcigpe1xuICAgIGNvbnN0IG1zZyA9dGhpcy5lcnJvcnMubWFwKChlcnIpPT57XG4gICAgICByZXR1cm4gYOOAjCR7ZXJyLmFjdGlvbi5uYW1lfeOAjeWHpueQhuS4reS+i+WklueZuueUn+OBl+OBvuOBl+OBn+OAglxcbuips+e0sDoke2Vyci5lcnJvcn1gO1xuICAgIH0pO1xuICAgIHdpbmRvdy5hbGVydChtc2cpO1xuICAgIC8vIGNvbnN0IGh0bWw9XG4gICAgLy8gYDxkaXYgaWQ9XCJteWFsZXJ0XCIgY2xhc3M9XCJub3RpZmllci1jeWJvenUgbm90aWZpZXItZXJyb3ItY3lib3p1XCIgc3R5bGU9XCJsZWZ0OiA1MCU7IHRvcDogMHB4O1wiPlxuICAgIC8vIDxkaXYgY2xhc3M9XCJub3RpZmllci1oZWFkZXItY3lib3p1XCI+PGRpdiBjbGFzcz1cIm5vdGlmaWVyLXRpdGxlLWN5Ym96dVwiPuOCqOODqeODvDwvZGl2PlxuICAgIC8vIDx1bCBjbGFzcz1cIm5vdGlmaWVyLWJvZHktY3lib3p1XCI+PGxpPiR7bXNnfTwvbGk+PC91bD48L2Rpdj5cbiAgICAvLyA8YSBjbGFzcz1cIm5vdGlmaWVyLXJlbW92ZS1jeWJvenVcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+PC9hPjwvZGl2PmBcbiAgICAvLyBjb25zdCBhbGVydCA9ICQoaHRtbCkuYXBwZW5kVG8oXCJib2R5XCIpO1xuICAgIC8vIGFsZXJ0LmNoaWxkcmVuKFwiI215YWxlcnQgLm5vdGlmaWVyLXJlbW92ZS1jeWJvenVcIikub24oXCJjbGlja1wiLChldik9PntcbiAgICAvLyAgICAkKFwibXlhbGVydFwiKS5zbGlkZVVwKCkucmVtb3ZlKCk7XG4gICAgLy8gfSk7XG4gIH1cbn1cblxuIiwiXG5pbXBvcnQgeyBhY3Rpb25BZGRpbnMgfSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0ICcuLi9hY3Rpb25zL211c3QtaW5wdXQnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2F1dG8tbnVtYmVyaW5nJztcbmltcG9ydCAnLi4vYWN0aW9ucy9maWVsZC1zaG93bic7XG5pbXBvcnQgJy4uL2FjdGlvbnMvZXJyb3Itc2hvdyc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvYnV0dG9uLWFkZCc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvY29uZGl0aW9uLWFjdGlvbic7XG5pbXBvcnQgJy4uL2FjdGlvbnMvZGF0YS1wcm9jZXNzaW5nJztcbmltcG9ydCAnLi4vYWN0aW9ucy9kYXRhLXVwZGF0ZSc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvY3VycmVudC1maWVsZC1nZXQnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL3JlZ3VsYXItY2hlY2snO1xuaW1wb3J0ICcuLi9hY3Rpb25zL21haWwtY2hlY2snO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2NvdW50ZXItY2hlY2snO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2RhdGV0aW1lLWdldHRlcic7XG5pbXBvcnQgJy4uL2FjdGlvbnMvaW5zZXJ0LXZhbHVlJztcbmltcG9ydCAnLi4vYWN0aW9ucy92YWx1ZS1nZXR0ZXInO1xuaW1wb3J0ICcuLi9hY3Rpb25zL3N0cmluZy1qb2luJztcbmltcG9ydCAnLi4vYWN0aW9ucy92YWxpZGF0aW9uLWZ1bGx3aWR0aCc7XG5pbXBvcnQgJy4uL2FjdGlvbnMvdmFsaWRhdGlvbi1oYWxmd2lkdGgnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2hhbGYtZnVsbC1jb252ZXJzaW9uJztcbmltcG9ydCAnLi4vYWN0aW9ucy9sb2dpbi11c2VyLWdldHRlcic7XG5pbXBvcnQgJy4uL2FjdGlvbnMvYXV0by1sb29rdXAnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2ZpZWxkLWRpc2FibGUnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL3N0eWxlLWZpZWxkJztcbmltcG9ydCAnLi4vYWN0aW9ucy9kYXRldGltZS1jYWxjJztcbmltcG9ydCAnLi4vYWN0aW9ucy9lbmQtb2YtbW9udGgnO1xuaW1wb3J0ICcuLi9hY3Rpb25zL2RhdGUtc3BlY2lmaWVkJztcbmltcG9ydCAnLi4vYWN0aW9ucy9jYXNjYWRpbmctZHJvcGRvd24nO1xuaW1wb3J0IHsgQWN0aW9uRmxvdyxFcnJvck1hbmFnZXIsSUFjdGlvbkZsb3csIElBY3Rpb25SZXN1bHQsSUNvbnRleHQgfSBmcm9tIFwiLi9BY3Rpb25UeXBlc1wiO1xuY29uc3QgU2hvd0Vycm9yRXZlbnRzOnN0cmluZ1tdID0gW1xuICAgIFwiYXBwLnJlY29yZC5jcmVhdGUuc3VibWl0LnN1Y2Nlc3NcIixcbiAgICBcImFwcC5yZWNvcmQuZWRpdC5zdWJtaXQuc3VjY2Vzc1wiLFxuICAgIFwiYXBwLnJlY29yZC5pbmRleC5lZGl0LnN1Ym1pdC5zdWNjZXNzXCIsXG4gIF07XG5leHBvcnQgY2xhc3MgQWN0aW9uUHJvY2Vzc3tcbiAgICBldmVudElkOnN0cmluZztcbiAgICBmbG93OklBY3Rpb25GbG93O1xuICAgIGV2ZW50OmFueTtcbiAgICBjb250ZXh0OklDb250ZXh0O1xuICAgICBjb25zdHJ1Y3RvcihldmVudElkOnN0cmluZyxmbG93OkFjdGlvbkZsb3csZXZlbnQ6YW55KXtcbiAgICAgICAgdGhpcy5ldmVudElkPWV2ZW50SWQ7XG4gICAgICAgIHRoaXMuZmxvdz1mbG93O1xuICAgICAgICB0aGlzLmV2ZW50PWV2ZW50O1xuICAgICAgICBjb25zdCBlcnJvcm1hbmFnZXIgPSBuZXcgRXJyb3JNYW5hZ2VyKCk7XG4gXG4gICAgICAgIHRoaXMuY29udGV4dD17XG4gICAgICAgICAgICByZWNvcmQ6dGhpcy5ldmVudC5yZWNvcmQsXG4gICAgICAgICAgICB2YXJpYWJsZXM6e30sXG4gICAgICAgICAgICBlcnJvcnM6ZXJyb3JtYW5hZ2VyXG4gICAgICAgIH07XG4gICAgfVxuICAgIGFzeW5jIGV4ZWMoKXtcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuZmxvdy5nZXRSb290KCk7XG4gICAgICAgIGlmKHJvb3Q9PT11bmRlZmluZWQgfHwgcm9vdC5uZXh0Tm9kZUlkcy5zaXplPT09MCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlkPXJvb3QubmV4dE5vZGVJZHMuZ2V0KCcnKTtcbiAgICAgICAgaWYoaWQ9PT11bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5leHRBY3Rpb24gPSB0aGlzLmZsb3cuZmluZE5vZGVCeUlkKGlkKTsgXG4gICAgICAgIGxldCByZXN1bHQ6SUFjdGlvblJlc3VsdD17XG4gICAgICAgICAgICBjYW5OZXh0OnRydWVcbiAgICAgICAgfTtcbiAgICAgICAgd2hpbGUobmV4dEFjdGlvbiE9PXVuZGVmaW5lZCAmJiByZXN1bHQuY2FuTmV4dCl7XG4gICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbkFkZGluc1tuZXh0QWN0aW9uLm5hbWVdO1xuICAgICAgICAgICBpZihhY3Rpb24hPT11bmRlZmluZWQpe1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgYWN0aW9uLnByb2Nlc3MobmV4dEFjdGlvbix0aGlzLmV2ZW50LHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgIH1cbiAgICAgICAgICAgbGV0IG5leHRJbnB1dCA9ICcnO1xuICAgICAgICAgICAvL291dHB1dFBvaW50c+S4gOOBpOS7peS4iuOBruWgtOWQiOOAgeasoeOBrklucHV0UG9pbnTjga/miLvjgorlgKTjgpLoqK3lrprjgZnjgotcbiAgICAgICAgICAgaWYobmV4dEFjdGlvbi5vdXRwdXRQb2ludHMgJiYgbmV4dEFjdGlvbi5vdXRwdXRQb2ludHMubGVuZ3RoPjEpe1xuICAgICAgICAgICAgIG5leHRJbnB1dCA9IHJlc3VsdC5yZXN1bHR8fCcnO1xuICAgICAgICAgICB9XG4gICAgICAgICAgIGlkPW5leHRBY3Rpb24ubmV4dE5vZGVJZHMuZ2V0KG5leHRJbnB1dCk7XG4gICAgICAgICAgIGlmKGlkPT09dW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICAgbmV4dEFjdGlvbiA9IHRoaXMuZmxvdy5maW5kTm9kZUJ5SWQoaWQpOyBcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmNvbnRleHQuZXJyb3JzLmhhc0Vycm9yKXtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5lcnJvcnMuc2V0RXZlbnQodGhpcy5ldmVudCk7IFxuICAgICAgICAgICAgaWYoU2hvd0Vycm9yRXZlbnRzLmluY2x1ZGVzKHRoaXMuZXZlbnQudHlwZSkpe1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5lcnJvcnMuc2hvd0Vycm9yKCk7XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBBY3Rpb25Qcm9jZXNzIH0gZnJvbSAnLi90eXBlcy9hY3Rpb24tcHJvY2Vzcyc7XG5pbXBvcnQgeyBBY3Rpb25GbG93IH0gZnJvbSAnLi90eXBlcy9BY3Rpb25UeXBlcyc7XG5pbXBvcnQgeyBGbG93SW5mbyB9IGZyb20gJy4vdHlwZXMvZmxvd1NldHRpbmcnO1xuXG5kZWNsYXJlIGNvbnN0IGFsY2Zsb3cgOiB7XG4gIFtrZXk6c3RyaW5nXTpGbG93SW5mb1xufTtcblxuJChmdW5jdGlvbiAoKXtcbiAgICBjb25zdCBnZXRDaGFuZ2VFdmVudHM9KGV2ZW50czpzdHJpbmdbXSk9PntcbiAgICAgIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCk9PmV2ZW50LmluY2x1ZGVzKFwiLmNoYW5nZS5cIikpO1xuICAgIH1cbiAgICBjb25zdCBnZXRDbGlja0V2ZW50cz0oZXZlbnRzOnN0cmluZ1tdKT0+e1xuICAgICAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGV2ZW50KT0+ZXZlbnQuaW5jbHVkZXMoXCIuY3VzdG9tQnV0dG9uQ2xpY2suXCIpKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0S2ludG9uZUV2ZW50cz0oZXZlbnRzOnN0cmluZ1tdKT0+e1xuICAgICAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGV2ZW50KT0+e1xuICAgICAgICByZXR1cm4gIWV2ZW50LmluY2x1ZGVzKFwiLmN1c3RvbUJ1dHRvbkNsaWNrLlwiKSAmJiAhZXZlbnQuaW5jbHVkZXMoXCIuY2hhbmdlLlwiKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50cz1PYmplY3Qua2V5cyhhbGNmbG93KTtcbiAgICBjb25zdCBjaGFuZ2VFdmVudHMgPSBnZXRDaGFuZ2VFdmVudHMoZXZlbnRzKTtcbiAgICBjb25zdCBjbGlja0V2ZW50cyA9IGdldENsaWNrRXZlbnRzKGV2ZW50cyk7XG4gICAgY29uc3Qga2ludG9uZUV2ZW50cyA9IGdldEtpbnRvbmVFdmVudHMoZXZlbnRzKTtcbiAgICBpZihraW50b25lRXZlbnRzLmxlbmd0aD4wICl7XG4gICAgICAvL+mAmuW4uEtpbnRvbmXjgqTjg5njg7Pjg4jjgpLjg5Djg7Pjg4lcbiAgICAgIGtpbnRvbmUuZXZlbnRzLm9uKGtpbnRvbmVFdmVudHMsYXN5bmMgKGV2ZW50OmFueSk9PntcbiAgICAgICAgY29uc3QgZmxvd2luZm8gPSBhbGNmbG93W2V2ZW50LnR5cGVdO1xuICAgICAgICBjb25zdCBmbG93PUFjdGlvbkZsb3cuZnJvbUpTT04oZmxvd2luZm8uY29udGVudCk7XG4gICAgICAgIGlmKGZsb3chPT11bmRlZmluZWQpe1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBuZXcgQWN0aW9uUHJvY2VzcyhldmVudC50eXBlLGZsb3csZXZlbnQpO1xuICAgICAgICAgIGF3YWl0IHByb2Nlc3MuZXhlYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZihjaGFuZ2VFdmVudHMubGVuZ3RoPjApe1xuICAgICAgLy/lgKTlpInmm7TjgqTjg5njg7Pjg4jjgpLjg5Djg7Pjg4njgZnjgotcbiAgICAgIGtpbnRvbmUuZXZlbnRzLm9uKGNoYW5nZUV2ZW50cywoZXZlbnQ6YW55KT0+e1xuICAgICAgICBjb25zdCBmbG93aW5mbyA9IGFsY2Zsb3dbZXZlbnQudHlwZV07XG4gICAgICAgIGNvbnN0IGZsb3c9QWN0aW9uRmxvdy5mcm9tSlNPTihmbG93aW5mby5jb250ZW50KTtcbiAgICAgICAgaWYoZmxvdyE9PXVuZGVmaW5lZCl7XG4gICAgICAgICAgY29uc3QgcHJvY2VzcyA9IG5ldyBBY3Rpb25Qcm9jZXNzKGV2ZW50LnR5cGUsZmxvdyxldmVudCk7XG4gICAgICAgICAgcHJvY2Vzcy5leGVjKCkudGhlbigocmVzKT0+e1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gZXZlbnQucmVjb3JkOyAgXG4gICAgICAgICAgICBraW50b25lLmFwcC5yZWNvcmQuc2V0KHtyZWNvcmR9KTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKT0+e1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZihjbGlja0V2ZW50cy5sZW5ndGg+MCl7XG4gICAgICBjbGlja0V2ZW50cy5mb3JFYWNoKChldmVudE5hbWU6c3RyaW5nKT0+e1xuICAgICAgICAkKGRvY3VtZW50KS5vbihldmVudE5hbWUsYXN5bmMgKCk9PntcbiAgICAgICAgICBjb25zdCBldmVudD1raW50b25lLmFwcC5yZWNvcmQuZ2V0KCk7XG4gICAgICAgICAgY29uc3QgZmxvd2luZm8gPSBhbGNmbG93W2V2ZW50TmFtZV07XG4gICAgICAgICAgY29uc3QgZmxvdz1BY3Rpb25GbG93LmZyb21KU09OKGZsb3dpbmZvLmNvbnRlbnQpO1xuICAgICAgICAgIGlmKGZsb3chPT11bmRlZmluZWQpe1xuICAgICAgICAgICAgY29uc3QgcHJvY2VzcyA9IG5ldyBBY3Rpb25Qcm9jZXNzKGV2ZW50TmFtZSxmbG93LGV2ZW50KTtcbiAgICAgICAgICAgIGF3YWl0IHByb2Nlc3MuZXhlYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZWNvcmQgPSBldmVudC5yZWNvcmQ7XG4gICAgICAgICAga2ludG9uZS5hcHAucmVjb3JkLnNldCh7cmVjb3JkfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxufSk7Il0sIm5hbWVzIjpbImdsb2JhbCIsImZhY3RvcnkiLCJtb2R1bGUiLCJ3IiwidGhpcyIsIndpbmRvdyIsIm5vR2xvYmFsIiwiYXJyIiwiZ2V0UHJvdG8iLCJzbGljZSIsImZsYXQiLCJhcnJheSIsInB1c2giLCJpbmRleE9mIiwiY2xhc3MydHlwZSIsInRvU3RyaW5nIiwiaGFzT3duIiwiZm5Ub1N0cmluZyIsIk9iamVjdEZ1bmN0aW9uU3RyaW5nIiwic3VwcG9ydCIsImlzRnVuY3Rpb24iLCJvYmoiLCJpc1dpbmRvdyIsImRvY3VtZW50IiwicHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyIsIkRPTUV2YWwiLCJjb2RlIiwibm9kZSIsImRvYyIsImkiLCJ2YWwiLCJzY3JpcHQiLCJ0b1R5cGUiLCJ2ZXJzaW9uIiwicmh0bWxTdWZmaXgiLCJqUXVlcnkiLCJzZWxlY3RvciIsImNvbnRleHQiLCJudW0iLCJlbGVtcyIsInJldCIsImNhbGxiYWNrIiwiZWxlbSIsIl9lbGVtIiwibGVuIiwiaiIsIm9wdGlvbnMiLCJuYW1lIiwic3JjIiwiY29weSIsImNvcHlJc0FycmF5IiwiY2xvbmUiLCJ0YXJnZXQiLCJsZW5ndGgiLCJkZWVwIiwibXNnIiwicHJvdG8iLCJDdG9yIiwiaXNBcnJheUxpa2UiLCJub2RlVHlwZSIsInJlc3VsdHMiLCJuYW1lc3BhY2UiLCJkb2NFbGVtIiwiZmlyc3QiLCJzZWNvbmQiLCJpbnZlcnQiLCJjYWxsYmFja0ludmVyc2UiLCJtYXRjaGVzIiwiY2FsbGJhY2tFeHBlY3QiLCJhcmciLCJ2YWx1ZSIsIl9pIiwidHlwZSIsIm5vZGVOYW1lIiwicG9wIiwic29ydCIsInNwbGljZSIsIndoaXRlc3BhY2UiLCJydHJpbUNTUyIsImEiLCJiIiwiYnVwIiwicmNzc2VzY2FwZSIsImZjc3Nlc2NhcGUiLCJjaCIsImFzQ29kZVBvaW50Iiwic2VsIiwicHJlZmVycmVkRG9jIiwicHVzaE5hdGl2ZSIsIkV4cHIiLCJvdXRlcm1vc3RDb250ZXh0Iiwic29ydElucHV0IiwiaGFzRHVwbGljYXRlIiwiZG9jdW1lbnRFbGVtZW50IiwiZG9jdW1lbnRJc0hUTUwiLCJyYnVnZ3lRU0EiLCJleHBhbmRvIiwiZGlycnVucyIsImRvbmUiLCJjbGFzc0NhY2hlIiwiY3JlYXRlQ2FjaGUiLCJ0b2tlbkNhY2hlIiwiY29tcGlsZXJDYWNoZSIsIm5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUiLCJzb3J0T3JkZXIiLCJib29sZWFucyIsImlkZW50aWZpZXIiLCJhdHRyaWJ1dGVzIiwicHNldWRvcyIsInJ3aGl0ZXNwYWNlIiwicmNvbW1hIiwicmxlYWRpbmdDb21iaW5hdG9yIiwicmRlc2NlbmQiLCJycHNldWRvIiwicmlkZW50aWZpZXIiLCJtYXRjaEV4cHIiLCJyaW5wdXRzIiwicmhlYWRlciIsInJxdWlja0V4cHIiLCJyc2libGluZyIsInJ1bmVzY2FwZSIsImZ1bmVzY2FwZSIsImVzY2FwZSIsIm5vbkhleCIsImhpZ2giLCJ1bmxvYWRIYW5kbGVyIiwic2V0RG9jdW1lbnQiLCJpbkRpc2FibGVkRmllbGRzZXQiLCJhZGRDb21iaW5hdG9yIiwic2FmZUFjdGl2ZUVsZW1lbnQiLCJlbHMiLCJmaW5kIiwic2VlZCIsIm0iLCJuaWQiLCJtYXRjaCIsImdyb3VwcyIsIm5ld1NlbGVjdG9yIiwibmV3Q29udGV4dCIsInRlc3RDb250ZXh0IiwidG9rZW5pemUiLCJ0b1NlbGVjdG9yIiwic2VsZWN0Iiwia2V5cyIsImNhY2hlIiwia2V5IiwibWFya0Z1bmN0aW9uIiwiZm4iLCJhc3NlcnQiLCJlbCIsImNyZWF0ZUlucHV0UHNldWRvIiwiY3JlYXRlQnV0dG9uUHNldWRvIiwiY3JlYXRlRGlzYWJsZWRQc2V1ZG8iLCJkaXNhYmxlZCIsImNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8iLCJhcmd1bWVudCIsIm1hdGNoSW5kZXhlcyIsInN1YldpbmRvdyIsImlkIiwiYXR0cklkIiwidGFnIiwiY2xhc3NOYW1lIiwiaW5wdXQiLCJjb21wYXJlIiwiZXhwciIsImVsZW1lbnRzIiwiZHVwbGljYXRlcyIsImV4Y2VzcyIsInVucXVvdGVkIiwibm9kZU5hbWVTZWxlY3RvciIsImV4cGVjdGVkTm9kZU5hbWUiLCJwYXR0ZXJuIiwib3BlcmF0b3IiLCJjaGVjayIsInJlc3VsdCIsIndoYXQiLCJfYXJndW1lbnQiLCJsYXN0Iiwic2ltcGxlIiwiZm9yd2FyZCIsIm9mVHlwZSIsIl9jb250ZXh0IiwieG1sIiwib3V0ZXJDYWNoZSIsIm5vZGVJbmRleCIsInN0YXJ0IiwiZGlyIiwicGFyZW50IiwidXNlQ2FjaGUiLCJkaWZmIiwicHNldWRvIiwiYXJncyIsImlkeCIsIm1hdGNoZWQiLCJtYXRjaGVyIiwiY29tcGlsZSIsInVubWF0Y2hlZCIsInRleHQiLCJsYW5nIiwiZWxlbUxhbmciLCJoYXNoIiwiYXR0ciIsIl9tYXRjaEluZGV4ZXMiLCJzZXRGaWx0ZXJzIiwicGFyc2VPbmx5IiwidG9rZW5zIiwic29GYXIiLCJwcmVGaWx0ZXJzIiwiY2FjaGVkIiwiY29tYmluYXRvciIsImJhc2UiLCJza2lwIiwiY2hlY2tOb25FbGVtZW50cyIsImRvbmVOYW1lIiwib2xkQ2FjaGUiLCJuZXdDYWNoZSIsImVsZW1lbnRNYXRjaGVyIiwibWF0Y2hlcnMiLCJtdWx0aXBsZUNvbnRleHRzIiwiY29udGV4dHMiLCJjb25kZW5zZSIsIm1hcCIsImZpbHRlciIsIm5ld1VubWF0Y2hlZCIsIm1hcHBlZCIsInNldE1hdGNoZXIiLCJwcmVGaWx0ZXIiLCJwb3N0RmlsdGVyIiwicG9zdEZpbmRlciIsInBvc3RTZWxlY3RvciIsInRlbXAiLCJtYXRjaGVyT3V0IiwicHJlTWFwIiwicG9zdE1hcCIsInByZWV4aXN0aW5nIiwibWF0Y2hlckluIiwibWF0Y2hlckZyb21Ub2tlbnMiLCJjaGVja0NvbnRleHQiLCJsZWFkaW5nUmVsYXRpdmUiLCJpbXBsaWNpdFJlbGF0aXZlIiwibWF0Y2hDb250ZXh0IiwibWF0Y2hBbnlDb250ZXh0IiwibWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzIiwiZWxlbWVudE1hdGNoZXJzIiwic2V0TWF0Y2hlcnMiLCJieVNldCIsImJ5RWxlbWVudCIsInN1cGVyTWF0Y2hlciIsIm91dGVybW9zdCIsIm1hdGNoZWRDb3VudCIsInNldE1hdGNoZWQiLCJjb250ZXh0QmFja3VwIiwiZGlycnVuc1VuaXF1ZSIsInRva2VuIiwiY29tcGlsZWQiLCJ1bnRpbCIsInRydW5jYXRlIiwic2libGluZ3MiLCJuIiwicm5lZWRzQ29udGV4dCIsInJzaW5nbGVUYWciLCJ3aW5ub3ciLCJxdWFsaWZpZXIiLCJub3QiLCJzZWxmIiwicm9vdGpRdWVyeSIsImluaXQiLCJyb290IiwicnBhcmVudHNwcmV2IiwiZ3VhcmFudGVlZFVuaXF1ZSIsInRhcmdldHMiLCJsIiwic2VsZWN0b3JzIiwiY3VyIiwic2libGluZyIsInJub3RodG1sd2hpdGUiLCJjcmVhdGVPcHRpb25zIiwib2JqZWN0IiwiXyIsImZsYWciLCJmaXJpbmciLCJtZW1vcnkiLCJmaXJlZCIsImxvY2tlZCIsImxpc3QiLCJxdWV1ZSIsImZpcmluZ0luZGV4IiwiZmlyZSIsImFkZCIsImluZGV4IiwiSWRlbnRpdHkiLCJ2IiwiVGhyb3dlciIsImV4IiwiYWRvcHRWYWx1ZSIsInJlc29sdmUiLCJyZWplY3QiLCJub1ZhbHVlIiwibWV0aG9kIiwiZnVuYyIsInR1cGxlcyIsInN0YXRlIiwicHJvbWlzZSIsImRlZmVycmVkIiwiZm5zIiwibmV3RGVmZXIiLCJ0dXBsZSIsInJldHVybmVkIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwib25Qcm9ncmVzcyIsIm1heERlcHRoIiwiZGVwdGgiLCJoYW5kbGVyIiwic3BlY2lhbCIsInRoYXQiLCJtaWdodFRocm93IiwidGhlbiIsInByb2Nlc3MiLCJlIiwic3RhdGVTdHJpbmciLCJzaW5nbGVWYWx1ZSIsInJlbWFpbmluZyIsInJlc29sdmVDb250ZXh0cyIsInJlc29sdmVWYWx1ZXMiLCJwcmltYXJ5IiwidXBkYXRlRnVuYyIsInJlcnJvck5hbWVzIiwiZXJyb3IiLCJhc3luY0Vycm9yIiwicmVhZHlMaXN0Iiwid2FpdCIsImNvbXBsZXRlZCIsImFjY2VzcyIsImNoYWluYWJsZSIsImVtcHR5R2V0IiwicmF3IiwiYnVsayIsIl9rZXkiLCJybXNQcmVmaXgiLCJyZGFzaEFscGhhIiwiZmNhbWVsQ2FzZSIsIl9hbGwiLCJsZXR0ZXIiLCJjYW1lbENhc2UiLCJzdHJpbmciLCJhY2NlcHREYXRhIiwib3duZXIiLCJEYXRhIiwiZGF0YSIsInByb3AiLCJkYXRhUHJpdiIsImRhdGFVc2VyIiwicmJyYWNlIiwicm11bHRpRGFzaCIsImdldERhdGEiLCJkYXRhQXR0ciIsImF0dHJzIiwic3RhcnRMZW5ndGgiLCJob29rcyIsIm5leHQiLCJzZXR0ZXIiLCJ0bXAiLCJjb3VudCIsImRlZmVyIiwicG51bSIsInJjc3NOdW0iLCJjc3NFeHBhbmQiLCJpc0F0dGFjaGVkIiwiY29tcG9zZWQiLCJpc0hpZGRlbldpdGhpblRyZWUiLCJhZGp1c3RDU1MiLCJ2YWx1ZVBhcnRzIiwidHdlZW4iLCJhZGp1c3RlZCIsInNjYWxlIiwibWF4SXRlcmF0aW9ucyIsImN1cnJlbnRWYWx1ZSIsImluaXRpYWwiLCJ1bml0IiwiaW5pdGlhbEluVW5pdCIsImRlZmF1bHREaXNwbGF5TWFwIiwiZ2V0RGVmYXVsdERpc3BsYXkiLCJkaXNwbGF5Iiwic2hvd0hpZGUiLCJzaG93IiwidmFsdWVzIiwicmNoZWNrYWJsZVR5cGUiLCJydGFnTmFtZSIsInJzY3JpcHRUeXBlIiwiZnJhZ21lbnQiLCJkaXYiLCJ3cmFwTWFwIiwiZ2V0QWxsIiwic2V0R2xvYmFsRXZhbCIsInJlZkVsZW1lbnRzIiwicmh0bWwiLCJidWlsZEZyYWdtZW50Iiwic2NyaXB0cyIsInNlbGVjdGlvbiIsImlnbm9yZWQiLCJ3cmFwIiwiYXR0YWNoZWQiLCJub2RlcyIsInJ0eXBlbmFtZXNwYWNlIiwicmV0dXJuVHJ1ZSIsInJldHVybkZhbHNlIiwib24iLCJ0eXBlcyIsIm9uZSIsIm9yaWdGbiIsImV2ZW50IiwiaGFuZGxlT2JqSW4iLCJldmVudEhhbmRsZSIsImV2ZW50cyIsInQiLCJoYW5kbGVPYmoiLCJoYW5kbGVycyIsIm5hbWVzcGFjZXMiLCJvcmlnVHlwZSIsImVsZW1EYXRhIiwibWFwcGVkVHlwZXMiLCJvcmlnQ291bnQiLCJuYXRpdmVFdmVudCIsImhhbmRsZXJRdWV1ZSIsIm1hdGNoZWRIYW5kbGVycyIsIm1hdGNoZWRTZWxlY3RvcnMiLCJkZWxlZ2F0ZUNvdW50IiwiaG9vayIsIm9yaWdpbmFsRXZlbnQiLCJsZXZlcmFnZU5hdGl2ZSIsImlzU2V0dXAiLCJzYXZlZCIsImhhbmRsZSIsInByb3BzIiwiZGVsZWdhdGVUeXBlIiwiZm9jdXNNYXBwZWRIYW5kbGVyIiwiYXR0YWNoZXMiLCJkYXRhSG9sZGVyIiwib3JpZyIsImZpeCIsInJlbGF0ZWQiLCJybm9Jbm5lcmh0bWwiLCJyY2hlY2tlZCIsInJjbGVhblNjcmlwdCIsIm1hbmlwdWxhdGlvblRhcmdldCIsImNvbnRlbnQiLCJkaXNhYmxlU2NyaXB0IiwicmVzdG9yZVNjcmlwdCIsImNsb25lQ29weUV2ZW50IiwiZGVzdCIsInBkYXRhT2xkIiwidWRhdGFPbGQiLCJ1ZGF0YUN1ciIsImZpeElucHV0IiwiZG9tTWFuaXAiLCJjb2xsZWN0aW9uIiwiaGFzU2NyaXB0cyIsImlOb0Nsb25lIiwidmFsdWVJc0Z1bmN0aW9uIiwicmVtb3ZlIiwia2VlcERhdGEiLCJodG1sIiwiZGF0YUFuZEV2ZW50cyIsImRlZXBEYXRhQW5kRXZlbnRzIiwic3JjRWxlbWVudHMiLCJkZXN0RWxlbWVudHMiLCJpblBhZ2UiLCJvcmlnaW5hbCIsImluc2VydCIsInJudW1ub25weCIsInJjdXN0b21Qcm9wIiwiZ2V0U3R5bGVzIiwidmlldyIsInN3YXAiLCJvbGQiLCJyYm94U3R5bGUiLCJjb21wdXRlU3R5bGVUZXN0cyIsImNvbnRhaW5lciIsImRpdlN0eWxlIiwicGl4ZWxQb3NpdGlvblZhbCIsInJlbGlhYmxlTWFyZ2luTGVmdFZhbCIsInJvdW5kUGl4ZWxNZWFzdXJlcyIsInBpeGVsQm94U3R5bGVzVmFsIiwiYm94U2l6aW5nUmVsaWFibGVWYWwiLCJzY3JvbGxib3hTaXplVmFsIiwibWVhc3VyZSIsInJlbGlhYmxlVHJEaW1lbnNpb25zVmFsIiwidGFibGUiLCJ0ciIsInRyQ2hpbGQiLCJ0clN0eWxlIiwiY3VyQ1NTIiwiY29tcHV0ZWQiLCJ3aWR0aCIsIm1pbldpZHRoIiwibWF4V2lkdGgiLCJpc0N1c3RvbVByb3AiLCJzdHlsZSIsImFkZEdldEhvb2tJZiIsImNvbmRpdGlvbkZuIiwiaG9va0ZuIiwiY3NzUHJlZml4ZXMiLCJlbXB0eVN0eWxlIiwidmVuZG9yUHJvcHMiLCJ2ZW5kb3JQcm9wTmFtZSIsImNhcE5hbWUiLCJmaW5hbFByb3BOYW1lIiwiZmluYWwiLCJyZGlzcGxheXN3YXAiLCJjc3NTaG93IiwiY3NzTm9ybWFsVHJhbnNmb3JtIiwic2V0UG9zaXRpdmVOdW1iZXIiLCJzdWJ0cmFjdCIsImJveE1vZGVsQWRqdXN0bWVudCIsImRpbWVuc2lvbiIsImJveCIsImlzQm9yZGVyQm94Iiwic3R5bGVzIiwiY29tcHV0ZWRWYWwiLCJleHRyYSIsImRlbHRhIiwibWFyZ2luRGVsdGEiLCJnZXRXaWR0aE9ySGVpZ2h0IiwiYm94U2l6aW5nTmVlZGVkIiwidmFsdWVJc0JvcmRlckJveCIsIm9mZnNldFByb3AiLCJvcmlnTmFtZSIsInNjcm9sbGJveFNpemVCdWdneSIsInByZWZpeCIsInN1ZmZpeCIsImV4cGFuZGVkIiwicGFydHMiLCJUd2VlbiIsImVuZCIsImVhc2luZyIsInBlcmNlbnQiLCJlYXNlZCIsInAiLCJmeE5vdyIsImluUHJvZ3Jlc3MiLCJyZnh0eXBlcyIsInJydW4iLCJzY2hlZHVsZSIsImNyZWF0ZUZ4Tm93IiwiZ2VuRngiLCJpbmNsdWRlV2lkdGgiLCJ3aGljaCIsImNyZWF0ZVR3ZWVuIiwiYW5pbWF0aW9uIiwiQW5pbWF0aW9uIiwiZGVmYXVsdFByZWZpbHRlciIsIm9wdHMiLCJ0b2dnbGUiLCJvbGRmaXJlIiwicHJvcFR3ZWVuIiwicmVzdG9yZURpc3BsYXkiLCJpc0JveCIsImFuaW0iLCJoaWRkZW4iLCJkYXRhU2hvdyIsInByb3BGaWx0ZXIiLCJzcGVjaWFsRWFzaW5nIiwicHJvcGVydGllcyIsInN0b3BwZWQiLCJ0aWNrIiwiY3VycmVudFRpbWUiLCJnb3RvRW5kIiwicHJlcGVuZCIsInNwZWVkIiwib3B0IiwidG8iLCJlbXB0eSIsIm9wdGFsbCIsImRvQW5pbWF0aW9uIiwiY2xlYXJRdWV1ZSIsInN0b3BRdWV1ZSIsInN0b3AiLCJkZXF1ZXVlIiwidGltZXJzIiwiY3NzRm4iLCJ0aW1lciIsInRpbWUiLCJ0aW1lb3V0IiwiYm9vbEhvb2siLCJhdHRySGFuZGxlIiwiblR5cGUiLCJhdHRyTmFtZXMiLCJnZXR0ZXIiLCJpc1hNTCIsImxvd2VyY2FzZU5hbWUiLCJyZm9jdXNhYmxlIiwicmNsaWNrYWJsZSIsInRhYmluZGV4Iiwic3RyaXBBbmRDb2xsYXBzZSIsImdldENsYXNzIiwiY2xhc3Nlc1RvQXJyYXkiLCJjbGFzc05hbWVzIiwiY3VyVmFsdWUiLCJmaW5hbFZhbHVlIiwic3RhdGVWYWwiLCJpc1ZhbGlkVmFsdWUiLCJycmV0dXJuIiwib3B0aW9uIiwibWF4Iiwib3B0aW9uU2V0IiwibG9jYXRpb24iLCJub25jZSIsInJxdWVyeSIsInBhcnNlckVycm9yRWxlbSIsInJmb2N1c01vcnBoIiwic3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2siLCJvbmx5SGFuZGxlcnMiLCJidWJibGVUeXBlIiwib250eXBlIiwibGFzdEVsZW1lbnQiLCJldmVudFBhdGgiLCJyYnJhY2tldCIsInJDUkxGIiwicnN1Ym1pdHRlclR5cGVzIiwicnN1Ym1pdHRhYmxlIiwiYnVpbGRQYXJhbXMiLCJ0cmFkaXRpb25hbCIsInMiLCJ2YWx1ZU9yRnVuY3Rpb24iLCJyMjAiLCJyaGFzaCIsInJhbnRpQ2FjaGUiLCJyaGVhZGVycyIsInJsb2NhbFByb3RvY29sIiwicm5vQ29udGVudCIsInJwcm90b2NvbCIsInByZWZpbHRlcnMiLCJ0cmFuc3BvcnRzIiwiYWxsVHlwZXMiLCJvcmlnaW5BbmNob3IiLCJhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMiLCJzdHJ1Y3R1cmUiLCJkYXRhVHlwZUV4cHJlc3Npb24iLCJkYXRhVHlwZSIsImRhdGFUeXBlcyIsImluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzIiwib3JpZ2luYWxPcHRpb25zIiwianFYSFIiLCJpbnNwZWN0ZWQiLCJzZWVraW5nVHJhbnNwb3J0IiwiaW5zcGVjdCIsInNlbGVjdGVkIiwicHJlZmlsdGVyT3JGYWN0b3J5IiwiZGF0YVR5cGVPclRyYW5zcG9ydCIsImFqYXhFeHRlbmQiLCJmbGF0T3B0aW9ucyIsImFqYXhIYW5kbGVSZXNwb25zZXMiLCJyZXNwb25zZXMiLCJjdCIsImZpbmFsRGF0YVR5cGUiLCJmaXJzdERhdGFUeXBlIiwiY29udGVudHMiLCJhamF4Q29udmVydCIsInJlc3BvbnNlIiwiaXNTdWNjZXNzIiwiY29udjIiLCJjdXJyZW50IiwiY29udiIsInByZXYiLCJjb252ZXJ0ZXJzIiwic2V0dGluZ3MiLCJ1cmwiLCJ0cmFuc3BvcnQiLCJjYWNoZVVSTCIsInJlc3BvbnNlSGVhZGVyc1N0cmluZyIsInJlc3BvbnNlSGVhZGVycyIsInRpbWVvdXRUaW1lciIsInVybEFuY2hvciIsImZpcmVHbG9iYWxzIiwidW5jYWNoZWQiLCJjYWxsYmFja0NvbnRleHQiLCJnbG9iYWxFdmVudENvbnRleHQiLCJjb21wbGV0ZURlZmVycmVkIiwic3RhdHVzQ29kZSIsInJlcXVlc3RIZWFkZXJzIiwicmVxdWVzdEhlYWRlcnNOYW1lcyIsInN0ckFib3J0Iiwic3RhdHVzVGV4dCIsImZpbmFsVGV4dCIsInN0YXR1cyIsIm5hdGl2ZVN0YXR1c1RleHQiLCJoZWFkZXJzIiwic3VjY2VzcyIsIm1vZGlmaWVkIiwiaHRtbElzRnVuY3Rpb24iLCJ4aHJTdWNjZXNzU3RhdHVzIiwieGhyU3VwcG9ydGVkIiwiZXJyb3JDYWxsYmFjayIsImNvbXBsZXRlIiwieGhyIiwiZXZ0Iiwib2xkQ2FsbGJhY2tzIiwicmpzb25wIiwib3JpZ2luYWxTZXR0aW5ncyIsImNhbGxiYWNrTmFtZSIsIm92ZXJ3cml0dGVuIiwicmVzcG9uc2VDb250YWluZXIiLCJqc29uUHJvcCIsImJvZHkiLCJrZWVwU2NyaXB0cyIsInBhcnNlZCIsInBhcmFtcyIsIm9mZiIsInJlc3BvbnNlVGV4dCIsImN1clBvc2l0aW9uIiwiY3VyTGVmdCIsImN1ckNTU1RvcCIsImN1clRvcCIsImN1ck9mZnNldCIsImN1ckNTU0xlZnQiLCJjYWxjdWxhdGVQb3NpdGlvbiIsInBvc2l0aW9uIiwiY3VyRWxlbSIsInJlY3QiLCJ3aW4iLCJvZmZzZXRQYXJlbnQiLCJvZmZzZXQiLCJwYXJlbnRPZmZzZXQiLCJ0b3AiLCJkZWZhdWx0RXh0cmEiLCJmdW5jTmFtZSIsIm1hcmdpbiIsImZuT3ZlciIsImZuT3V0IiwicnRyaW0iLCJwcm94eSIsImhvbGQiLCJfalF1ZXJ5IiwiXyQiLCJfX3B1YmxpY0ZpZWxkIiwiYWN0aW9uTm9kZSIsInJlY29yZCIsImZvcm1hdCIsImludGVnZXJQYXJ0IiwiZnJhY3Rpb25QYXJ0IiwiaXNOZWdhdGl2ZSIsImlzUGVyY2VudCIsImludGVnZXJGb3JtYXQiLCJmcmFjdGlvbkZvcm1hdCIsImRhdGUiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJob3VyIiwibWludXRlIiwibWlsbGlzZWNvbmQiLCJ0aW1lWm9uZU9mZnNldCIsInJlcGxhY2VtZW50cyIsImRvY051bSIsInRlbXBsYXRlIiwicmVnZXgiLCJub3ciLCJudW1iZXIiLCJubyIsInJlY05vIiwiYXBwdXJsIiwicmVzcCIsImxvZ2ljT3AiLCJqc29uIiwiY2hpbGRKc29uIiwiZm91bmROb2RlIiwibWF4SW5kZXgiLCJjaGlsZCIsImNoaWxkTWF4IiwiY29uZGl0aW9uU3RyaW5nIiwiZ3JvdXBOb2RlIiwiY2hpbGRDb25kaXRpb25TdHJpbmciLCJjb25kTm9kZSIsImNvbmRpTm9kZXMiLCJqc29uU3RyaW5nIiwidmFycyIsInBhdGgiLCJvIiwiayIsImZpZWxkVmFsdWUiLCJ2YXJWYWx1ZSIsImNvbmRpdGlvbiIsInRhcmdldE9iamVjdCIsImNvbmRpdGlvbk9iamVjdCIsImlzQXJyYXlUYXJnZXQiLCJpc0FycmF5VmFsdWUiLCJ0YXJnZXRWYWx1ZSIsImNvbmRpdGlvblZhbHVlIiwiZGF0ZVZhbHVlIiwibnVtYmVyVmFsdWUiLCJzb3J0QXJyYXkiLCJ0YXJnZXRBcnJheSIsInZhbHVlQXJyYXkiLCJ0cmVlIiwiY29uZGl0aW9uUmVzdWx0IiwiYnV0dG9uU3BhY2UiLCJidXR0b24iLCJjbGlja0V2ZW50TmFtZSIsImV4cG9ydHMiLCJpbmplY3RQbGF0Zm9ybURlcHMiLCJkZXBzIiwiX19leHRlbmRzIiwiZXh0ZW5kU3RhdGljcyIsImQiLCJfXyIsIlVuc3VwcG9ydGVkUGxhdGZvcm1FcnJvcl8xIiwiX3N1cGVyIiwiVW5zdXBwb3J0ZWRQbGF0Zm9ybUVycm9yIiwicGxhdGZvcm0iLCJfdGhpcyIsIm1lc3NhZ2UiLCJNaW1lIiwidHlwZU1hcCIsImZvcmNlIiwiZXh0ZW5zaW9ucyIsImV4dCIsImhhc1BhdGgiLCJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMSIsIl9fYXdhaXRlciIsInRoaXNBcmciLCJfYXJndW1lbnRzIiwiUCIsImdlbmVyYXRvciIsImFkb3B0IiwiZnVsZmlsbGVkIiwic3RlcCIsInJlamVjdGVkIiwiX19nZW5lcmF0b3IiLCJmIiwieSIsImciLCJ2ZXJiIiwib3AiLCJfX2ltcG9ydERlZmF1bHQiLCJtb2QiLCJicm93c2VyIiwiZmlsZVBhdGgiLCJfYSIsIl9iIiwiX2MiLCJmaWxlTmFtZSIsImJhc2VVcmwiLCJob3N0IiwicHJvdG9jb2wiLCJlbmRwb2ludE5hbWUiLCJndWVzdFNwYWNlSWQiLCJwcmV2aWV3IiwiZ3Vlc3RQYXRoIiwicHJldmlld1BhdGgiLCJfX2Fzc2lnbiIsIkJhc2VDbGllbnRfMSIsIkJhc2VDbGllbnQiLCJjbGllbnQiLCJfX3Jlc3QiLCJCdWxrUmVxdWVzdENsaWVudF8xIiwiQnVsa1JlcXVlc3RDbGllbnQiLCJyZXF1ZXN0c1BhcmFtIiwicmVxdWVzdHMiLCJyZXF1ZXN0IiwicmVzdCIsIkFwcENsaWVudF8xIiwiQXBwQ2xpZW50Iiwic3BhY2UiLCJzcGFjZVBhdGgiLCJkZWZhdWx0VGhyZWFkIiwiS2ludG9uZUFib3J0U2VhcmNoRXJyb3JfMSIsIktpbnRvbmVBYm9ydFNlYXJjaEVycm9yIiwiS2ludG9uZUFsbFJlY29yZHNFcnJvcl8xIiwiS2ludG9uZUFsbFJlY29yZHNFcnJvciIsInByb2Nlc3NlZFJlY29yZHNSZXN1bHQiLCJ1bnByb2Nlc3NlZFJlY29yZHMiLCJudW1PZkFsbFJlY29yZHMiLCJjaHVua0xlbmd0aCIsIm51bU9mUHJvY2Vzc2VkUmVjb3JkcyIsImVycm9ySW5kZXgiLCJlcnJvcnMiLCJlcnJvckluZGV4ZXMiLCJlcnJvcktleSIsImVycm9yUGFyc2VSZXN1bHQiLCJLaW50b25lUmVzdEFQSUVycm9yXzEiLCJLaW50b25lUmVzdEFQSUVycm9yIiwiYnVsa1JlcXVlc3RJbmRleCIsIl9fY3JlYXRlQmluZGluZyIsImsyIiwiZGVzYyIsIl9fZXhwb3J0U3RhciIsInJlcXVpcmUkJDIiLCJmcm9tIiwicGFjayIsImFyIiwiUmVjb3JkQ2xpZW50XzEiLCJlcnJvcl8xIiwiUmVjb3JkQ2xpZW50IiwiYnVsa1JlcXVlc3RDbGllbnQiLCJhcHAiLCJ1cGRhdGVLZXkiLCJyZWNvcmRzIiwicmV2aXNpb24iLCJxdWVyeSIsInJlZ2V4cCIsImlkcyIsInJldmlzaW9ucyIsIm9yZGVyQnkiLCJ3aXRoQ3Vyc29yIiwiY29uZGl0aW9uUXVlcnkiLCJvcmlnaW5hbEZpZWxkcyIsImZpZWxkcyIsImFsbFJlY29yZHMiLCJsYXN0SWQiLCJsYXN0UmVjb3JkIiwiZXJyb3JfMiIsIkNIVU5LX0xFTkdUSCIsInJlY29yZHNDaHVuayIsIm5ld1Jlc3VsdHMiLCJlXzEiLCJzZXBhcmF0ZWRSZWNvcmRzIiwiYWNjIiwiZV8yIiwiZV8zIiwic2l6ZSIsInNlcGFyYXRlZCIsImNodW5rIiwiU3BhY2VDbGllbnRfMSIsIlNwYWNlQ2xpZW50IiwiRmlsZUNsaWVudF8xIiwiZm9ybV9kYXRhXzEiLCJwbGF0Zm9ybV8xIiwicmVxdWlyZSQkMyIsIkZpbGVDbGllbnQiLCJmb3JtRGF0YSIsIm5hbWVfMSIsIm5hbWVfMiIsImZpbGVEYXRhIiwiUGx1Z2luQ2xpZW50XzEiLCJQbHVnaW5DbGllbnQiLCJiaW5kIiwidGhpbmciLCJzdHIiLCJpc0FycmF5IiwiaXNCdWZmZXIiLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNCb29sZWFuIiwicHJvdG90eXBlIiwiaXNEYXRlIiwia2luZCIsImFsbE93bktleXMiLCJtZXJnZSIsImNhc2VsZXNzIiwiYXNzaWduVmFsdWUiLCJ0YXJnZXRLZXkiLCJjb25zdHJ1Y3RvciIsInN1cGVyQ29uc3RydWN0b3IiLCJkZXNjcmlwdG9ycyIsInNvdXJjZU9iaiIsImRlc3RPYmoiLCJtZXJnZWQiLCJzZWFyY2hTdHJpbmciLCJsYXN0SW5kZXgiLCJUeXBlZEFycmF5IiwiaXRlcmF0b3IiLCJwYWlyIiwicmVnRXhwIiwicDEiLCJwMiIsImhhc093blByb3BlcnR5IiwiaXNSZWdFeHAiLCJyZWR1Y2VyIiwicmVkdWNlZERlc2NyaXB0b3JzIiwiZGVzY3JpcHRvciIsImFycmF5T3JTdHJpbmciLCJkZWxpbWl0ZXIiLCJkZWZpbmUiLCJub29wIiwiZGVmYXVsdFZhbHVlIiwiYWxwaGFiZXQiLCJzdGFjayIsInZpc2l0Iiwic291cmNlIiwicmVkdWNlZFZhbHVlIiwic2V0SW1tZWRpYXRlU3VwcG9ydGVkIiwicG9zdE1lc3NhZ2VTdXBwb3J0ZWQiLCJjYWxsYmFja3MiLCJjYiIsInV0aWxzJDEiLCJjb25maWciLCJ0b0pTT04iLCJjdXN0b21Qcm9wcyIsImF4aW9zRXJyb3IiLCJkb3RzIiwibWV0YVRva2VucyIsInZpc2l0b3IiLCJkZWZhdWx0VmlzaXRvciIsImluZGV4ZXMiLCJ1c2VCbG9iIiwiY29udmVydFZhbHVlIiwiZXhwb3NlZEhlbHBlcnMiLCJidWlsZCIsImNoYXJNYXAiLCJhcHBlbmQiLCJlbmNvZGVyIiwiX2VuY29kZSIsImVuY29kZSIsInNlcmlhbGl6ZUZuIiwic2VyaWFsaXplZFBhcmFtcyIsImhhc2htYXJrSW5kZXgiLCJoIiwidXRpbHMiLCJoZWxwZXJzIiwiYXJyYXlUb09iamVjdCIsImJ1aWxkUGF0aCIsImlzTnVtZXJpY0tleSIsImlzTGFzdCIsInJhd1ZhbHVlIiwicGFyc2VyIiwiZGVmYXVsdHMiLCJ0cmFuc2Zvcm1SZXF1ZXN0IiwiY29udGVudFR5cGUiLCJoYXNKU09OQ29udGVudFR5cGUiLCJpc09iamVjdFBheWxvYWQiLCJpc0ZpbGVMaXN0IiwiX0Zvcm1EYXRhIiwidHJhbnNmb3JtUmVzcG9uc2UiLCJ0cmFuc2l0aW9uYWwiLCJmb3JjZWRKU09OUGFyc2luZyIsIkpTT05SZXF1ZXN0ZWQiLCJzdHJpY3RKU09OUGFyc2luZyIsInZhbGlkYXRlU3RhdHVzIiwiZGVmYXVsdHMkMSIsInJhd0hlYWRlcnMiLCJsaW5lIiwiaGVhZGVyIiwidG9rZW5zUkUiLCJpc0hlYWRlck5hbWVGaWx0ZXIiLCJjaGFyIiwiYWNjZXNzb3JOYW1lIiwibWV0aG9kTmFtZSIsImFyZzEiLCJhcmcyIiwiYXJnMyIsInZhbHVlT3JSZXdyaXRlIiwicmV3cml0ZSIsInNldEhlYWRlciIsIl92YWx1ZSIsIl9oZWFkZXIiLCJfcmV3cml0ZSIsImxIZWFkZXIiLCJzZXRIZWFkZXJzIiwiZGVsZXRlZCIsImRlbGV0ZUhlYWRlciIsIm5vcm1hbGl6ZWQiLCJhc1N0cmluZ3MiLCJhY2Nlc3NvcnMiLCJkZWZpbmVBY2Nlc3NvciIsImhlYWRlclZhbHVlIiwic2FtcGxlc0NvdW50IiwibWluIiwiYnl0ZXMiLCJ0aW1lc3RhbXBzIiwiaGVhZCIsInRhaWwiLCJmaXJzdFNhbXBsZVRTIiwic3RhcnRlZEF0IiwiYnl0ZXNDb3VudCIsInBhc3NlZCIsImZyZXEiLCJ0aW1lc3RhbXAiLCJ0aHJlc2hvbGQiLCJsYXN0QXJncyIsImludm9rZSIsImxpc3RlbmVyIiwiaXNEb3dubG9hZFN0cmVhbSIsImJ5dGVzTm90aWZpZWQiLCJfc3BlZWRvbWV0ZXIiLCJsb2FkZWQiLCJ0b3RhbCIsInByb2dyZXNzQnl0ZXMiLCJyYXRlIiwiaW5SYW5nZSIsInRocm90dGxlZCIsImxlbmd0aENvbXB1dGFibGUiLCJzdGFuZGFyZEJyb3dzZXJFbnYiLCJtc2llIiwidXJsUGFyc2luZ05vZGUiLCJvcmlnaW5VUkwiLCJyZXNvbHZlVVJMIiwiaHJlZiIsInJlcXVlc3RVUkwiLCJub25TdGFuZGFyZEJyb3dzZXJFbnYiLCJleHBpcmVzIiwiZG9tYWluIiwic2VjdXJlIiwiY29va2llIiwiYmFzZVVSTCIsInJlbGF0aXZlVVJMIiwicmVxdWVzdGVkVVJMIiwiY29uZmlnMSIsImNvbmZpZzIiLCJnZXRNZXJnZWRWYWx1ZSIsIm1lcmdlRGVlcFByb3BlcnRpZXMiLCJ2YWx1ZUZyb21Db25maWcyIiwiZGVmYXVsdFRvQ29uZmlnMiIsIm1lcmdlRGlyZWN0S2V5cyIsIm1lcmdlTWFwIiwiY29uZmlnVmFsdWUiLCJuZXdDb25maWciLCJ3aXRoWFNSRlRva2VuIiwieHNyZkhlYWRlck5hbWUiLCJ4c3JmQ29va2llTmFtZSIsImF1dGgiLCJ4c3JmVmFsdWUiLCJfY29uZmlnIiwicmVxdWVzdERhdGEiLCJyZXNwb25zZVR5cGUiLCJvblVwbG9hZFByb2dyZXNzIiwib25Eb3dubG9hZFByb2dyZXNzIiwib25DYW5jZWxlZCIsInVwbG9hZFRocm90dGxlZCIsImRvd25sb2FkVGhyb3R0bGVkIiwiZmx1c2hVcGxvYWQiLCJmbHVzaERvd25sb2FkIiwib25sb2FkZW5kIiwiZXJyIiwidGltZW91dEVycm9yTWVzc2FnZSIsImNhbmNlbCIsInNpZ25hbHMiLCJjb250cm9sbGVyIiwiYWJvcnRlZCIsIm9uYWJvcnQiLCJyZWFzb24iLCJ1bnN1YnNjcmliZSIsInNpZ25hbCIsImNodW5rU2l6ZSIsInBvcyIsIml0ZXJhYmxlIiwic3RyZWFtIiwicmVhZGVyIiwib25GaW5pc2giLCJfb25GaW5pc2giLCJsb2FkZWRCeXRlcyIsInRlc3QiLCJkdXBsZXhBY2Nlc3NlZCIsImhhc0NvbnRlbnRUeXBlIiwicmVzIiwiY2FuY2VsVG9rZW4iLCJ3aXRoQ3JlZGVudGlhbHMiLCJmZXRjaE9wdGlvbnMiLCJjb21wb3NlZFNpZ25hbCIsInJlcXVlc3RDb250ZW50TGVuZ3RoIiwiX3JlcXVlc3QiLCJjb250ZW50VHlwZUhlYWRlciIsImZsdXNoIiwiaXNDcmVkZW50aWFsc1N1cHBvcnRlZCIsImlzU3RyZWFtUmVzcG9uc2UiLCJyZXNwb25zZUNvbnRlbnRMZW5ndGgiLCJyZXNwb25zZURhdGEiLCJhZGFwdGVyIiwiYWRhcHRlcnMiLCJuYW1lT3JBZGFwdGVyIiwicmVqZWN0ZWRSZWFzb25zIiwicmVhc29ucyIsIlZFUlNJT04iLCJ2YWxpZGF0b3IiLCJmb3JtYXRNZXNzYWdlIiwic2NoZW1hIiwiYWxsb3dVbmtub3duIiwiaW5zdGFuY2VDb25maWciLCJjb25maWdPclVybCIsImR1bW15IiwicGFyYW1zU2VyaWFsaXplciIsImNvbnRleHRIZWFkZXJzIiwicmVxdWVzdEludGVyY2VwdG9yQ2hhaW4iLCJzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMiLCJpbnRlcmNlcHRvciIsInJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiIsImNoYWluIiwiZnVsbFBhdGgiLCJmb3JFYWNoTWV0aG9kTm9EYXRhIiwiZm9yRWFjaE1ldGhvZFdpdGhEYXRhIiwiZ2VuZXJhdGVIVFRQTWV0aG9kIiwiaXNGb3JtIiwiZXhlY3V0b3IiLCJyZXNvbHZlUHJvbWlzZSIsIm9uZnVsZmlsbGVkIiwiX3Jlc29sdmUiLCJhYm9ydCIsImMiLCJwYXlsb2FkIiwiZGVmYXVsdENvbmZpZyIsImluc3RhbmNlIiwiYWxsIiwicHJvbWlzZXMiLCJheGlvc18xIiwiQXhpb3NDbGllbnRfMSIsIkF4aW9zQ2xpZW50IiwicmVzcG9uc2VIYW5kbGVyIiwicmVxdWVzdENvbmZpZ0J1aWxkZXIiLCJyZXF1ZXN0Q29uZmlnIiwiaGFzU3ltYm9scyIsInN5bSIsInN5bU9iaiIsInN5bVZhbCIsInN5bXMiLCJoYXNOYXRpdmVTeW1ib2xzIiwiaGFzUHJvdG8iLCJ0b1N0ciIsImNvbmNhdHR5Iiwic2xpY3kiLCJhcnJMaWtlIiwiam9pbmVyIiwiaW1wbGVtZW50YXRpb24iLCJib3VuZCIsImJpbmRlciIsImJvdW5kTGVuZ3RoIiwiYm91bmRBcmdzIiwiRW1wdHkiLCJ1bmRlZmluZWQiLCIkU3ludGF4RXJyb3IiLCJyZXF1aXJlJCQ0IiwiJFR5cGVFcnJvciIsInJlcXVpcmUkJDUiLCJyZXF1aXJlJCQ2IiwiZXhwcmVzc2lvblN5bnRheCIsIiRnT1BEIiwicmVxdWlyZSQkNyIsInJlcXVpcmUkJDgiLCJ4IiwiZG9FdmFsIiwiZ2VuIiwicmVxdWlyZSQkOSIsInJlcXVpcmUkJDEwIiwiJGNvbmNhdCIsIiRyZXBsYWNlIiwic3RyaW5nVG9QYXRoIiwicXVvdGUiLCJzdWJTdHJpbmciLCJnZXRCYXNlSW50cmluc2ljIiwiYWxsb3dNaXNzaW5nIiwiaW50cmluc2ljTmFtZSIsImFsaWFzIiwiR2V0SW50cmluc2ljIiwiaW50cmluc2ljQmFzZU5hbWUiLCJpbnRyaW5zaWMiLCJpbnRyaW5zaWNSZWFsTmFtZSIsInNraXBGdXJ0aGVyQ2FjaGluZyIsImlzT3duIiwicGFydCIsIiRkZWZpbmVQcm9wZXJ0eSIsImdvcGQiLCJkZWZpbmVEYXRhUHJvcGVydHkiLCJwcm9wZXJ0eSIsIm5vbkVudW1lcmFibGUiLCJub25Xcml0YWJsZSIsIm5vbkNvbmZpZ3VyYWJsZSIsImxvb3NlIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9ycyIsImhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnIiwiJGZsb29yIiwic2V0RnVuY3Rpb25MZW5ndGgiLCJmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlIiwiZnVuY3Rpb25MZW5ndGhJc1dyaXRhYmxlIiwiJGFwcGx5IiwiJGNhbGwiLCIkcmVmbGVjdEFwcGx5IiwiJG1heCIsIm9yaWdpbmFsRnVuY3Rpb24iLCJhcHBseUJpbmQiLCJjYWxsQm91bmQiLCJjYWxsQm91bmRJbnRyaW5zaWMiLCJPIiwic2VwUmVnZXgiLCJpbnQiLCJpbnRTdHIiLCJkZWMiLCJpbnNwZWN0XyIsInNlZW4iLCJoYXMiLCJjdXN0b21JbnNwZWN0IiwibnVtZXJpY1NlcGFyYXRvciIsImJpZ0ludFN0ciIsImluZGVudCIsIm5vSW5kZW50IiwibmV3T3B0cyIsInN5bVN0cmluZyIsImlzRWxlbWVudCIsInhzIiwibWFwUGFydHMiLCJzZXRQYXJ0cyIsInlzIiwiaXNQbGFpbk9iamVjdCIsInByb3RvVGFnIiwic3RyaW5nVGFnIiwiY29uc3RydWN0b3JUYWciLCJkZWZhdWx0U3R5bGUiLCJxdW90ZUNoYXIiLCJ0cmFpbGVyIiwiZW50cmllcyIsImpvaW5lZEVudHJpZXMiLCJiYXNlSW5kZW50IiwibGluZUpvaW5lciIsImlzQXJyIiwic3ltTWFwIiwiY3VyciIsIm9iamVjdHMiLCJnZXRTaWRlQ2hhbm5lbCIsIiR3bSIsIiRtIiwiJG8iLCJjaGFubmVsIiwiZm9ybWF0cyIsImNvbXBhY3RRdWV1ZSIsIml0ZW0iLCJjb21wYWN0ZWQiLCJtZXJnZVRhcmdldCIsInRhcmdldEl0ZW0iLCJhc3NpZ25TaW5nbGVTb3VyY2UiLCJkZWNvZGVyIiwiY2hhcnNldCIsInN0cldpdGhvdXRQbHVzIiwiZGVmYXVsdEVuY29kZXIiLCIkMCIsIm91dCIsInNlZ21lbnQiLCJjb21wYWN0IiwicmVmcyIsImNvbWJpbmUiLCJtYXliZU1hcCIsImJyYWNrZXRzIiwiaW5kaWNlcyIsInJlcGVhdCIsInZhbHVlT3JBcnJheSIsInNlcmlhbGl6ZURhdGUiLCJpc05vbk51bGxpc2hQcmltaXRpdmUiLCJzdHJpbmdpZnkiLCJnZW5lcmF0ZUFycmF5UHJlZml4IiwiY29tbWFSb3VuZFRyaXAiLCJhbGxvd0VtcHR5QXJyYXlzIiwic3RyaWN0TnVsbEhhbmRsaW5nIiwic2tpcE51bGxzIiwiZW5jb2RlRG90SW5LZXlzIiwiYWxsb3dEb3RzIiwiZm9ybWF0dGVyIiwiZW5jb2RlVmFsdWVzT25seSIsInNpZGVDaGFubmVsIiwidG1wU2MiLCJmaW5kRmxhZyIsImtleVZhbHVlIiwib2JqS2V5cyIsImVuY29kZWRQcmVmaXgiLCJhZGp1c3RlZFByZWZpeCIsImVuY29kZWRLZXkiLCJrZXlQcmVmaXgiLCJ2YWx1ZVNpZGVDaGFubmVsIiwibm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyIsImFycmF5Rm9ybWF0Iiwiam9pbmVkIiwibnVtYmVyU3RyIiwicGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyIsImNsZWFuU3RyIiwibGltaXQiLCJza2lwSW5kZXgiLCJicmFja2V0RXF1YWxzUG9zIiwiZW5jb2RlZFZhbCIsImV4aXN0aW5nIiwidmFsdWVzUGFyc2VkIiwibGVhZiIsImNsZWFuUm9vdCIsImRlY29kZWRSb290IiwicGFyc2VRdWVyeVN0cmluZ0tleXMiLCJnaXZlbktleSIsIm5vcm1hbGl6ZVBhcnNlT3B0aW9ucyIsInBhcnNlIiwidGVtcE9iaiIsIm5ld09iaiIsIl9oYXNCdWZmZXIiLCJfVEQiLCJfVEUiLCJiNjRjaCIsImI2NGNocyIsImI2NHRhYiIsInRhYiIsImI2NHJlIiwiX2Zyb21DQyIsIl9VOEFmcm9tIiwiaXQiLCJfbWtVcmlTYWZlIiwibTAiLCJfdGlkeUI2NCIsImJ0b2FQb2x5ZmlsbCIsImJpbiIsInUzMiIsImMwIiwiYzEiLCJjMiIsImFzYyIsInBhZCIsIl9idG9hIiwiX2Zyb21VaW50OEFycmF5IiwidThhIiwibWF4YXJncyIsInN0cnMiLCJmcm9tVWludDhBcnJheSIsInVybHNhZmUiLCJjYl91dG9iIiwiY2MiLCJyZV91dG9iIiwidXRvYiIsInUiLCJlbmNvZGVVUkkiLCJyZV9idG91IiwiY2JfYnRvdSIsImNjY2MiLCJjcCIsImJ0b3UiLCJhdG9iUG9seWZpbGwiLCJ1MjQiLCJyMSIsInIyIiwiX2F0b2IiLCJfdG9VaW50OEFycmF5IiwidG9VaW50OEFycmF5IiwiX3VuVVJJIiwiX2RlY29kZSIsImRlY29kZSIsImlzVmFsaWQiLCJfbm9FbnVtIiwiZXh0ZW5kU3RyaW5nIiwiX2FkZCIsImV4dGVuZFVpbnQ4QXJyYXkiLCJleHRlbmRCdWlsdGlucyIsImdCYXNlNjQiLCJLaW50b25lUmVxdWVzdENvbmZpZ0J1aWxkZXJfMSIsIktpbnRvbmVSZXF1ZXN0Q29uZmlnQnVpbGRlciIsInJlcXVlc3RVcmwiLCJfZCIsIl9lIiwiX2YiLCJfZyIsIl9oIiwiX2oiLCJfayIsInByb3h5Q29uZmlnIiwicmVxdWVzdFRva2VuIiwiYmFzaWNBdXRoIiwidXNlckFnZW50IiwiYmFzaWNBdXRoSGVhZGVycyIsInBsYXRmb3JtRGVwc0hlYWRlcnMiLCJjb21tb25IZWFkZXJzIiwiYXBpVG9rZW4iLCJLaW50b25lUmVzcG9uc2VIYW5kbGVyXzEiLCJLaW50b25lUmVzcG9uc2VIYW5kbGVyIiwiZW5hYmxlQWJvcnRTZWFyY2hFcnJvciIsImVycm9yUmVzcG9uc2UiLCJLaW50b25lUmVzdEFQSUNsaWVudF8xIiwiS2ludG9uZVJlc3RBUElDbGllbnQiLCJodHRwQ2xpZW50Iiwic29ja2V0VGltZW91dCIsIl9fc2V0TW9kdWxlRGVmYXVsdCIsIl9faW1wb3J0U3RhciIsImJyb3dzZXJEZXBzIiwiRmllbGRUeXBlIiwiQ2FsY0Zvcm1hdCIsImZpZWxkIiwibnVtYmVyQXJyYXkiLCJjYWxjRmllbGQiLCJ2YXJOYW1lIiwiYXBpIiwiZWxlbWVudCIsInZhclZhbHVlcyIsImRhdGFzIiwibG9va3VwRml4ZWRGaWVsZENvZGVzIiwiaXNLZXkiLCJyZnJvbSIsIm1hcHBpbmdEYXRhIiwiYXBwSWQiLCJuZWVkQ3JlYXRlIiwidGFyZ2V0RmllbGQiLCJtYXBwaW5nUnVsZXMiLCJ1cGRhdGVSZWNvcmRzIiwidGFyZ2V0UmVjb3JkIiwidXBkYXRlUmVjb3JkIiwibWFwcGluZyIsInF1ZXJ5U3RyIiwidmZyb20iLCJmaWx0ZXJIYW5kbGVyIiwiYWNjdW11bGF0b3IiLCJtYXhMZW5ndGgiLCJ0b2RheSIsImZpZWxkVHlwZSIsImlucHV0VmFsdWUiLCJmaWVsZENvZGUiLCJmaWVsZFJlcXVpcmVkIiwidmFsdWVIYXNCbGFuayIsImlucHV0VmFsdWVBcnJheSIsInZhcmlhYmxlSGFzQmxhbmsiLCJpbnB1dE51bWJlclZhbHVlIiwidHdvRGlnaXRNb250aERheSIsInNpbmdsZURpZ2l0TW9udGhEYXkiLCJzaW5nbGVEaWdpdE1vbnRoIiwic2luZ2xlRGlnaXREYXkiLCJkYXRlVGltZU1pbGxpU2Vjb25kIiwiZGF0ZVRpbWUiLCJkYXRlVGltZU5vdEluY2x1ZGluZ01pbGxpU2Vjb25kcyIsImpzdERhdGUiLCJkYXRlQXJyYXkiLCJ5ZWFySW5kZXgiLCJtb250aEluZGV4IiwiZGF5SW5kZXgiLCJmaWVsZE9wdGlvbnMiLCJvcHRpb25zSW5kZXgiLCJ1c2Vyc05hbWUiLCJ1c2Vyc0luZm8iLCJpbmRleFVzZXJzSW5mbyIsImluZGV4SW5wdXRVc2VyIiwib3JnYW5pemF0aW9uTmFtZSIsImdyb3Vwc05hbWUiLCJvYmplY3RWYWx1ZSIsInZhcmlhYmxlVmFsdWUiLCJvYmplY3RQcm9wZXJ0eU5hbWUiLCJmaWVsZENvbHVtbkluZGV4IiwiaW5zZXJ0VmFsdWVUeXBlIiwiZmllbGRWYWx1ZUFycmF5Iiwibm90SW5wdXRFcnJvciIsImNvbnRleHRIYXNWYXJpYWJsZXNOYW1lcyIsImdldENvbnRleHRWYXJCeVBhdGgiLCJpbnB1dFZhcmlhYmxlc05hbWUiLCJpbnB1dFZhcmlhYmxlc0V4aXN0Iiwib2JqZWN0UHJvcGVydGllcyIsImNvcnJlY3RGb3JtYXR0ZWRWYWx1ZSIsImNvcnJlY3RWYWx1ZXMiLCJmb3JtYXR0ZWREYXRlIiwib3JnYW5pemF0aW9ucyIsInNldFVwZGF0ZURhdGEiLCJ1cGRhdGVEYXRhIiwiaW5zZXJ0VmFsdWUiLCJ1cGRhdGVkUmVjb3JkIiwiZ2V0VmFsdWUiLCJtb3RvdGV4dCIsImpvaW5GaWVsZDF0eXBlIiwiam9pbkZpZWxkMnR5cGUiLCJzYXZlRmllbGR0eXBlIiwiam9pblZhbHVlMSIsImpvaW5WYWx1ZTIiLCJjb25TdHJpbmciLCJzYXZlVmFsdWUiLCJjaGVja1JlZ2V4IiwicmV0U3RyIiwiZWxlbWVudE1hcCIsImluc3RhbmNlTWFwIiwiVFJBTlNJVElPTl9FTkQiLCJwYXJzZVNlbGVjdG9yIiwiZ2V0VUlEIiwiZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJ0cmFuc2l0aW9uRGVsYXkiLCJmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiIsImZsb2F0VHJhbnNpdGlvbkRlbGF5IiwidHJpZ2dlclRyYW5zaXRpb25FbmQiLCJnZXRFbGVtZW50IiwiaXNWaXNpYmxlIiwiZWxlbWVudElzVmlzaWJsZSIsImNsb3NlZERldGFpbHMiLCJzdW1tYXJ5IiwiaXNEaXNhYmxlZCIsImZpbmRTaGFkb3dSb290IiwicmVmbG93IiwiZ2V0alF1ZXJ5IiwiRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyIsIm9uRE9NQ29udGVudExvYWRlZCIsImlzUlRMIiwiZGVmaW5lSlF1ZXJ5UGx1Z2luIiwicGx1Z2luIiwiJCIsIkpRVUVSWV9OT19DT05GTElDVCIsImV4ZWN1dGUiLCJwb3NzaWJsZUNhbGxiYWNrIiwiZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiIsInRyYW5zaXRpb25FbGVtZW50Iiwid2FpdEZvclRyYW5zaXRpb24iLCJkdXJhdGlvblBhZGRpbmciLCJlbXVsYXRlZER1cmF0aW9uIiwiY2FsbGVkIiwiZ2V0TmV4dEFjdGl2ZUVsZW1lbnQiLCJhY3RpdmVFbGVtZW50Iiwic2hvdWxkR2V0TmV4dCIsImlzQ3ljbGVBbGxvd2VkIiwibGlzdExlbmd0aCIsImluZGV4X2pzIiwibmFtZXNwYWNlUmVnZXgiLCJzdHJpcE5hbWVSZWdleCIsInN0cmlwVWlkUmVnZXgiLCJldmVudFJlZ2lzdHJ5IiwidWlkRXZlbnQiLCJjdXN0b21FdmVudHMiLCJuYXRpdmVFdmVudHMiLCJtYWtlRXZlbnRVaWQiLCJ1aWQiLCJnZXRFbGVtZW50RXZlbnRzIiwiYm9vdHN0cmFwSGFuZGxlciIsImh5ZHJhdGVPYmoiLCJFdmVudEhhbmRsZXIiLCJib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlciIsImRvbUVsZW1lbnRzIiwiZG9tRWxlbWVudCIsImZpbmRIYW5kbGVyIiwiY2FsbGFibGUiLCJkZWxlZ2F0aW9uU2VsZWN0b3IiLCJub3JtYWxpemVQYXJhbWV0ZXJzIiwib3JpZ2luYWxUeXBlRXZlbnQiLCJkZWxlZ2F0aW9uRnVuY3Rpb24iLCJpc0RlbGVnYXRlZCIsInR5cGVFdmVudCIsImdldFR5cGVFdmVudCIsImFkZEhhbmRsZXIiLCJvbmVPZmYiLCJwcmV2aW91c0Z1bmN0aW9uIiwicmVtb3ZlSGFuZGxlciIsInJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyIsInN0b3JlRWxlbWVudEV2ZW50IiwiaGFuZGxlcktleSIsImluTmFtZXNwYWNlIiwiaXNOYW1lc3BhY2UiLCJlbGVtZW50RXZlbnQiLCJrZXlIYW5kbGVycyIsImpRdWVyeUV2ZW50IiwiYnViYmxlcyIsIm5hdGl2ZURpc3BhdGNoIiwiZGVmYXVsdFByZXZlbnRlZCIsIm1ldGEiLCJub3JtYWxpemVEYXRhIiwibm9ybWFsaXplRGF0YUtleSIsImNociIsImJzS2V5cyIsInB1cmVLZXkiLCJNYW5pcHVsYXRvciIsIkNvbmZpZyIsImpzb25Db25maWciLCJjb25maWdUeXBlcyIsImV4cGVjdGVkVHlwZXMiLCJ2YWx1ZVR5cGUiLCJCYXNlQ29tcG9uZW50IiwicHJvcGVydHlOYW1lIiwiaXNBbmltYXRlZCIsImdldFNlbGVjdG9yIiwiaHJlZkF0dHJpYnV0ZSIsIlNlbGVjdG9yRW5naW5lIiwicGFyZW50cyIsImFuY2VzdG9yIiwicHJldmlvdXMiLCJmb2N1c2FibGVzIiwiTkFNRSIsIkNMQVNTX05BTUVfRkFERSIsIkNMQVNTX05BTUVfU0hPVyIsIkVWRU5UX01PVVNFRE9XTiIsIkRlZmF1bHQiLCJEZWZhdWx0VHlwZSIsIkJhY2tkcm9wIiwiYmFja2Ryb3AiLCJlbmFibGVEaXNtaXNzVHJpZ2dlciIsImNvbXBvbmVudCIsImNsaWNrRXZlbnQiLCJFVkVOVF9LRVkiLCJFVkVOVF9GT0NVU0lOIiwiRVZFTlRfS0VZRE9XTl9UQUIiLCJUQUJfS0VZIiwiVEFCX05BVl9GT1JXQVJEIiwiVEFCX05BVl9CQUNLV0FSRCIsIkZvY3VzVHJhcCIsInRyYXBFbGVtZW50IiwiU0VMRUNUT1JfRklYRURfQ09OVEVOVCIsIlNFTEVDVE9SX1NUSUNLWV9DT05URU5UIiwiUFJPUEVSVFlfUEFERElORyIsIlBST1BFUlRZX01BUkdJTiIsIlNjcm9sbEJhckhlbHBlciIsImRvY3VtZW50V2lkdGgiLCJjYWxjdWxhdGVkVmFsdWUiLCJzdHlsZVByb3BlcnR5Iiwic2Nyb2xsYmFyV2lkdGgiLCJtYW5pcHVsYXRpb25DYWxsQmFjayIsImFjdHVhbFZhbHVlIiwiY2FsbEJhY2siLCJjb21wb25lbnRGdW5jdGlvbnNfanMiLCJEQVRBX0FQSV9LRVkiLCJFU0NBUEVfS0VZIiwiRVZFTlRfSElERSIsIkVWRU5UX0hJREVfUFJFVkVOVEVEIiwiRVZFTlRfSElEREVOIiwiRVZFTlRfU0hPVyIsIkVWRU5UX1NIT1dOIiwiRVZFTlRfUkVTSVpFIiwiRVZFTlRfQ0xJQ0tfRElTTUlTUyIsIkVWRU5UX01PVVNFRE9XTl9ESVNNSVNTIiwiRVZFTlRfS0VZRE9XTl9ESVNNSVNTIiwiRVZFTlRfQ0xJQ0tfREFUQV9BUEkiLCJDTEFTU19OQU1FX09QRU4iLCJDTEFTU19OQU1FX1NUQVRJQyIsIk9QRU5fU0VMRUNUT1IiLCJTRUxFQ1RPUl9ESUFMT0ciLCJTRUxFQ1RPUl9NT0RBTF9CT0RZIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUiLCJNb2RhbCIsInJlbGF0ZWRUYXJnZXQiLCJtb2RhbEJvZHkiLCJ0cmFuc2l0aW9uQ29tcGxldGUiLCJldmVudDIiLCJpc01vZGFsT3ZlcmZsb3dpbmciLCJpbml0aWFsT3ZlcmZsb3dZIiwiaXNCb2R5T3ZlcmZsb3dpbmciLCJzaG93RXZlbnQiLCJhbHJlYWR5T3BlbiIsInBsYWNlbWVudCIsIm93bmVyRG9jdW1lbnQiLCJPd25FbGVtZW50IiwiX3JlZiIsImVmZmVjdCIsIl9yZWYyIiwiaW5pdGlhbFN0eWxlcyIsInN0eWxlUHJvcGVydGllcyIsImF0dHJpYnV0ZSIsInVhRGF0YSIsImluY2x1ZGVTY2FsZSIsImlzRml4ZWRTdHJhdGVneSIsImNsaWVudFJlY3QiLCJzY2FsZVgiLCJzY2FsZVkiLCJ2aXN1YWxWaWV3cG9ydCIsImFkZFZpc3VhbE9mZnNldHMiLCJoZWlnaHQiLCJyb290Tm9kZSIsImdldENvbXB1dGVkU3R5bGUiLCJpc0ZpcmVmb3giLCJpc0lFIiwiZWxlbWVudENzcyIsImN1cnJlbnROb2RlIiwiY3NzIiwibWF0aE1heCIsIm1hdGhNaW4iLCJwYWRkaW5nT2JqZWN0IiwiaGFzaE1hcCIsInRvUGFkZGluZ09iamVjdCIsInBhZGRpbmciLCJfc3RhdGUkbW9kaWZpZXJzRGF0YSQiLCJhcnJvd0VsZW1lbnQiLCJwb3BwZXJPZmZzZXRzIiwiYmFzZVBsYWNlbWVudCIsImF4aXMiLCJpc1ZlcnRpY2FsIiwiYXJyb3dSZWN0IiwibWluUHJvcCIsIm1heFByb3AiLCJlbmREaWZmIiwic3RhcnREaWZmIiwiYXJyb3dPZmZzZXRQYXJlbnQiLCJjbGllbnRTaXplIiwiY2VudGVyVG9SZWZlcmVuY2UiLCJjZW50ZXIiLCJheGlzUHJvcCIsIl9vcHRpb25zJGVsZW1lbnQiLCJkcHIiLCJfT2JqZWN0JGFzc2lnbjIiLCJwb3BwZXIiLCJwb3BwZXJSZWN0IiwidmFyaWF0aW9uIiwib2Zmc2V0cyIsImdwdUFjY2VsZXJhdGlvbiIsImFkYXB0aXZlIiwicm91bmRPZmZzZXRzIiwiaXNGaXhlZCIsIl9vZmZzZXRzJHgiLCJfb2Zmc2V0cyR5IiwiX3JlZjMiLCJoYXNYIiwiaGFzWSIsInNpZGVYIiwic2lkZVkiLCJoZWlnaHRQcm9wIiwid2lkdGhQcm9wIiwib2Zmc2V0WSIsIm9mZnNldFgiLCJjb21tb25TdHlsZXMiLCJfcmVmNCIsIl9PYmplY3QkYXNzaWduIiwiX3JlZjUiLCJfb3B0aW9ucyRncHVBY2NlbGVyYXQiLCJfb3B0aW9ucyRhZGFwdGl2ZSIsIl9vcHRpb25zJHJvdW5kT2Zmc2V0cyIsIl9vcHRpb25zJHNjcm9sbCIsInNjcm9sbCIsIl9vcHRpb25zJHJlc2l6ZSIsInJlc2l6ZSIsInNjcm9sbFBhcmVudHMiLCJzY3JvbGxQYXJlbnQiLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsVG9wIiwic3RyYXRlZ3kiLCJsYXlvdXRWaWV3cG9ydCIsIl9lbGVtZW50JG93bmVyRG9jdW1lbiIsIndpblNjcm9sbCIsIl9nZXRDb21wdXRlZFN0eWxlIiwib3ZlcmZsb3ciLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJpc0JvZHkiLCJ1cGRhdGVkTGlzdCIsImNsaXBwaW5nUGFyZW50IiwiY2xpcHBpbmdQYXJlbnRzIiwiY2FuRXNjYXBlQ2xpcHBpbmciLCJjbGlwcGVyRWxlbWVudCIsImJvdW5kYXJ5Iiwicm9vdEJvdW5kYXJ5IiwibWFpbkNsaXBwaW5nUGFyZW50cyIsImZpcnN0Q2xpcHBpbmdQYXJlbnQiLCJjbGlwcGluZ1JlY3QiLCJhY2NSZWN0IiwicmVmZXJlbmNlIiwiY29tbW9uWCIsImNvbW1vblkiLCJtYWluQXhpcyIsIl9vcHRpb25zIiwiX29wdGlvbnMkcGxhY2VtZW50IiwiX29wdGlvbnMkc3RyYXRlZ3kiLCJfb3B0aW9ucyRib3VuZGFyeSIsIl9vcHRpb25zJHJvb3RCb3VuZGFyeSIsIl9vcHRpb25zJGVsZW1lbnRDb250ZSIsImVsZW1lbnRDb250ZXh0IiwiX29wdGlvbnMkYWx0Qm91bmRhcnkiLCJhbHRCb3VuZGFyeSIsIl9vcHRpb25zJHBhZGRpbmciLCJhbHRDb250ZXh0IiwiY2xpcHBpbmdDbGllbnRSZWN0IiwicmVmZXJlbmNlQ2xpZW50UmVjdCIsInBvcHBlckNsaWVudFJlY3QiLCJlbGVtZW50Q2xpZW50UmVjdCIsIm92ZXJmbG93T2Zmc2V0cyIsIm9mZnNldERhdGEiLCJtdWx0aXBseSIsImZsaXBWYXJpYXRpb25zIiwiX29wdGlvbnMkYWxsb3dlZEF1dG9QIiwiYWxsb3dlZEF1dG9QbGFjZW1lbnRzIiwiYWxsUGxhY2VtZW50cyIsInBsYWNlbWVudHMiLCJhbGxvd2VkUGxhY2VtZW50cyIsIm92ZXJmbG93cyIsIm9wcG9zaXRlUGxhY2VtZW50IiwiX29wdGlvbnMkbWFpbkF4aXMiLCJjaGVja01haW5BeGlzIiwiX29wdGlvbnMkYWx0QXhpcyIsImNoZWNrQWx0QXhpcyIsInNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyIsIl9vcHRpb25zJGZsaXBWYXJpYXRpbyIsInByZWZlcnJlZFBsYWNlbWVudCIsImlzQmFzZVBsYWNlbWVudCIsImZhbGxiYWNrUGxhY2VtZW50cyIsInJlZmVyZW5jZVJlY3QiLCJjaGVja3NNYXAiLCJtYWtlRmFsbGJhY2tDaGVja3MiLCJmaXJzdEZpdHRpbmdQbGFjZW1lbnQiLCJfYmFzZVBsYWNlbWVudCIsImlzU3RhcnRWYXJpYXRpb24iLCJtYWluVmFyaWF0aW9uU2lkZSIsImFsdFZhcmlhdGlvblNpZGUiLCJjaGVja3MiLCJudW1iZXJPZkNoZWNrcyIsIl9sb29wIiwiZml0dGluZ1BsYWNlbWVudCIsIl9yZXQiLCJwcmV2ZW50ZWRPZmZzZXRzIiwic2lkZSIsInJlZmVyZW5jZU92ZXJmbG93IiwicG9wcGVyQWx0T3ZlcmZsb3ciLCJyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMiLCJwb3BwZXJFc2NhcGVPZmZzZXRzIiwiaXNSZWZlcmVuY2VIaWRkZW4iLCJoYXNQb3BwZXJFc2NhcGVkIiwicmVjdHMiLCJpbnZlcnREaXN0YW5jZSIsInNraWRkaW5nIiwiZGlzdGFuY2UiLCJfb3B0aW9ucyRvZmZzZXQiLCJfZGF0YSRzdGF0ZSRwbGFjZW1lbnQiLCJfb3B0aW9ucyR0ZXRoZXIiLCJ0ZXRoZXIiLCJfb3B0aW9ucyR0ZXRoZXJPZmZzZXQiLCJ0ZXRoZXJPZmZzZXQiLCJhbHRBeGlzIiwidGV0aGVyT2Zmc2V0VmFsdWUiLCJub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUiLCJvZmZzZXRNb2RpZmllclN0YXRlIiwiX29mZnNldE1vZGlmaWVyU3RhdGUkIiwibWFpblNpZGUiLCJhbHRTaWRlIiwiYWRkaXRpdmUiLCJtaW5MZW4iLCJtYXhMZW4iLCJhcnJvd1BhZGRpbmdPYmplY3QiLCJhcnJvd1BhZGRpbmdNaW4iLCJhcnJvd1BhZGRpbmdNYXgiLCJhcnJvd0xlbiIsIm1pbk9mZnNldCIsIm1heE9mZnNldCIsImNsaWVudE9mZnNldCIsIm9mZnNldE1vZGlmaWVyVmFsdWUiLCJ0ZXRoZXJNaW4iLCJ0ZXRoZXJNYXgiLCJwcmV2ZW50ZWRPZmZzZXQiLCJfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIiwiX21haW5TaWRlIiwiX2FsdFNpZGUiLCJfb2Zmc2V0IiwiX2xlbiIsIl9taW4iLCJfbWF4IiwiaXNPcmlnaW5TaWRlIiwiX29mZnNldE1vZGlmaWVyVmFsdWUiLCJfdGV0aGVyTWluIiwiX3RldGhlck1heCIsIl9wcmV2ZW50ZWRPZmZzZXQiLCJlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCIsImlzT2Zmc2V0UGFyZW50QW5FbGVtZW50Iiwib2Zmc2V0UGFyZW50SXNTY2FsZWQiLCJtb2RpZmllcnMiLCJ2aXNpdGVkIiwibW9kaWZpZXIiLCJyZXF1aXJlcyIsImRlcCIsImRlcE1vZGlmaWVyIiwib3JkZXJlZE1vZGlmaWVycyIsInBoYXNlIiwicGVuZGluZyIsImdlbmVyYXRvck9wdGlvbnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyIsIl9nZW5lcmF0b3JPcHRpb25zJGRlZiIsImRlZmF1bHRNb2RpZmllcnMiLCJfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyIiwiZGVmYXVsdE9wdGlvbnMiLCJlZmZlY3RDbGVhbnVwRm5zIiwiaXNEZXN0cm95ZWQiLCJzZXRPcHRpb25zQWN0aW9uIiwiY2xlYW51cE1vZGlmaWVyRWZmZWN0cyIsInJ1bk1vZGlmaWVyRWZmZWN0cyIsIl9zdGF0ZSRlbGVtZW50cyIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZSIsIl9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIiLCJfcmVmJG9wdGlvbnMiLCJjbGVhbnVwRm4iLCJub29wRm4iLCJjcmVhdGVQb3BwZXIiLCJjb21wdXRlU3R5bGVzIiwiYXBwbHlTdHlsZXMiLCJmbGlwIiwicHJldmVudE92ZXJmbG93IiwiYXJyb3ciLCJoaWRlIiwiYWJzRGVsdGFYIiwiZGlyZWN0aW9uIiwiaXRlbXMiLCJhY3RpdmVJbmRleCIsIm9yZGVyIiwiaW1nIiwic3dpcGVDb25maWciLCJhY3RpdmVJbmRpY2F0b3IiLCJuZXdBY3RpdmVJbmRpY2F0b3IiLCJlbGVtZW50SW50ZXJ2YWwiLCJpc05leHQiLCJuZXh0RWxlbWVudCIsIm5leHRFbGVtZW50SW5kZXgiLCJ0cmlnZ2VyRXZlbnQiLCJldmVudE5hbWUiLCJpc0N5Y2xpbmciLCJkaXJlY3Rpb25hbENsYXNzTmFtZSIsIm9yZGVyQ2xhc3NOYW1lIiwiY29tcGxldGVDYWxsQmFjayIsImNhcm91c2VsIiwic2xpZGVJbmRleCIsImNhcm91c2VscyIsInRvZ2dsZUxpc3QiLCJmaWx0ZXJFbGVtZW50IiwiZm91bmRFbGVtZW50IiwiYWN0aXZlQ2hpbGRyZW4iLCJhY3RpdmVJbnN0YW5jZSIsInNjcm9sbFNpemUiLCJ0cmlnZ2VyIiwiY2hpbGRyZW4iLCJ0cmlnZ2VyQXJyYXkiLCJpc09wZW4iLCJyZWZlcmVuY2VFbGVtZW50IiwicG9wcGVyQ29uZmlnIiwiUG9wcGVyLmNyZWF0ZVBvcHBlciIsInBhcmVudERyb3Bkb3duIiwiaXNFbmQiLCJwb3BwZXJEYXRhIiwiZGVmYXVsdEJzUG9wcGVyQ29uZmlnIiwib3BlblRvZ2dsZXMiLCJjb21wb3NlZFBhdGgiLCJpc01lbnVUYXJnZXQiLCJpc0lucHV0IiwiaXNFc2NhcGVFdmVudCIsImlzVXBPckRvd25FdmVudCIsImdldFRvZ2dsZUJ1dHRvbiIsImNvbXBsZXRlQ2FsbGJhY2siLCJjbGlja0NhbGxiYWNrIiwiYWxsb3dlZEF0dHJpYnV0ZUxpc3QiLCJhdHRyaWJ1dGVOYW1lIiwiYXR0cmlidXRlUmVnZXgiLCJ1bnNhZmVIdG1sIiwiYWxsb3dMaXN0Iiwic2FuaXRpemVGdW5jdGlvbiIsImNyZWF0ZWREb2N1bWVudCIsImVsZW1lbnROYW1lIiwiYXR0cmlidXRlTGlzdCIsImFsbG93ZWRBdHRyaWJ1dGVzIiwidGVtcGxhdGVXcmFwcGVyIiwiZXh0cmFDbGFzcyIsInRlbXBsYXRlRWxlbWVudCIsImlzSW5UaGVEb20iLCJ0aXAiLCJ0aXBJZCIsImF0dGFjaG1lbnQiLCJ0cmlnZ2VycyIsImV2ZW50SW4iLCJldmVudE91dCIsInRpdGxlIiwiZGF0YUF0dHJpYnV0ZXMiLCJkYXRhQXR0cmlidXRlIiwic2VjdGlvbiIsIm9ic2VydmFibGVTZWN0aW9uIiwidGFyZ2V0RWxlbWVudCIsImVudHJ5IiwiYWN0aXZhdGUiLCJwYXJlbnRTY3JvbGxUb3AiLCJ1c2VyU2Nyb2xsc0Rvd24iLCJlbnRyeUlzTG93ZXJUaGFuUHJldmlvdXMiLCJ0YXJnZXRMaW5rcyIsImFuY2hvciIsImxpc3RHcm91cCIsImFjdGl2ZU5vZGVzIiwic3B5IiwiaW5uZXJFbGVtIiwiYWN0aXZlIiwiaGlkZUV2ZW50IiwicmVsYXRlZEVsZW0iLCJuZXh0QWN0aXZlRWxlbWVudCIsImlzQWN0aXZlIiwib3V0ZXJFbGVtIiwib3BlbiIsImlzSW50ZXJhY3RpbmciLCJsb29rVXBGaWVsZCIsInRhcmdldFJlY29yZHMiLCJyIiwibG9va3VwIiwiZGlhbG9nIiwibW9kYWxIVE1MIiwiZXYiLCJkaWFsb2dCb2R5IiwiaHRtbHJvdyIsImFsbENvdW50IiwicHJvUmVjb3JkcyIsImxvb2tVcEZpZWxkcyIsInJlY29yZFRhYmxlIiwic3BhbiIsImlucHV0RWxlbWVudCIsImNlbGxzIiwiY29uZGl0aW9uVHJlZSIsImN1cnJDb250ZXh0IiwidGV4dERlY29yYXRpb24iLCJ0d29EaWdpdE1vbnRoIiwic2luZ2xlRGlnaXREYXRlIiwidHdvRGlnaXREYXRlIiwiY2FsY1ZhbHVlIiwiY2FsY09wdGlvbiIsImNhbGNSZXN1bHQiLCJjaGVja0RhdGVWYWx1ZSIsImNhbGNPcHRpb25zIiwiY2FsY3VsYXRlZERhdGUiLCJ2ZXJOYW1lR2V0VmFsdWUiLCJkYXRlT2JqIiwibGFzdERheU9mTW9udGgiLCJzcGlubmVyIiwicGFyc2VkVXJsIiwibGFzdFNlZ21lbnQiLCJzZWNvbmRMYXN0U2VnbWVudCIsIm1vZGUiLCJjdXJyZW50TGV2ZWwiLCJhcnJheUluZGV4IiwiaW5wdXRFbGVtIiwic291cmNlQXBwSWQiLCJoYXNoQnVmZmVyIiwiZmllbGRMaXN0IiwidGVtcERpY3Rpb25hcnkiLCJmaWVsZENvZGVUb0luZGV4TWFwIiwiZmllbGREYXRhIiwicmVjb3JkQXJyYXkiLCJwcmV2aW91c0l0ZW0iLCJwcmV2aW91c0tleSIsImRpY3Rpb25hcnkiLCJzZXQiLCJjdXJyZW50U3RhdGUiLCJwYWdlVHlwZSIsInRhYmxlRWxlbWVudCIsImZsZCIsImVkaXRFbGVtIiwiaGVhZGVyQ2VsbHMiLCJjZWxsIiwiaW5pdFNlbGVjdCIsImxldmVsIiwicHJldmlvdXNWYWx1ZSIsIm9wdGlvbkVsZW1lbnQiLCJjdXJyZW50SW5kZXgiLCJwcmV2aW91c0ZpZWxkIiwic25pcHBlciIsImRyb3BEb3duTWFuYWdlciIsImRpc3BsYXlOYW1lIiwicGxhY2Vob2xkZXIiLCJtb2RlbFZhbHVlIiwiaW5wdXRQb2ludCIsIm91dHB1dFBvaW50cyIsImFjdGlvblByb3BzIiwiZGVmUHJvcCIsInByb3BWYWx1ZSIsInN1YlRpdGxlIiwiYWN0aW9uTm9kZXMiLCJuZXh0Tm9kZUlkcyIsInBhcnNlZE9iamVjdCIsIm5vZGVDbGFzcyIsImFjdGlvbkZsb3ciLCJhY3Rpb24iLCJkZWZhdWx0TWVzc2FnZSIsImRlZk1zZyIsIm1lc3NhZ2VzIiwiZXZlbnRJZCIsImZsb3ciLCJlcnJvcm1hbmFnZXIiLCJuZXh0QWN0aW9uIiwibmV4dElucHV0IiwiZ2V0Q2hhbmdlRXZlbnRzIiwiZ2V0Q2xpY2tFdmVudHMiLCJnZXRLaW50b25lRXZlbnRzIiwiY2hhbmdlRXZlbnRzIiwiY2xpY2tFdmVudHMiLCJraW50b25lRXZlbnRzIiwiZmxvd2luZm8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztpQkFVRSxTQUFVQSxFQUFRQyxFQUFVLENBYTVCQyxFQUFBLFFBQWlCRixFQUFPLFNBQ3ZCQyxFQUFTRCxFQUFRLEVBQU0sRUFDdkIsU0FBVUcsRUFBSSxDQUNiLEdBQUssQ0FBQ0EsRUFBRSxTQUNQLE1BQU0sSUFBSSxNQUFPLDRDQUVsQixPQUFPRixFQUFTRSxFQUNwQixDQU1BLEdBQUssT0FBTyxPQUFXLElBQWMsT0FBU0MsZUFBTSxTQUFVQyxFQUFRQyxF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Q0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsSUFBSyxJQUNMLElBQUssSUFDTCxFQUFHLElBQ0gsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxHQUNQLEVBRU0sd0JBQXFELENBQ3pELEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixHQUFJLElBQ0osR0FBSSxJQUNKLEdBQUksSUFDSixFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNILEVBQUcsSUFDSCxFQUFHLElBQ0gsRUFBRyxJQUNI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QU0sS0FBS3lyRCxFQUFLenJELENBQUssRUFDekMsT0FFVEEsQ0FBQSxDQUNSLEVBRUFnc0QsRUFBYSxPQUFPLEdBRXJCLFFBQVEsT0FBTyxHQUFHQSxFQUFjaHNELEdBQVksQ0FDcEMsTUFBQW1zRCxFQUFXLFFBQVFuc0QsRUFBTSxJQUFJLEVBQzdCeXJELEVBQUssV0FBVyxTQUFTVSxFQUFTLE9BQU8sRUFDL0MsT0FBR1YsSUFBTyxRQUNRLElBQUksY0FBY3pyRCxFQUFNLEtBQUt5ckQsRUFBS3pyRCxDQUFLLEVBQy9DLEtBQUssRUFBRSxLQUFNOHRCLEdBQU0sQ0FDekIsTUFBTXhaLEVBQVN0VSxFQUFNLE9BQ3JCLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFBc1UsQ0FBTyxDQUFBLENBQUEsQ0FDaEMsRUFBRSxNQUFPbVksR0FBTSxDQUNkLFFBQVEsTUFBTUEsQ0FBRyxDQUFBLENBQ2xCLEVBRUl6c0IsQ0FBQSxDQUNSLEVBRUFpc0QsRUFBWSxPQUFPLEdBQ1JBLEVBQUEsUUFBUzNLLEdBQW1CLENBQ3RDLEVBQUUsUUFBUSxFQUFFLEdBQUdBLEVBQVUsU0FBVSxDQUNqQyxNQUFNdGhELEVBQU0sUUFBUSxJQUFJLE9BQU8sSUFBSSxFQUM3Qm1zRCxFQUFXLFFBQVE3SyxDQUFTLEVBQzVCbUssRUFBSyxXQUFXLFNBQVNVLEVBQVMsT0FBTyxFQUM1Q1YsSUFBTyxRQUVSLE1BRGdCLElBQUksY0FBY25LLEVBQVVtSyxFQUFLenJELENBQUssRUFDeEMsT0FFaEIsTUFBTXNVLEVBQVN0VSxFQUFNLE9BQ3JCLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFBc1UsQ0FBTyxDQUFBLENBQUEsQ0FDaEMsQ0FBQSxDQUNGLENBRVAsQ0FBQyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDldfQ==
diff --git a/plugin/kintone-addins/src/actions/auto-lookup.ts b/plugin/kintone-addins/src/actions/auto-lookup.ts
index b49e91a..04578c6 100644
--- a/plugin/kintone-addins/src/actions/auto-lookup.ts
+++ b/plugin/kintone-addins/src/actions/auto-lookup.ts
@@ -103,7 +103,7 @@ export class AutoLookUpAction implements IAction {
this.actionProps = actionNode.actionProps;
this.props = {
...actionNode.ActionValue,
- condition: JSON.parse((actionNode.ActionValue as any).condition),
+ condition: JSON.parse((actionNode.ActionValue as any).condition || '{}'),
} as IAutoLookUpProps;
// console.log(context);
@@ -111,16 +111,17 @@ export class AutoLookUpAction implements IAction {
canNext: true,
result: "",
} as IActionResult;
- try {
- const lookUpFields = this.props.lookupField.fields.filter(
- (f) => f.lookup && f.lookup.relatedApp.app === String(kintone.app.getId())
+ const lookUpFields = this.props.lookupField.fields.filter(
+ (f) => f.lookup && f.lookup.relatedApp.app === String(kintone.app.getId())
+ );
+ if (!lookUpFields || lookUpFields.length===0) {
+ throw new Error(
+ `ルックアップの設定は不正です。${this.props.lookupField.fields[0].label} `
);
- if (!lookUpFields || lookUpFields.length===0) {
- throw new Error(
- `ルックアップの設定は不正です。${this.props.lookupField.fields[0].label} `
- );
- }
+ }
+ try {
const lookUpField = this.props.lookupField.fields[0];
+ this.showSpinnerModel(this.props.lookupField.app, lookUpField);
const key = event.record[lookUpField.lookup.relatedKeyField].value;
const targetRecords = await this.getUpdateRecords(lookUpField, key);
//更新対象がない時にスキップ
@@ -129,7 +130,6 @@ export class AutoLookUpAction implements IAction {
}
const updateRecords = this.convertForLookup(targetRecords,lookUpField,key);
console.log("updateRecords", updateRecords);
- this.showSpinnerModel(this.props.lookupField.app,lookUpField);
const updateResult = await this.updateLookupTarget(updateRecords);
if(updateResult){
this.showResult(this.props.lookupField.app,lookUpField,updateRecords.length);
@@ -157,7 +157,7 @@ export class AutoLookUpAction implements IAction {
if(typeof key==='string'){
query = `${lookUpField.code} = "${key}"`
}
- if(this.props.condition.queryString!==''){
+ if(!!this.props.condition.queryString){
query = `${query} and (${this.props.condition.queryString})`
}
return query;