lsplugin.core.js 475 KB

123
  1. /*! For license information please see lsplugin.core.js.LICENSE.txt */
  2. !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.LSPlugin=t():e.LSPlugin=t()}(self,(function(){return(()=>{var e={227:(e,t,n)=>{var r=n(155);t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&void 0!==r&&"env"in r&&(e=r.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(447)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},447:(e,t,n)=>{e.exports=function(e){function t(e){let n,i,o,s=null;function a(...e){if(!a.enabled)return;const r=a,i=Number(new Date),o=i-(n||i);r.diff=o,r.prev=n,r.curr=i,n=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let s=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((n,i)=>{if("%%"===n)return"%";s++;const o=t.formatters[i];if("function"==typeof o){const t=e[s];n=o.call(r,t),e.splice(s,1),s--}return n})),t.formatArgs.call(r,e),(r.log||t.log).apply(r,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=r,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==s?s:(i!==t.namespaces&&(i=t.namespaces,o=t.enabled(e)),o),set:e=>{s=e}}),"function"==typeof t.init&&t.init(a),a}function r(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function i(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){return e instanceof Error?e.stack||e.message:e},t.disable=function(){const e=[...t.names.map(i),...t.skips.map(i).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(n=0;n<i;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.substr(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=n(824),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t}},856:function(e){e.exports=function(){"use strict";var e=Object.hasOwnProperty,t=Object.setPrototypeOf,n=Object.isFrozen,r=Object.getPrototypeOf,i=Object.getOwnPropertyDescriptor,o=Object.freeze,s=Object.seal,a=Object.create,l="undefined"!=typeof Reflect&&Reflect,c=l.apply,u=l.construct;c||(c=function(e,t,n){return e.apply(t,n)}),o||(o=function(e){return e}),s||(s=function(e){return e}),u||(u=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t))))});var d,h=C(Array.prototype.forEach),p=C(Array.prototype.pop),f=C(Array.prototype.push),g=C(String.prototype.toLowerCase),m=C(String.prototype.match),y=C(String.prototype.replace),v=C(String.prototype.indexOf),_=C(String.prototype.trim),b=C(RegExp.prototype.test),w=(d=TypeError,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return u(d,t)});function C(e){return function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];return c(e,t,r)}}function x(e,r){t&&t(e,null);for(var i=r.length;i--;){var o=r[i];if("string"==typeof o){var s=g(o);s!==o&&(n(r)||(r[i]=s),o=s)}e[o]=!0}return e}function S(t){var n=a(null),r=void 0;for(r in t)c(e,t,[r])&&(n[r]=t[r]);return n}function A(e,t){for(;null!==e;){var n=i(e,t);if(n){if(n.get)return C(n.get);if("function"==typeof n.value)return C(n.value)}e=r(e)}return function(e){return console.warn("fallback value for",e),null}}var O=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),T=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),E=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),k=o(["animate","color-profile","cursor","discard","fedropshadow","feimage","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),L=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),F=o(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),I=o(["#text"]),R=o(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns","slot"]),M=o(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),j=o(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),P=o(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),D=s(/\{\{[\s\S]*|[\s\S]*\}\}/gm),N=s(/<%[\s\S]*|[\s\S]*%>/gm),U=s(/^data-[\-\w.\u00B7-\uFFFF]/),$=s(/^aria-[\-\w]+$/),z=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),H=s(/^(?:\w+script|data):/i),B=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),W="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function G(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var J=function(){return"undefined"==typeof window?null:window},q=function(e,t){if("object"!==(void 0===e?"undefined":W(e))||"function"!=typeof e.createPolicy)return null;var n=null,r="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(r)&&(n=t.currentScript.getAttribute(r));var i="dompurify"+(n?"#"+n:"");try{return e.createPolicy(i,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+i+" could not be created."),null}};return function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:J(),n=function(t){return e(t)};if(n.version="2.3.1",n.removed=[],!t||!t.document||9!==t.document.nodeType)return n.isSupported=!1,n;var r=t.document,i=t.document,s=t.DocumentFragment,a=t.HTMLTemplateElement,l=t.Node,c=t.Element,u=t.NodeFilter,d=t.NamedNodeMap,C=void 0===d?t.NamedNodeMap||t.MozNamedAttrMap:d,Z=t.Text,K=t.Comment,V=t.DOMParser,Y=t.trustedTypes,X=c.prototype,Q=A(X,"cloneNode"),ee=A(X,"nextSibling"),te=A(X,"childNodes"),ne=A(X,"parentNode");if("function"==typeof a){var re=i.createElement("template");re.content&&re.content.ownerDocument&&(i=re.content.ownerDocument)}var ie=q(Y,r),oe=ie&&De?ie.createHTML(""):"",se=i,ae=se.implementation,le=se.createNodeIterator,ce=se.createDocumentFragment,ue=se.getElementsByTagName,de=r.importNode,he={};try{he=S(i).documentMode?i.documentMode:{}}catch(e){}var pe={};n.isSupported="function"==typeof ne&&ae&&void 0!==ae.createHTMLDocument&&9!==he;var fe=D,ge=N,me=U,ye=$,ve=H,_e=B,be=z,we=null,Ce=x({},[].concat(G(O),G(T),G(E),G(L),G(I))),xe=null,Se=x({},[].concat(G(R),G(M),G(j),G(P))),Ae=null,Oe=null,Te=!0,Ee=!0,ke=!1,Le=!1,Fe=!1,Ie=!1,Re=!1,Me=!1,je=!1,Pe=!0,De=!1,Ne=!0,Ue=!0,$e=!1,ze={},He=null,Be=x({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),We=null,Ge=x({},["audio","video","img","source","image","track"]),Je=null,qe=x({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Ze="http://www.w3.org/1998/Math/MathML",Ke="http://www.w3.org/2000/svg",Ve="http://www.w3.org/1999/xhtml",Ye=Ve,Xe=!1,Qe=null,et=i.createElement("form"),tt=function(e){Qe&&Qe===e||(e&&"object"===(void 0===e?"undefined":W(e))||(e={}),e=S(e),we="ALLOWED_TAGS"in e?x({},e.ALLOWED_TAGS):Ce,xe="ALLOWED_ATTR"in e?x({},e.ALLOWED_ATTR):Se,Je="ADD_URI_SAFE_ATTR"in e?x(S(qe),e.ADD_URI_SAFE_ATTR):qe,We="ADD_DATA_URI_TAGS"in e?x(S(Ge),e.ADD_DATA_URI_TAGS):Ge,He="FORBID_CONTENTS"in e?x({},e.FORBID_CONTENTS):Be,Ae="FORBID_TAGS"in e?x({},e.FORBID_TAGS):{},Oe="FORBID_ATTR"in e?x({},e.FORBID_ATTR):{},ze="USE_PROFILES"in e&&e.USE_PROFILES,Te=!1!==e.ALLOW_ARIA_ATTR,Ee=!1!==e.ALLOW_DATA_ATTR,ke=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Le=e.SAFE_FOR_TEMPLATES||!1,Fe=e.WHOLE_DOCUMENT||!1,Me=e.RETURN_DOM||!1,je=e.RETURN_DOM_FRAGMENT||!1,Pe=!1!==e.RETURN_DOM_IMPORT,De=e.RETURN_TRUSTED_TYPE||!1,Re=e.FORCE_BODY||!1,Ne=!1!==e.SANITIZE_DOM,Ue=!1!==e.KEEP_CONTENT,$e=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Ye=e.NAMESPACE||Ve,Le&&(Ee=!1),je&&(Me=!0),ze&&(we=x({},[].concat(G(I))),xe=[],!0===ze.html&&(x(we,O),x(xe,R)),!0===ze.svg&&(x(we,T),x(xe,M),x(xe,P)),!0===ze.svgFilters&&(x(we,E),x(xe,M),x(xe,P)),!0===ze.mathMl&&(x(we,L),x(xe,j),x(xe,P))),e.ADD_TAGS&&(we===Ce&&(we=S(we)),x(we,e.ADD_TAGS)),e.ADD_ATTR&&(xe===Se&&(xe=S(xe)),x(xe,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&x(Je,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(He===Be&&(He=S(He)),x(He,e.FORBID_CONTENTS)),Ue&&(we["#text"]=!0),Fe&&x(we,["html","head","body"]),we.table&&(x(we,["tbody"]),delete Ae.tbody),o&&o(e),Qe=e)},nt=x({},["mi","mo","mn","ms","mtext"]),rt=x({},["foreignobject","desc","title","annotation-xml"]),it=x({},T);x(it,E),x(it,k);var ot=x({},L);x(ot,F);var st=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:Ve,tagName:"template"});var n=g(e.tagName),r=g(t.tagName);if(e.namespaceURI===Ke)return t.namespaceURI===Ve?"svg"===n:t.namespaceURI===Ze?"svg"===n&&("annotation-xml"===r||nt[r]):Boolean(it[n]);if(e.namespaceURI===Ze)return t.namespaceURI===Ve?"math"===n:t.namespaceURI===Ke?"math"===n&&rt[r]:Boolean(ot[n]);if(e.namespaceURI===Ve){if(t.namespaceURI===Ke&&!rt[r])return!1;if(t.namespaceURI===Ze&&!nt[r])return!1;var i=x({},["title","style","font","a","script"]);return!ot[n]&&(i[n]||!it[n])}return!1},at=function(e){f(n.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=oe}catch(t){e.remove()}}},lt=function(e,t){try{f(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!xe[e])if(Me||je)try{at(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},ct=function(e){var t=void 0,n=void 0;if(Re)e="<remove></remove>"+e;else{var r=m(e,/^[\r\n\t ]+/);n=r&&r[0]}var o=ie?ie.createHTML(e):e;if(Ye===Ve)try{t=(new V).parseFromString(o,"text/html")}catch(e){}if(!t||!t.documentElement){t=ae.createDocument(Ye,"template",null);try{t.documentElement.innerHTML=Xe?"":o}catch(e){}}var s=t.body||t.documentElement;return e&&n&&s.insertBefore(i.createTextNode(n),s.childNodes[0]||null),Ye===Ve?ue.call(t,Fe?"html":"body")[0]:Fe?t.documentElement:s},ut=function(e){return le.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT,null,!1)},dt=function(e){return!(e instanceof Z||e instanceof K||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof C&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI&&"function"==typeof e.insertBefore)},ht=function(e){return"object"===(void 0===l?"undefined":W(l))?e instanceof l:e&&"object"===(void 0===e?"undefined":W(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},pt=function(e,t,r){pe[e]&&h(pe[e],(function(e){e.call(n,t,r,Qe)}))},ft=function(e){var t=void 0;if(pt("beforeSanitizeElements",e,null),dt(e))return at(e),!0;if(m(e.nodeName,/[\u0080-\uFFFF]/))return at(e),!0;var r=g(e.nodeName);if(pt("uponSanitizeElement",e,{tagName:r,allowedTags:we}),!ht(e.firstElementChild)&&(!ht(e.content)||!ht(e.content.firstElementChild))&&b(/<[/\w]/g,e.innerHTML)&&b(/<[/\w]/g,e.textContent))return at(e),!0;if("select"===r&&b(/<template/i,e.innerHTML))return at(e),!0;if(!we[r]||Ae[r]){if(Ue&&!He[r]){var i=ne(e)||e.parentNode,o=te(e)||e.childNodes;if(o&&i)for(var s=o.length-1;s>=0;--s)i.insertBefore(Q(o[s],!0),ee(e))}return at(e),!0}return e instanceof c&&!st(e)?(at(e),!0):"noscript"!==r&&"noembed"!==r||!b(/<\/no(script|embed)/i,e.innerHTML)?(Le&&3===e.nodeType&&(t=e.textContent,t=y(t,fe," "),t=y(t,ge," "),e.textContent!==t&&(f(n.removed,{element:e.cloneNode()}),e.textContent=t)),pt("afterSanitizeElements",e,null),!1):(at(e),!0)},gt=function(e,t,n){if(Ne&&("id"===t||"name"===t)&&(n in i||n in et))return!1;if(Ee&&!Oe[t]&&b(me,t));else if(Te&&b(ye,t));else{if(!xe[t]||Oe[t])return!1;if(Je[t]);else if(b(be,y(n,_e,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==v(n,"data:")||!We[e])if(ke&&!b(ve,y(n,_e,"")));else if(n)return!1}return!0},mt=function(e){var t=void 0,r=void 0,i=void 0,o=void 0;pt("beforeSanitizeAttributes",e,null);var s=e.attributes;if(s){var a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:xe};for(o=s.length;o--;){var l=t=s[o],c=l.name,u=l.namespaceURI;if(r=_(t.value),i=g(c),a.attrName=i,a.attrValue=r,a.keepAttr=!0,a.forceKeepAttr=void 0,pt("uponSanitizeAttribute",e,a),r=a.attrValue,!a.forceKeepAttr&&(lt(c,e),a.keepAttr))if(b(/\/>/i,r))lt(c,e);else{Le&&(r=y(r,fe," "),r=y(r,ge," "));var d=e.nodeName.toLowerCase();if(gt(d,i,r))try{u?e.setAttributeNS(u,c,r):e.setAttribute(c,r),p(n.removed)}catch(e){}}}pt("afterSanitizeAttributes",e,null)}},yt=function e(t){var n=void 0,r=ut(t);for(pt("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)pt("uponSanitizeShadowNode",n,null),ft(n)||(n.content instanceof s&&e(n.content),mt(n));pt("afterSanitizeShadowDOM",t,null)};return n.sanitize=function(e,i){var o=void 0,a=void 0,c=void 0,u=void 0,d=void 0;if((Xe=!e)&&(e="\x3c!--\x3e"),"string"!=typeof e&&!ht(e)){if("function"!=typeof e.toString)throw w("toString is not a function");if("string"!=typeof(e=e.toString()))throw w("dirty is not a string, aborting")}if(!n.isSupported){if("object"===W(t.toStaticHTML)||"function"==typeof t.toStaticHTML){if("string"==typeof e)return t.toStaticHTML(e);if(ht(e))return t.toStaticHTML(e.outerHTML)}return e}if(Ie||tt(i),n.removed=[],"string"==typeof e&&($e=!1),$e);else if(e instanceof l)1===(a=(o=ct("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===a.nodeName||"HTML"===a.nodeName?o=a:o.appendChild(a);else{if(!Me&&!Le&&!Fe&&-1===e.indexOf("<"))return ie&&De?ie.createHTML(e):e;if(!(o=ct(e)))return Me?null:oe}o&&Re&&at(o.firstChild);for(var h=ut($e?e:o);c=h.nextNode();)3===c.nodeType&&c===u||ft(c)||(c.content instanceof s&&yt(c.content),mt(c),u=c);if(u=null,$e)return e;if(Me){if(je)for(d=ce.call(o.ownerDocument);o.firstChild;)d.appendChild(o.firstChild);else d=o;return Pe&&(d=de.call(r,d,!0)),d}var p=Fe?o.outerHTML:o.innerHTML;return Le&&(p=y(p,fe," "),p=y(p,ge," ")),ie&&De?ie.createHTML(p):p},n.setConfig=function(e){tt(e),Ie=!0},n.clearConfig=function(){Qe=null,Ie=!1},n.isValidAttribute=function(e,t,n){Qe||tt({});var r=g(e),i=g(t);return gt(r,i,n)},n.addHook=function(e,t){"function"==typeof t&&(pe[e]=pe[e]||[],f(pe[e],t))},n.removeHook=function(e){pe[e]&&p(pe[e])},n.removeHooks=function(e){pe[e]&&(pe[e]=[])},n.removeAllHooks=function(){pe={}},n}()}()},729:e=>{"use strict";var t=Object.prototype.hasOwnProperty,n="~";function r(){}function i(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,r,o,s){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new i(r,o||e,s),l=n?n+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],a]:e._events[l].push(a):(e._events[l]=a,e._eventsCount++),e}function s(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,i=[];if(0===this._eventsCount)return i;for(r in e=this._events)t.call(e,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,o=r.length,s=new Array(o);i<o;i++)s[i]=r[i].fn;return s},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,i,o,s){var a=n?n+e:e;if(!this._events[a])return!1;var l,c,u=this._events[a],d=arguments.length;if(u.fn){switch(u.once&&this.removeListener(e,u.fn,void 0,!0),d){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,t),!0;case 3:return u.fn.call(u.context,t,r),!0;case 4:return u.fn.call(u.context,t,r,i),!0;case 5:return u.fn.call(u.context,t,r,i,o),!0;case 6:return u.fn.call(u.context,t,r,i,o,s),!0}for(c=1,l=new Array(d-1);c<d;c++)l[c-1]=arguments[c];u.fn.apply(u.context,l)}else{var h,p=u.length;for(c=0;c<p;c++)switch(u[c].once&&this.removeListener(e,u[c].fn,void 0,!0),d){case 1:u[c].fn.call(u[c].context);break;case 2:u[c].fn.call(u[c].context,t);break;case 3:u[c].fn.call(u[c].context,t,r);break;case 4:u[c].fn.call(u[c].context,t,r,i);break;default:if(!l)for(h=1,l=new Array(d-1);h<d;h++)l[h-1]=arguments[h];u[c].fn.apply(u[c].context,l)}}return!0},a.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,i){var o=n?n+e:e;if(!this._events[o])return this;if(!t)return s(this,o),this;var a=this._events[o];if(a.fn)a.fn!==t||i&&!a.once||r&&a.context!==r||s(this,o);else{for(var l=0,c=[],u=a.length;l<u;l++)(a[l].fn!==t||i&&!a[l].once||r&&a[l].context!==r)&&c.push(a[l]);c.length?this._events[o]=1===c.length?c[0]:c:s(this,o)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&s(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a},717:e=>{"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},824:e=>{var t=1e3,n=60*t,r=60*n,i=24*r;function o(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}e.exports=function(e,s){s=s||{};var a,l,c=typeof e;if("string"===c&&e.length>0)return function(e){if(!((e=String(e)).length>100)){var o=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(o){var s=parseFloat(o[1]);switch((o[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*s;case"weeks":case"week":case"w":return 6048e5*s;case"days":case"day":case"d":return s*i;case"hours":case"hour":case"hrs":case"hr":case"h":return s*r;case"minutes":case"minute":case"mins":case"min":case"m":return s*n;case"seconds":case"second":case"secs":case"sec":case"s":return s*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return s;default:return}}}}(e);if("number"===c&&isFinite(e))return s.long?(a=e,(l=Math.abs(a))>=i?o(a,l,i,"day"):l>=r?o(a,l,r,"hour"):l>=n?o(a,l,n,"minute"):l>=t?o(a,l,t,"second"):a+" ms"):function(e){var o=Math.abs(e);return o>=i?Math.round(e/i)+"d":o>=r?Math.round(e/r)+"h":o>=n?Math.round(e/n)+"m":o>=t?Math.round(e/t)+"s":e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},520:(e,t,n)=>{"use strict";var r=n(155),i="win32"===r.platform,o=n(539);function s(e,t){for(var n=[],r=0;r<e.length;r++){var i=e[r];i&&"."!==i&&(".."===i?n.length&&".."!==n[n.length-1]?n.pop():t&&n.push(".."):n.push(i))}return n}function a(e){for(var t=e.length-1,n=0;n<=t&&!e[n];n++);for(var r=t;r>=0&&!e[r];r--);return 0===n&&r===t?e:n>r?[]:e.slice(n,r+1)}var l=/^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/,c=/^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/,u={};function d(e){var t=l.exec(e),n=(t[1]||"")+(t[2]||""),r=t[3]||"",i=c.exec(r);return[n,i[1],i[2],i[3]]}function h(e){var t=l.exec(e),n=t[1]||"",r=!!n&&":"!==n[1];return{device:n,isUnc:r,isAbsolute:r||!!t[2],tail:t[3]}}function p(e){return"\\\\"+e.replace(/^[\\\/]+/,"").replace(/[\\\/]+/g,"\\")}u.resolve=function(){for(var e="",t="",n=!1,i=arguments.length-1;i>=-1;i--){var a;if(i>=0?a=arguments[i]:e?(a=r.env["="+e])&&a.substr(0,3).toLowerCase()===e.toLowerCase()+"\\"||(a=e+"\\"):a=r.cwd(),!o.isString(a))throw new TypeError("Arguments to path.resolve must be strings");if(a){var l=h(a),c=l.device,u=l.isUnc,d=l.isAbsolute,f=l.tail;if((!c||!e||c.toLowerCase()===e.toLowerCase())&&(e||(e=c),n||(t=f+"\\"+t,n=d),e&&n))break}}return u&&(e=p(e)),e+(n?"\\":"")+(t=s(t.split(/[\\\/]+/),!n).join("\\"))||"."},u.normalize=function(e){var t=h(e),n=t.device,r=t.isUnc,i=t.isAbsolute,o=t.tail,a=/[\\\/]$/.test(o);return(o=s(o.split(/[\\\/]+/),!i).join("\\"))||i||(o="."),o&&a&&(o+="\\"),r&&(n=p(n)),n+(i?"\\":"")+o},u.isAbsolute=function(e){return h(e).isAbsolute},u.join=function(){for(var e=[],t=0;t<arguments.length;t++){var n=arguments[t];if(!o.isString(n))throw new TypeError("Arguments to path.join must be strings");n&&e.push(n)}var r=e.join("\\");return/^[\\\/]{2}[^\\\/]/.test(e[0])||(r=r.replace(/^[\\\/]{2,}/,"\\")),u.normalize(r)},u.relative=function(e,t){e=u.resolve(e),t=u.resolve(t);for(var n=e.toLowerCase(),r=t.toLowerCase(),i=a(t.split("\\")),o=a(n.split("\\")),s=a(r.split("\\")),l=Math.min(o.length,s.length),c=l,d=0;d<l;d++)if(o[d]!==s[d]){c=d;break}if(0==c)return t;var h=[];for(d=c;d<o.length;d++)h.push("..");return(h=h.concat(i.slice(c))).join("\\")},u._makeLong=function(e){if(!o.isString(e))return e;if(!e)return"";var t=u.resolve(e);return/^[a-zA-Z]\:\\/.test(t)?"\\\\?\\"+t:/^\\\\[^?.]/.test(t)?"\\\\?\\UNC\\"+t.substring(2):e},u.dirname=function(e){var t=d(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},u.basename=function(e,t){var n=d(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},u.extname=function(e){return d(e)[3]},u.format=function(e){if(!o.isObject(e))throw new TypeError("Parameter 'pathObject' must be an object, not "+typeof e);var t=e.root||"";if(!o.isString(t))throw new TypeError("'pathObject.root' must be a string or undefined, not "+typeof e.root);var n=e.dir,r=e.base||"";return n?n[n.length-1]===u.sep?n+r:n+u.sep+r:r},u.parse=function(e){if(!o.isString(e))throw new TypeError("Parameter 'pathString' must be a string, not "+typeof e);var t=d(e);if(!t||4!==t.length)throw new TypeError("Invalid path '"+e+"'");return{root:t[0],dir:t[0]+t[1].slice(0,-1),base:t[2],ext:t[3],name:t[2].slice(0,t[2].length-t[3].length)}},u.sep="\\",u.delimiter=";";var f=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,g={};function m(e){return f.exec(e).slice(1)}g.resolve=function(){for(var e="",t=!1,n=arguments.length-1;n>=-1&&!t;n--){var i=n>=0?arguments[n]:r.cwd();if(!o.isString(i))throw new TypeError("Arguments to path.resolve must be strings");i&&(e=i+"/"+e,t="/"===i[0])}return(t?"/":"")+(e=s(e.split("/"),!t).join("/"))||"."},g.normalize=function(e){var t=g.isAbsolute(e),n=e&&"/"===e[e.length-1];return(e=s(e.split("/"),!t).join("/"))||t||(e="."),e&&n&&(e+="/"),(t?"/":"")+e},g.isAbsolute=function(e){return"/"===e.charAt(0)},g.join=function(){for(var e="",t=0;t<arguments.length;t++){var n=arguments[t];if(!o.isString(n))throw new TypeError("Arguments to path.join must be strings");n&&(e+=e?"/"+n:n)}return g.normalize(e)},g.relative=function(e,t){e=g.resolve(e).substr(1),t=g.resolve(t).substr(1);for(var n=a(e.split("/")),r=a(t.split("/")),i=Math.min(n.length,r.length),o=i,s=0;s<i;s++)if(n[s]!==r[s]){o=s;break}var l=[];for(s=o;s<n.length;s++)l.push("..");return(l=l.concat(r.slice(o))).join("/")},g._makeLong=function(e){return e},g.dirname=function(e){var t=m(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},g.basename=function(e,t){var n=m(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},g.extname=function(e){return m(e)[3]},g.format=function(e){if(!o.isObject(e))throw new TypeError("Parameter 'pathObject' must be an object, not "+typeof e);var t=e.root||"";if(!o.isString(t))throw new TypeError("'pathObject.root' must be a string or undefined, not "+typeof e.root);return(e.dir?e.dir+g.sep:"")+(e.base||"")},g.parse=function(e){if(!o.isString(e))throw new TypeError("Parameter 'pathString' must be a string, not "+typeof e);var t=m(e);if(!t||4!==t.length)throw new TypeError("Invalid path '"+e+"'");return t[1]=t[1]||"",t[2]=t[2]||"",t[3]=t[3]||"",{root:t[0],dir:t[0]+t[1].slice(0,-1),base:t[2],ext:t[3],name:t[2].slice(0,t[2].length-t[3].length)}},g.sep="/",g.delimiter=":",e.exports=i?u:g,e.exports.posix=g,e.exports.win32=u},155:e=>{var t,n,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var a,l=[],c=!1,u=-1;function d(){c&&a&&(c=!1,a.length?l=a.concat(l):u=-1,l.length&&h())}function h(){if(!c){var e=s(d);c=!0;for(var t=l.length;t;){for(a=l,l=[];++u<t;)a&&a[u].run();u=-1,t=l.length}a=null,c=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===o||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function f(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new p(e,t)),1!==l.length||c||s(h)},p.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=f,r.addListener=f,r.once=f,r.off=f,r.removeListener=f,r.removeAllListeners=f,r.emit=f,r.prependListener=f,r.prependOnceListener=f,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},384:e=>{e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},539:(e,t,n)=>{var r=n(155),i=/%[sdj%]/g;t.format=function(e){if(!y(e)){for(var t=[],n=0;n<arguments.length;n++)t.push(a(arguments[n]));return t.join(" ")}n=1;for(var r=arguments,o=r.length,s=String(e).replace(i,(function(e){if("%%"===e)return"%";if(n>=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(e){return"[Circular]"}default:return e}})),l=r[n];n<o;l=r[++n])g(l)||!b(l)?s+=" "+l:s+=" "+a(l);return s},t.deprecate=function(e,i){if(v(n.g.process))return function(){return t.deprecate(e,i).apply(this,arguments)};if(!0===r.noDeprecation)return e;var o=!1;return function(){if(!o){if(r.throwDeprecation)throw new Error(i);r.traceDeprecation?console.trace(i):console.error(i),o=!0}return e.apply(this,arguments)}};var o,s={};function a(e,n){var r={seen:[],stylize:c};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),f(n)?r.showHidden=n:n&&t._extend(r,n),v(r.showHidden)&&(r.showHidden=!1),v(r.depth)&&(r.depth=2),v(r.colors)&&(r.colors=!1),v(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=l),u(r,e,r.depth)}function l(e,t){var n=a.styles[t];return n?"["+a.colors[n][0]+"m"+e+"["+a.colors[n][1]+"m":e}function c(e,t){return e}function u(e,n,r){if(e.customInspect&&n&&x(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return y(i)||(i=u(e,i,r)),i}var o=function(e,t){if(v(t))return e.stylize("undefined","undefined");if(y(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return m(t)?e.stylize(""+t,"number"):f(t)?e.stylize(""+t,"boolean"):g(t)?e.stylize("null","null"):void 0}(e,n);if(o)return o;var s=Object.keys(n),a=function(e){var t={};return e.forEach((function(e,n){t[e]=!0})),t}(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(n)),C(n)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return d(n);if(0===s.length){if(x(n)){var l=n.name?": "+n.name:"";return e.stylize("[Function"+l+"]","special")}if(_(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(w(n))return e.stylize(Date.prototype.toString.call(n),"date");if(C(n))return d(n)}var c,b="",S=!1,A=["{","}"];return p(n)&&(S=!0,A=["[","]"]),x(n)&&(b=" [Function"+(n.name?": "+n.name:"")+"]"),_(n)&&(b=" "+RegExp.prototype.toString.call(n)),w(n)&&(b=" "+Date.prototype.toUTCString.call(n)),C(n)&&(b=" "+d(n)),0!==s.length||S&&0!=n.length?r<0?_(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special"):(e.seen.push(n),c=S?function(e,t,n,r,i){for(var o=[],s=0,a=t.length;s<a;++s)E(t,String(s))?o.push(h(e,t,n,r,String(s),!0)):o.push("");return i.forEach((function(i){i.match(/^\d+$/)||o.push(h(e,t,n,r,i,!0))})),o}(e,n,r,a,s):s.map((function(t){return h(e,n,r,a,t,S)})),e.seen.pop(),function(e,t,n){return e.reduce((function(e,t){return t.indexOf("\n"),e+t.replace(/\u001b\[\d\d?m/g,"").length+1}),0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}(c,b,A)):A[0]+b+A[1]}function d(e){return"["+Error.prototype.toString.call(e)+"]"}function h(e,t,n,r,i,o){var s,a,l;if((l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?a=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(a=e.stylize("[Setter]","special")),E(r,i)||(s="["+i+"]"),a||(e.seen.indexOf(l.value)<0?(a=g(n)?u(e,l.value,null):u(e,l.value,n-1)).indexOf("\n")>-1&&(a=o?a.split("\n").map((function(e){return" "+e})).join("\n").substr(2):"\n"+a.split("\n").map((function(e){return" "+e})).join("\n")):a=e.stylize("[Circular]","special")),v(s)){if(o&&i.match(/^\d+$/))return a;(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+a}function p(e){return Array.isArray(e)}function f(e){return"boolean"==typeof e}function g(e){return null===e}function m(e){return"number"==typeof e}function y(e){return"string"==typeof e}function v(e){return void 0===e}function _(e){return b(e)&&"[object RegExp]"===S(e)}function b(e){return"object"==typeof e&&null!==e}function w(e){return b(e)&&"[object Date]"===S(e)}function C(e){return b(e)&&("[object Error]"===S(e)||e instanceof Error)}function x(e){return"function"==typeof e}function S(e){return Object.prototype.toString.call(e)}function A(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(e){if(v(o)&&(o=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!s[e])if(new RegExp("\\b"+e+"\\b","i").test(o)){var n=r.pid;s[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,n,r)}}else s[e]=function(){};return s[e]},t.inspect=a,a.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},a.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=p,t.isBoolean=f,t.isNull=g,t.isNullOrUndefined=function(e){return null==e},t.isNumber=m,t.isString=y,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=v,t.isRegExp=_,t.isObject=b,t.isDate=w,t.isError=C,t.isFunction=x,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=n(384);var O=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function T(){var e=new Date,t=[A(e.getHours()),A(e.getMinutes()),A(e.getSeconds())].join(":");return[e.getDate(),O[e.getMonth()],t].join(" ")}function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",T(),t.format.apply(t,arguments))},t.inherits=n(717),t._extend=function(e,t){if(!t||!b(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{"use strict";n.r(r),n.d(r,{PluginLocal:()=>Se,pluginHelpers:()=>e,setupPluginCore:()=>Oe});var e={};n.r(e),n.d(e,{IS_DEV:()=>p,PROTOCOL_FILE:()=>f,PROTOCOL_LSP:()=>g,URL_LSP:()=>m,deepMerge:()=>w,deferred:()=>T,genID:()=>C,getAppPathRoot:()=>v,getSDKPathRoot:()=>_,invokeHostExportedApi:()=>E,isObject:()=>b,path:()=>h,safetyPathJoin:()=>A,safetyPathNormalize:()=>O,setupIframeSandbox:()=>k,setupInjectedStyle:()=>L,setupInjectedTheme:()=>M,setupInjectedUI:()=>F,transformableEvent:()=>I,ucFirst:()=>x,withFileProtocol:()=>S});var t=n(729),i=n.n(t),o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function s(e){return e.toLowerCase()}Object.create,Object.create;var a=[/([a-z0-9])([A-Z])/g,/([A-Z])([A-Z][a-z])/g],l=/[^A-Z0-9]+/gi;function c(e,t,n){return t instanceof RegExp?e.replace(t,n):t.reduce((function(e,t){return e.replace(t,n)}),e)}function u(e,t){return void 0===t&&(t={}),function(e,t){return void 0===t&&(t={}),function(e,t){void 0===t&&(t={});for(var n=t.splitRegexp,r=void 0===n?a:n,i=t.stripRegexp,o=void 0===i?l:i,u=t.transform,d=void 0===u?s:u,h=t.delimiter,p=void 0===h?" ":h,f=c(c(e,r,"$1\0$2"),o,"\0"),g=0,m=f.length;"\0"===f.charAt(g);)g++;for(;"\0"===f.charAt(m-1);)m--;return f.slice(g,m).split("\0").map(d).join(p)}(e,o({delimiter:"."},t))}(e,o({delimiter:"_"},t))}var d=n(520);const h="win32"===navigator.platform.toLowerCase()?d.win32:d.posix,p=!1,f="file://",g="lsp://",m=g+"logseq.io/";let y;async function v(){return y||(y=await E("_callApplication","getAppPath"))}async function _(){return p?localStorage.getItem("LSP_DEV_SDK_ROOT")||"http://localhost:8080":A(await v(),"js")}function b(e){return e===Object(e)&&!Array.isArray(e)}function w(e,...t){if(!t.length)return e;const n=e;if(b(n)){const e=t.length;for(let r=0;r<e;r+=1){const e=t[r];if(b(e))for(const t in e)e.hasOwnProperty(t)&&(b(e[t])?(n[t]&&b(n[t])||(n[t]={}),w(n[t],e[t])):Array.isArray(n[t])&&Array.isArray(e[t])?n[t]=Array.from(new Set(n[t].concat(e[t]))):n[t]=e[t])}}return n}function C(){return"_"+Math.random().toString(36).substr(2,9)}function x(e){return e.charAt(0).toUpperCase()+e.slice(1)}function S(e){return e?(/^(http|file|lsp)/.test(e)||(e=f+e),e):""}function A(e,...t){try{const n=new URL(e);if(!n.origin)throw new Error(null);const r=h.join(e.substr(n.origin.length),...t);return n.origin+r}catch(n){return h.join(e,...t)}}function O(e){return e?.match(/^(http?|lsp|assets):/)||(e=h.normalize(e)),e}function T(e,t){let n,r,i=!1;const o=t=>n=>{e&&clearTimeout(e),t(n),i=!0},s=new Promise(((i,s)=>{n=o(i),r=o(s),e&&(e=setTimeout((()=>r(new Error(`[deferred timeout] ${t}`))),e))}));return{created:Date.now(),setTag:e=>t=e,resolve:n,reject:r,promise:s,get settled(){return i}}}function E(e,...t){const n=u(e),r=window.logseq?.api||{},i=r[n]||window.apis[n]||r[e]||window.apis[e];if(!i)throw new Error(`Not existed method #${e}`);return"function"!=typeof i?i:i.apply(null,t)}function k(e,t){const n=document.createElement("iframe");return n.classList.add("lsp-iframe-sandbox"),Object.entries(e).forEach((([e,t])=>{n.setAttribute(e,t)})),t.appendChild(n),async()=>{t.removeChild(n)}}function L(e,t){const n=t["data-injected-style"];let r=n&&document.querySelector(`[data-injected-style=${n}]`);if(!r)return r=document.createElement("style"),r.textContent=e,t&&Object.entries(t).forEach((([e,t])=>{r.setAttribute(e,t)})),document.head.append(r),()=>{document.head.removeChild(r)};r.textContent=e}function F(e,t){const n=this;let r="",i="";"slot"in e?(r=e.slot,i=`#${r}`):i=e.path;const o=i&&document.querySelector(i);if(!o)return void console.error(`${this.debugTag} can not resolve selector target ${i}`);const s=`${e.key}-${r}-${n.id}`,a=`${e.key}-${n.id}`;let l=document.querySelector(`#${s}`);if(!l)return l=document.createElement("div"),l.id=s,l.dataset.injectedUi=a||"",l.innerHTML=e.template,t&&Object.entries(t).forEach((([e,t])=>{l.setAttribute(e,t)})),o.appendChild(l),["click","focus","focusin","focusout","blur","dblclick","keyup","keypress","keydown","change","input"].forEach((e=>{l.addEventListener(e,(t=>{const r=t.target.closest(`[data-on-${e}]`);if(!r)return;const i=r.dataset[`on${x(e)}`];i&&n.caller?.callUserModel(i,I(r))}),!1)})),()=>{o.removeChild(l)};l.innerHTML=e.template}function I(e,t){const n={};if(e){const t=e.dataset,r="rect";["value","id","className","dataset",r].forEach((i=>{let o;switch(i){case r:if(!t.hasOwnProperty(r))return;o=e.getBoundingClientRect().toJSON();break;default:o=e[i]}"object"==typeof o&&(o={...o}),n[i]=o}))}return n}let R=null;function M(e){if(R?.call(),!e)return;const t=document.createElement("link");return t.rel="stylesheet",t.href=e,document.head.appendChild(t),R=()=>{document.head.removeChild(t),R=null}}var j=n(227),P=n.n(j);const D="application/x-postmate-v1+json";let N=0;const U={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1},$=(e,t)=>!("string"==typeof t&&e.origin!==t||!e.data||"object"==typeof e.data&&!("postmate"in e.data)||e.data.type!==D||!U[e.data.postmate]);class z{parent;frame;child;events={};childOrigin;listener;constructor(e){this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.listener=e=>{if(!$(e,this.childOrigin))return!1;const{data:t,name:n}=((e||{}).data||{}).value||{};"emit"===e.data.postmate&&n in this.events&&this.events[n].forEach((e=>{e.call(this,t)}))},this.parent.addEventListener("message",this.listener,!1)}get(e){return new Promise((t=>{const n=++N,r=e=>{e.data.uid===n&&"reply"===e.data.postmate&&(this.parent.removeEventListener("message",r,!1),t(e.data.value))};this.parent.addEventListener("message",r,!1),this.child.postMessage({postmate:"request",type:D,property:e,uid:n},this.childOrigin)}))}call(e,t){this.child.postMessage({postmate:"call",type:D,property:e,data:t},this.childOrigin)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}destroy(){window.removeEventListener("message",this.listener,!1),this.frame.parentNode.removeChild(this.frame)}}class H{model;parent;parentOrigin;child;constructor(e){this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",(e=>{if(!$(e,this.parentOrigin))return;const{property:t,uid:n,data:r}=e.data;"call"!==e.data.postmate?((e,t)=>{const n="function"==typeof e[t]?e[t]():e[t];return Promise.resolve(n)})(this.model,t).then((r=>{e.source.postMessage({property:t,postmate:"reply",type:D,uid:n,value:r},e.origin)})):t in this.model&&"function"==typeof this.model[t]&&this.model[t](r)}))}emit(e,t){this.parent.postMessage({postmate:"emit",type:D,value:{name:e,data:t}},this.parentOrigin)}}class B{static debug=!1;container;parent;frame;child;childOrigin;url;model;static Model;constructor(e){this.container=e.container,this.url=e.url,this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=e.name||"",this.frame.classList.add.apply(this.frame.classList,e.classListArray||[]),this.container.appendChild(this.frame),this.child=this.frame.contentWindow,this.model=e.model||{}}sendHandshake(e){const t=(e=>{const t=document.createElement("a");t.href=e;const n=t.protocol.length>4?t.protocol:window.location.protocol,r=t.host.length?"80"===t.port||"443"===t.port?t.hostname:t.host:window.location.host;return t.origin||`${n}//${r}`})(e=e||this.url);let n,r=0;return new Promise(((i,o)=>{const s=e=>!!$(e,t)&&("handshake-reply"===e.data.postmate?(clearInterval(n),this.parent.removeEventListener("message",s,!1),this.childOrigin=e.origin,i(new z(this))):o("Failed handshake"));this.parent.addEventListener("message",s,!1);const a=()=>{r++,this.child.postMessage({postmate:"handshake",type:D,model:this.model},t),5===r&&clearInterval(n)};this.frame.addEventListener("load",(()=>{a(),n=setInterval(a,500)})),this.frame.src=e}))}}class W{child;model;parent;parentOrigin;constructor(e){this.child=window,this.model=e,this.parent=this.child.parent}sendHandshakeReply(){return new Promise(((e,t)=>{const n=r=>{if(r.data.postmate){if("handshake"===r.data.postmate){this.child.removeEventListener("message",n,!1),r.source.postMessage({postmate:"handshake-reply",type:D},r.origin),this.parentOrigin=r.origin;const t=r.data.model;return t&&Object.keys(t).forEach((e=>{this.model[e]=t[e]})),e(new H(this))}return t("Handshake Reply Failed")}};this.child.addEventListener("message",n,!1)}))}}class G{ctx;constructor(e){this.ctx=e}get ctxId(){return this.ctx.baseInfo.id}setItem(e,t){return this.ctx.caller.callAsync("api:call",{method:"write-plugin-storage-file",args:[this.ctxId,e,t]})}getItem(e){return this.ctx.caller.callAsync("api:call",{method:"read-plugin-storage-file",args:[this.ctxId,e]})}removeItem(e){return this.ctx.caller.call("api:call",{method:"unlink-plugin-storage-file",args:[this.ctxId,e]})}clear(){return this.ctx.caller.call("api:call",{method:"clear-plugin-storage-files",args:[this.ctxId]})}hasItem(e){return this.ctx.caller.callAsync("api:call",{method:"exist-plugin-storage-file",args:[this.ctxId,e]})}}const J=Symbol.for("proxy-continue"),q=P()("LSPlugin:user");function Z(e,t,n){if("function"!=typeof n)return!1;const{key:r,label:i}=t,o=`SimpleCommandHook${r}${++V}`;this.Editor["on"+o](n),this.caller?.call("api:call",{method:"register-plugin-simple-command",args:[this.baseInfo.id,[{key:r,label:i,type:e},["editor/hook",o]]]})}const K={registerUIItem(e,t){const n=this.baseInfo.id;this.caller?.call("api:call",{method:"register-plugin-ui-item",args:[n,e,t]})},registerPageMenuItem(e,t){if("function"!=typeof t)return!1;const n=e+"_"+this.baseInfo.id,r=e;Z.call(this,"page-menu-item",{key:n,label:r},t)}};let V=0;const Y={registerSlashCommand(e,t){q("Register slash command #",this.baseInfo.id,e,t),"function"==typeof t&&(t=[["editor/clear-current-slash",!1],["editor/restore-saved-cursor"],["editor/hook",t]]),t=t.map((e=>{const[t,...n]=e;switch(t){case"editor/hook":let r=n[0],i=()=>{this.caller?.callUserModel(r)};"function"==typeof r&&(i=r);const o=`SlashCommandHook${t}${++V}`;e[1]=o,this.Editor["on"+o](i)}return e})),this.caller?.call("api:call",{method:"register-plugin-slash-command",args:[this.baseInfo.id,[e,t]]})},registerBlockContextMenuItem(e,t){if("function"!=typeof t)return!1;const n=e+"_"+this.baseInfo.id,r=e;Z.call(this,"block-context-menu-item",{key:n,label:r},t)},scrollToBlockInPage(e,t){const n="block-content-"+t;this.App.pushState("page",{name:e},{anchor:n})}},X={};class Q extends(i()){_baseInfo;_caller;_connected=!1;_ui=new Map;_fileStorage;_beforeunloadCallback;constructor(e,t){super(),this._baseInfo=e,this._caller=t,t.on("settings:changed",(e=>{const t=Object.assign({},this.settings),n=Object.assign(this._baseInfo.settings,e);this.emit("settings:changed",{...n},t)})),t.on("beforeunload",(async e=>{const{actor:n,...r}=e,i=this._beforeunloadCallback;try{i&&await i(r),n?.resolve(null)}catch(e){console.debug(`${t.debugTag} [beforeunload] `,e),n?.reject(e)}})),this._fileStorage=new G(this)}async ready(e,t){if(!this._connected)try{"function"==typeof e&&(t=e,e={});let n=await this._caller.connectToParent(e);n=w(this._baseInfo,n),this._connected=!0,n?.id&&(this._caller.debugTag=`#${n.id} [${n.name}]`),t&&t.call(this,n)}catch(e){console.error("[LSPlugin Ready Error]",e)}}ensureConnected(){if(!this._connected)throw new Error("not connected")}beforeunload(e){"function"==typeof e&&(this._beforeunloadCallback=e)}provideModel(e){return this.caller._extendUserModel(e),this}provideTheme(e){return this.caller.call("provider:theme",e),this}provideStyle(e){return this.caller.call("provider:style",e),this}provideUI(e){return this.caller.call("provider:ui",e),this}updateSettings(e){this.caller.call("settings:update",e)}setMainUIAttrs(e){this.caller.call("main-ui:attrs",e)}setMainUIInlineStyle(e){this.caller.call("main-ui:style",e)}hideMainUI(e){const t={key:0,visible:!1,cursor:e?.restoreEditingCursor};this.caller.call("main-ui:visible",t),this.emit("ui:visible:changed",t),this._ui.set(t.key,t)}showMainUI(){const e={key:0,visible:!0};this.caller.call("main-ui:visible",e),this.emit("ui:visible:changed",e),this._ui.set(e.key,e)}toggleMainUI(){const e=this._ui.get(0);e&&e.visible?this.hideMainUI():this.showMainUI()}get isMainUIVisible(){const e=this._ui.get(0);return Boolean(e&&e.visible)}get connected(){return this._connected}get baseInfo(){return this._baseInfo}get settings(){return this.baseInfo?.settings}get caller(){return this._caller}resolveResourceFullUrl(e){if(this.ensureConnected(),e)return e=e.replace(/^[.\\/]+/,""),A(this._baseInfo.lsr,e)}_makeUserProxy(e,t){const n=this,r=this.caller;return new Proxy(e,{get(e,i,o){const s=e[i];return function(...e){if(!s||s.apply(n,e)===J){if(t){const n=i.toString().match(/^(once|off|on)/i);if(null!=n){const i=n[0].toLowerCase(),o=n.input.slice(i.length),s=`hook:${t}:${u(o)}`,a=e[0];return r[i](s,a),"off"!==i?()=>r.off(s,a):void 0}}return r.callAsync("api:call",{method:i,args:e})}}}})}get App(){return this._makeUserProxy(K,"app")}get Editor(){return this._makeUserProxy(Y,"editor")}get DB(){return this._makeUserProxy(X)}get FileStorage(){return this._fileStorage}}if(null==window.__LSP__HOST__){const e=new pe(null);window.logseq=new Q({},e)}const{importHTML:ee,createSandboxContainer:te}=window.QSandbox||{};function ne(e,t){return e.startsWith("http")?fetch(e,t):(e=e.replace("file://",""),new Promise((async(t,n)=>{try{const n=await window.apis.doAction(["readFile",e]);t({text:()=>n})}catch(e){console.error(e),n(e)}})))}class re extends(i()){_pluginLocal;_frame;_root;_loaded=!1;_unmountFns=[];constructor(e){super(),this._pluginLocal=e,e._dispose((()=>{this._unmount()}))}async load(){const{name:e,entry:t}=this._pluginLocal.options;if(this.loaded||!t)return;const{template:n,execScripts:r}=await ee(t,{fetch:ne});this._mount(n,document.body);const i=te(e,{elementGetter:()=>this._root?.firstChild}).instance.proxy;i.__shadow_mode__=!0,i.LSPluginLocal=this._pluginLocal,i.LSPluginShadow=this,i.LSPluginUser=i.logseq=new Q(this._pluginLocal.toJSON(),this._pluginLocal.caller);const o=await r(i,!0);this._unmountFns.push(o.unmount),this._loaded=!0}_mount(e,t){const n=this._frame=document.createElement("div");n.classList.add("lsp-shadow-sandbox"),n.id=this._pluginLocal.id,this._root=n.attachShadow({mode:"open"}),this._root.innerHTML=`<div>${e}</div>`,t.appendChild(n),this.emit("mounted")}_unmount(){for(const e of this._unmountFns)e&&e.call(null)}destroy(){this.frame?.parentNode?.removeChild(this.frame)}get loaded(){return this._loaded}get document(){return this._root?.firstChild}get frame(){return this._frame}}const ie=P()("LSPlugin:caller"),oe="#await#response#",se="#lspmsg#",ae="#lspmsg#error#",le="#lspmsg#settings#",ce="#lspmsg#beforeunload#",ue="#lspmsg#reply#",de="#lspmsg#ready#",he=e=>`#lspmsg#${e}`;class pe extends(i()){_pluginLocal;_connected=!1;_parent;_child;_shadow;_status;_userModel={};_call;_callUserModel;_debugTag="";constructor(e){super(),this._pluginLocal=e,e&&(this._debugTag=e.debugTag)}async connectToChild(){if(this._connected)return;const{shadow:e}=this._pluginLocal;e?await this._setupShadowSandbox():await this._setupIframeSandbox()}async connectToParent(e={}){if(this._connected)return;const t=this,n=null!=this._pluginLocal;let r=0,i=0;const o=new Map,s=T(5e3),a=this._extendUserModel({[de]:async()=>{await s.resolve()},[ce]:async e=>{const n=T(1e4);t.emit("beforeunload",Object.assign({actor:n},e)),await n.promise},[le]:async({type:e,payload:n})=>{t.emit("settings:changed",n)},[se]:async({ns:e,type:n,payload:r})=>{ie(`[call from host] ${this._debugTag}`,e,n,r),e&&e.startsWith("hook")?t.emit(`${e}:${n}`,r):t.emit(n,r)},[ue]:({_sync:e,result:t})=>{if(ie(`[sync reply] #${e}`,t),o.has(e)){const n=o.get(e);n&&(t?.hasOwnProperty(ae)?n.reject(t[ae]):n.resolve(t),o.delete(e))}},...e});if(n)return await s.promise,JSON.parse(JSON.stringify(this._pluginLocal?.toJSON()));const l=new W(a).sendHandshakeReply();return this._status="pending",await l.then((e=>{this._child=e,this._connected=!0,this._call=async(t,n={},r)=>{if(r){const e=++i;o.set(e,r),n._sync=e,r.setTag(`async call #${e}`),ie("async call #",e)}return e.emit(he(a.baseInfo.id),{type:t,payload:n}),r?.promise},this._callUserModel=async(e,t)=>{try{a[e](t)}catch(t){ie(`[model method] #${e} not existed`)}},r=setInterval((()=>{if(o.size>100)for(const[e,t]of o)t.settled&&o.delete(e)}),18e5)})).finally((()=>{this._status=void 0})),await s.promise,a.baseInfo}async call(e,t={}){return this._call?.call(this,e,t)}async callAsync(e,t={}){const n=T(1e4);return this._call?.call(this,e,t,n)}async callUserModel(e,t={}){return this._callUserModel?.call(this,e,t)}async _setupIframeSandbox(){const e=document.body,t=this._pluginLocal,n=new URL(t.options.entry);n.searchParams.set("__v__",p?Date.now().toString():t.options.version);let r,i=new B({container:e,url:n.href,classListArray:["lsp-iframe-sandbox"],model:{baseInfo:JSON.parse(JSON.stringify(t.toJSON()))}}).sendHandshake();return this._status="pending",new Promise(((e,n)=>{r=setTimeout((()=>{n(new Error("handshake Timeout"))}),3e3),i.then((n=>{this._parent=n,this._connected=!0,this.emit("connected"),n.frame.setAttribute("id",t.id),n.on(he(t.id),(({type:e,payload:t})=>{ie("[call from plugin] ",e,t),this._pluginLocal?.emit(e,t||{})})),this._call=async(...e)=>{await n.call(he(t.id),{type:e[0],payload:Object.assign(e[1]||{},{$$pid:t.id})})},this._callUserModel=async(e,t)=>{if(e.startsWith(oe))return await n.get(e.replace(oe,""));n.call(e,t)},e(null)})).catch((e=>{n(e)})).finally((()=>{clearTimeout(r)}))})).catch((e=>{throw ie("[iframe sandbox] error",e),e})).finally((()=>{this._status=void 0}))}async _setupShadowSandbox(){const e=this._pluginLocal,t=this._shadow=new re(e);try{this._status="pending",await t.load(),this._connected=!0,this.emit("connected"),this._call=async(t,n={},r)=>(r&&(n.actor=r),this._pluginLocal?.emit(t,Object.assign(n,{$$pid:e.id})),r?.promise),this._callUserModel=async(...e)=>{let t=e[0];t?.startsWith(oe)&&(t=t.replace(oe,""));const n=e[1]||{},r=this._userModel[t];"function"==typeof r&&await r.call(null,n)}}catch(e){throw ie("[shadow sandbox] error",e),e}finally{this._status=void 0}}_extendUserModel(e){return Object.assign(this._userModel,e)}_getSandboxIframeContainer(){return this._parent?.frame}_getSandboxShadowContainer(){return this._shadow?.frame}set debugTag(e){this._debugTag=e}async destroy(){this._parent&&await this._parent.destroy(),this._shadow&&this._shadow.destroy()}}var fe=n(856),ge=n.n(fe);const me=P()("LSPlugin:core"),ye="plugins";class ve extends(i()){_userPluginSettings;_settings={disabled:!1};constructor(e){super(),this._userPluginSettings=e,Object.assign(this._settings,e)}get(e){return this._settings[e]}set(e,t){const n=w({},this._settings);if("string"==typeof e){if(this._settings[e]==t)return;this._settings[e]=t}else{if(!b(e))return;w(this._settings,e)}this.emit("change",Object.assign({},this._settings),n)}toJSON(){return this._settings}}class _e extends(i()){_tag;_logs=[];constructor(e){super(),this._tag=e}write(e,t){let n=t.reduce(((e,t)=>(t&&t instanceof Error?e+=`${t.message} ${t.stack}`:e+=t.toString(),e)),`[${this._tag}][${(new Date).toLocaleTimeString()}] `);this._logs.push([e,n]),this.emit("change")}clear(){this._logs=[],this.emit("change")}info(...e){this.write("INFO",e)}error(...e){this.write("ERROR",e)}warn(...e){this.write("WARN",e)}toJSON(){return this._logs}}var be;function we(e,t){return t&&e.startsWith(f+t)&&(e=A(m,e.substr(f.length+t.length))),e}!function(e){e.LOADING="loading",e.UNLOADING="unloading",e.LOADED="loaded",e.UNLOADED="unload",e.ERROR="error"}(be||(be={}));class Ce extends Error{constructor(e){super(e),this.name=Ce.name}}class xe extends Error{constructor(e){super(e),this.name=xe.name}}class Se extends(i()){_options;_themeMgr;_ctx;_disposes=[];_id;_status=be.UNLOADED;_loadErr;_localRoot;_dotSettingsFile;_caller;constructor(e,t,n){var r;super(),this._options=e,this._themeMgr=t,this._ctx=n,this._id=e.key||C(),(r=this).on("settings:update",(e=>{e&&r.settings?.set(e)})),function(e){const t=e=>`main-ui:${e}`;e.on(t("visible"),(({visible:t,toggle:n,cursor:r})=>{const i=e.getMainUI();i?.classList[n?"toggle":t?"add":"remove"]("visible"),t&&!e.shadow&&i&&i.contentWindow?.focus(),r&&E("restore_editing_cursor")})),e.on(t("attrs"),(t=>{const n=e.getMainUI();Object.entries(t).forEach((([e,t])=>{n?.setAttribute(e,t)}))})),e.on(t("style"),(t=>{const n=e.getMainUI();Object.entries(t).forEach((([e,t])=>{n.style[e]=t}))}))}(this),function(e){let t=e=>`provider:${e}`,n=!1;e.on(t("theme"),(t=>{e.themeMgr.registerTheme(e.id,t),n||(e._dispose((()=>{e.themeMgr.unregisterTheme(e.id)})),n=!0)})),e.on(t("style"),(t=>{let n;"string"!=typeof t&&(n=t.key,t=t.style),t&&t.trim()&&e._dispose(L(t,{"data-injected-style":n?`${n}-${e.id}`:"","data-ref":e.id}))})),e.on(t("ui"),(t=>{e._onHostMounted((()=>{t.template=ge().sanitize(t.template,{ADD_TAGS:["iframe"],ALLOW_UNKNOWN_PROTOCOLS:!0,ADD_ATTR:["allow","src","allowfullscreen","frameborder","scrolling"]}),e._dispose(F.call(e,t,{"data-ref":e.id}))}))}))}(this),function(e){e.on("api:call",(async t=>{let n;try{n=await E(t.method,...t.args)}catch(e){n={[ae]:e}}const{_sync:r}=t;if(e.shadow)t.actor&&t.actor.resolve(n);else if(null!=r){const t=t=>{e.caller?.callUserModel(ue,{result:t,_sync:r})};Promise.resolve(n).then(t,t)}}))}(this)}async _setupUserSettings(){const{_options:e}=this,t=e.name.replace(/[^a-z0-9]/gi,"_").toLowerCase()+"_"+this.id,n=e.logger=new _e("Loader");try{const[n,r]=await E("load_plugin_user_settings",t);this._dotSettingsFile=n,(e.settings=new ve(r)).on("change",((e,n)=>{me("linked settings change",e),!e.disabled&&n.disabled&&this.load(),e.disabled&&!n.disabled&&this.unload(),e&&E("save_plugin_user_settings",t,e)}))}catch(e){me("[load plugin user settings Error]",e),n?.error(e)}}getMainUI(){return this.shadow?this.caller?._getSandboxShadowContainer():this.caller?._getSandboxIframeContainer()}_resolveResourceFullUrl(e,t){t=t||this._localRoot;const n=/^(http|file)/;if(!n.test(e)){const r=h.join(t,e);e=n.test(r)?r:f+r}return this.isInstalledInDotRoot?we(e,this.dotPluginsRoot):e}async _preparePackageConfigs(){const{url:e}=this._options;let t;try{if(!e)throw new Error("Can not resolve package config location");if(me("prepare package root",e),t=await E("load_plugin_config",e),!t||(t=JSON.parse(t),!t))throw new Error(`Parse package config error #${e}/package.json`)}catch(e){throw new Ce(e.message)}["name","author","repository","version","description"].forEach((e=>{this._options[e]=t[e]}));const n=this._localRoot=O(e),r=t.logseq||{};var i;(i=t.main)&&/\.(js|html)$/.test(i)&&(this._options.entry=this._resolveResourceFullUrl(t.main,n),r.mode&&(this._options.mode=r.mode));const o=r.icon||t.icon;if(o&&(this._options.icon=this._resolveResourceFullUrl(o)),r.id)this._id=r.id;else{r.id=this.id;try{await E("save_plugin_config",e,{...t,logseq:r})}catch(e){me("[save plugin ID Error] ",e)}}const{registeredPlugins:s,isRegistering:a}=this._ctx;if(a&&s.has(r.id))throw new xe("prepare package Error");return async()=>{try{let e=r.themes;e&&await this._loadConfigThemes(Array.isArray(e)?e:[e])}catch(e){me("[prepare package effect Error]",e)}}}async _tryToNormalizeEntry(){let{entry:e,settings:t}=this.options,n=t?.get("_devEntry");if(n)return void(this._options.entry=n);if(!e.endsWith(".js"))return;let r=null,i="write_user_tmp_file";this.isInstalledInDotRoot&&(i="write_dotdir_file",r=this._localRoot.replace(this.dotPluginsRoot,""),r=h.join(ye,r));let o=await _(),s=await E(i,`${this._id}_index.html`,`<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <title>logseq plugin entry</title>\n <script src="${o}/lsplugin.user.js"><\/script>\n </head>\n <body>\n <div id="app"></div>\n <script src="${e}"><\/script>\n </body>\n</html>`,r);e=we(S(h.normalize(s)),this.dotPluginsRoot),this._options.entry=e}async _loadConfigThemes(e){e.forEach((e=>{e.url&&(!e.url.startsWith("http")&&this._localRoot&&(e.url=h.join(this._localRoot,e.url),e.url.startsWith("file:")||(e.url="assets://"+e.url)),this.emit("provider:theme",e))}))}async load(e){if(!this.pending){this._status=be.LOADING,this._loadErr=void 0;try{let t=await this._preparePackageConfigs();if(this.settings||await this._setupUserSettings(),this.disabled||await t.call(null),this.disabled||!this.options.entry)return;await this._tryToNormalizeEntry(),this._caller=new pe(this),await this._caller.connectToChild();const n=()=>{this._caller?.callUserModel(de)};e?e.promise.then(n):n(),this._disposes.push((async()=>{await(this._caller?.destroy())}))}catch(e){me("[Load Plugin Error] ",e),this.logger?.error(e),this._status=be.ERROR,this._loadErr=e}finally{this._loadErr||(this.disabled?this._status=be.UNLOADED:this._status=be.LOADED)}}}async reload(){me("TODO: reload plugin",this.id)}async unload(e=!1){if(!this.pending){if(e)return await this.unload(),void(this.isInstalledInDotRoot&&me("TODO: remove plugin local files from user home root :)"));try{this._status=be.UNLOADING;const t={unregister:e};try{await(this._caller?.callUserModel((ce,`${oe}#lspmsg#beforeunload#`),t)),this.emit("beforeunload",t)}catch(e){console.error("[beforeunload Error]",e)}await this.dispose(),this.emit("unloaded")}catch(e){me("[plugin unload Error]",e)}finally{this._status=be.UNLOADED}}}async dispose(){for(const e of this._disposes)try{e&&await e()}catch(e){console.error(this.debugTag,"dispose Error",e)}this._disposes=[]}_dispose(e){e&&this._disposes.push(e)}_onHostMounted(e){const t=this._ctx.hostMountedActor;!t||t.settled?e():t?.promise.then(e)}get isInstalledInDotRoot(){const e=this.dotConfigRoot,t=this.localRoot;return e&&t&&t.startsWith(e)}get loaded(){return this._status===be.LOADED}get pending(){return[be.LOADING,be.UNLOADING].includes(this._status)}get status(){return this._status}get settings(){return this.options.settings}get logger(){return this.options.logger}get disabled(){return this.settings?.get("disabled")}get caller(){return this._caller}get id(){return this._id}get shadow(){return"shadow"===this.options.mode}get options(){return this._options}get themeMgr(){return this._themeMgr}get debugTag(){const e=this._options?.name;return`#${this._id} ${e??""}`}get localRoot(){return this._localRoot||this._options.url}get loadErr(){return this._loadErr}get dotConfigRoot(){return h.normalize(this._ctx.options.dotConfigRoot)}get dotSettingsFile(){return this._dotSettingsFile}get dotPluginsRoot(){return h.join(this.dotConfigRoot,ye)}toJSON(){const e={...this.options};return e.id=this.id,e.err=this.loadErr,e.usf=this.dotSettingsFile,e.iir=this.isInstalledInDotRoot,e.lsr=this._resolveResourceFullUrl(""),e}}class Ae extends(i()){_options;_isRegistering=!1;_readyIndicator;_hostMountedActor=T();_userPreferences={};_registeredThemes=new Map;_registeredPlugins=new Map;constructor(e){super(),this._options=e}async loadUserPreferences(){try{const e=await E("load_user_preferences");e&&Object.assign(this._userPreferences,e)}catch(e){me("[load user preferences Error]",e)}}async saveUserPreferences(e){try{e&&Object.assign(this._userPreferences,e),await E("save_user_preferences",this._userPreferences)}catch(e){me("[save user preferences Error]",e)}}async activateUserPreferences(){const{theme:e}=this._userPreferences;e&&await this.selectTheme(e,!1)}async register(e,t=!1){if(!Array.isArray(e))return void await this.register([e]);const n=new Map,r=()=>{const e=Array.from(n.values()).reduce(((e,t)=>{const{options:n,status:r,disabled:i}=t.o;return e[t.o.id]={name:n.name,entry:n.entry,status:r,enabled:"boolean"==typeof i?i?"⚫️":"🟢":"🔴",perf:t.e?`${(t.e-t.s).toFixed(2)}ms`:t.o.loadErr},e}),{});console.table(e)};window.__debugPluginsPerfInfo=r;try{this._isRegistering=!0,this._options.dotConfigRoot;const i=this._readyIndicator=T();await this.loadUserPreferences();const o=new Set(this._userPreferences.externals||[]);t&&(e=e.concat([...o].filter((t=>!e.length||e.every((e=>!e.entry&&e.url!==t)))).map((e=>({url:e})))));for(const t of e){const{url:e}=t,r=new Se(t,this,this),s={o:r,s:performance.now(),e:0};n.set(r.id,s),await r.load(i);const{loadErr:a}=r;a&&(me("[Failed LOAD Plugin] #",t),this.emit("error",a),a instanceof Ce||a instanceof xe)||(s.e=performance.now(),r.settings?.on("change",(e=>{this.emit("settings-changed",r.id,e),r.caller?.callUserModel(le,{payload:e})})),this._registeredPlugins.set(r.id,r),this.emit("registered",r),r.isInstalledInDotRoot||o.add(e))}await this.saveUserPreferences({externals:Array.from(o)}),await this.activateUserPreferences(),i.resolve("ready")}catch(e){console.error(e)}finally{this._isRegistering=!1,r()}}async reload(e){if(Array.isArray(e))for(const t of e){const e=this.ensurePlugin(t);await e.reload()}else await this.reload([e])}async unregister(e){if(!Array.isArray(e))return void await this.unregister([e]);const t=[];for(const n of e){const e=this.ensurePlugin(n);e.isInstalledInDotRoot||t.push(e.options.url),await e.unload(!0),this._registeredPlugins.delete(n),this.emit("unregistered",n)}let n=this._userPreferences.externals||[];n.length&&t.length&&await this.saveUserPreferences({externals:n.filter((e=>!t.includes(e)))})}async enable(e){const t=this.ensurePlugin(e);t.pending||(this.emit("beforeenable"),t.settings?.set("disabled",!1),this.emit("enabled",t.id))}async disable(e){const t=this.ensurePlugin(e);t.pending||(this.emit("beforedisable"),t.settings?.set("disabled",!0),this.emit("disabled",t.id))}async _hook(e,t,n,r){for(const[i,o]of this._registeredPlugins)r&&r!==o.id||o.caller?.callUserModel(se,{ns:e,type:u(t),payload:n})}hookApp(e,t,n){this._hook("hook:app",e,t,n)}hookEditor(e,t,n){this._hook("hook:editor",e,t,n)}_execDirective(e,...t){}ensurePlugin(e){if(e instanceof Se)return e;const t=this._registeredPlugins.get(e);if(!t)throw new Error(`plugin #${e} not existed.`);return t}hostMounted(){this._hostMountedActor.resolve()}get registeredPlugins(){return this._registeredPlugins}get options(){return this._options}get readyIndicator(){return this._readyIndicator}get hostMountedActor(){return this._hostMountedActor}get isRegistering(){return this._isRegistering}get themes(){return this._registeredThemes}async registerTheme(e,t){if(me("registered Theme #",e,t),!e)return;let n=this._registeredThemes.get(e);n||this._registeredThemes.set(e,n=[]),n.push(t),this.emit("theme-changed",this.themes,{id:e,...t})}async selectTheme(e,t=!0){M(e?.url),this.emit("theme-selected",e),t&&this.saveUserPreferences({theme:e})}async unregisterTheme(e){me("unregistered Theme #",e),this._registeredThemes.has(e)&&(this._registeredThemes.delete(e),this.emit("theme-changed",this.themes,{id:e}))}}function Oe(e){const t=new Ae(e);me("=== 🔗 Setup Logseq Plugin System 🔗 ==="),window.LSPluginCore=t}})(),r})()}));
  3. //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUttL0Isa0JBQWtCeEcsT0FBT3ZNLEdBQzlCcHNCLEtBQUs0WixLQUFLLGdCQUFpQjVaLEtBQUs0OEIsT0FBUSxDQUFFeFEsR0FBQUEsTUFHbEQsU0FBU2tWLEdBQWdCam1CLEdBQ3JCLE1BQU1rbUIsRUFBYSxJQUFJekMsR0FBYXpqQixHQUNwQyxHQUFNLDRDQUNON1osT0FBT3M5QixhQUFleUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvZGlzdC9wdXJpZnkuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvZXZlbnRlbWl0dGVyMy9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3BhdGgvcGF0aC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9sb3dlci1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL25vLWNhc2UvZGlzdC5lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvc25ha2UtY2FzZS9kaXN0LmVzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kb3QtY2FzZS9kaXN0LmVzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9oZWxwZXJzLnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL3Bvc3RtYXRlL2luZGV4LnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL21vZHVsZXMvTFNQbHVnaW4uU3RvcmFnZS50cyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9MU1BsdWdpbi51c2VyLnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLnNoYWRvdy50cyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9MU1BsdWdpbi5jYWxsZXIudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvTFNQbHVnaW4uY29yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJMU1BsdWdpblwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJMU1BsdWdpblwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyohIEBsaWNlbnNlIERPTVB1cmlmeSAyLjMuMSB8IChjKSBDdXJlNTMgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IFJlbGVhc2VkIHVuZGVyIHRoZSBBcGFjaGUgbGljZW5zZSAyLjAgYW5kIE1vemlsbGEgUHVibGljIExpY2Vuc2UgMi4wIHwgZ2l0aHViLmNvbS9jdXJlNTMvRE9NUHVyaWZ5L2Jsb2IvMi4zLjEvTElDRU5TRSAqL1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkRPTVB1cmlmeSA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIHNldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mLFxuICAgICAgaXNGcm96ZW4gPSBPYmplY3QuaXNGcm96ZW4sXG4gICAgICBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gIHZhciBmcmVlemUgPSBPYmplY3QuZnJlZXplLFxuICAgICAgc2VhbCA9IE9iamVjdC5zZWFsLFxuICAgICAgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tbXV0YWJsZS1leHBvcnRzXG5cbiAgdmFyIF9yZWYgPSB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCcgJiYgUmVmbGVjdCxcbiAgICAgIGFwcGx5ID0gX3JlZi5hcHBseSxcbiAgICAgIGNvbnN0cnVjdCA9IF9yZWYuY29uc3RydWN0O1xuXG4gIGlmICghYXBwbHkpIHtcbiAgICBhcHBseSA9IGZ1bmN0aW9uIGFwcGx5KGZ1biwgdGhpc1ZhbHVlLCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuLmFwcGx5KHRoaXNWYWx1ZSwgYXJncyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmICghZnJlZXplKSB7XG4gICAgZnJlZXplID0gZnVuY3Rpb24gZnJlZXplKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH1cblxuICBpZiAoIXNlYWwpIHtcbiAgICBzZWFsID0gZnVuY3Rpb24gc2VhbCh4KSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFjb25zdHJ1Y3QpIHtcbiAgICBjb25zdHJ1Y3QgPSBmdW5jdGlvbiBjb25zdHJ1Y3QoRnVuYywgYXJncykge1xuICAgICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoRnVuYywgW251bGxdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoYXJncykpKSkoKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGFycmF5Rm9yRWFjaCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLmZvckVhY2gpO1xuICB2YXIgYXJyYXlQb3AgPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wb3ApO1xuICB2YXIgYXJyYXlQdXNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUucHVzaCk7XG5cbiAgdmFyIHN0cmluZ1RvTG93ZXJDYXNlID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlKTtcbiAgdmFyIHN0cmluZ01hdGNoID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLm1hdGNoKTtcbiAgdmFyIHN0cmluZ1JlcGxhY2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG4gIHZhciBzdHJpbmdJbmRleE9mID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLmluZGV4T2YpO1xuICB2YXIgc3RyaW5nVHJpbSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50cmltKTtcblxuICB2YXIgcmVnRXhwVGVzdCA9IHVuYXBwbHkoUmVnRXhwLnByb3RvdHlwZS50ZXN0KTtcblxuICB2YXIgdHlwZUVycm9yQ3JlYXRlID0gdW5jb25zdHJ1Y3QoVHlwZUVycm9yKTtcblxuICBmdW5jdGlvbiB1bmFwcGx5KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRoaXNBcmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB1bmNvbnN0cnVjdChmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnN0cnVjdChmdW5jLCBhcmdzKTtcbiAgICB9O1xuICB9XG5cbiAgLyogQWRkIHByb3BlcnRpZXMgdG8gYSBsb29rdXAgdGFibGUgKi9cbiAgZnVuY3Rpb24gYWRkVG9TZXQoc2V0LCBhcnJheSkge1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgLy8gTWFrZSAnaW4nIGFuZCB0cnV0aHkgY2hlY2tzIGxpa2UgQm9vbGVhbihzZXQuY29uc3RydWN0b3IpXG4gICAgICAvLyBpbmRlcGVuZGVudCBvZiBhbnkgcHJvcGVydGllcyBkZWZpbmVkIG9uIE9iamVjdC5wcm90b3R5cGUuXG4gICAgICAvLyBQcmV2ZW50IHByb3RvdHlwZSBzZXR0ZXJzIGZyb20gaW50ZXJjZXB0aW5nIHNldCBhcyBhIHRoaXMgdmFsdWUuXG4gICAgICBzZXRQcm90b3R5cGVPZihzZXQsIG51bGwpO1xuICAgIH1cblxuICAgIHZhciBsID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChsLS0pIHtcbiAgICAgIHZhciBlbGVtZW50ID0gYXJyYXlbbF07XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBsY0VsZW1lbnQgPSBzdHJpbmdUb0xvd2VyQ2FzZShlbGVtZW50KTtcbiAgICAgICAgaWYgKGxjRWxlbWVudCAhPT0gZWxlbWVudCkge1xuICAgICAgICAgIC8vIENvbmZpZyBwcmVzZXRzIChlLmcuIHRhZ3MuanMsIGF0dHJzLmpzKSBhcmUgaW1tdXRhYmxlLlxuICAgICAgICAgIGlmICghaXNGcm96ZW4oYXJyYXkpKSB7XG4gICAgICAgICAgICBhcnJheVtsXSA9IGxjRWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbGVtZW50ID0gbGNFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldFtlbGVtZW50XSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIC8qIFNoYWxsb3cgY2xvbmUgYW4gb2JqZWN0ICovXG4gIGZ1bmN0aW9uIGNsb25lKG9iamVjdCkge1xuICAgIHZhciBuZXdPYmplY3QgPSBjcmVhdGUobnVsbCk7XG5cbiAgICB2YXIgcHJvcGVydHkgPSB2b2lkIDA7XG4gICAgZm9yIChwcm9wZXJ0eSBpbiBvYmplY3QpIHtcbiAgICAgIGlmIChhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBbcHJvcGVydHldKSkge1xuICAgICAgICBuZXdPYmplY3RbcHJvcGVydHldID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3T2JqZWN0O1xuICB9XG5cbiAgLyogSUUxMCBkb2Vzbid0IHN1cHBvcnQgX19sb29rdXBHZXR0ZXJfXyBzbyBsZXRzJ1xuICAgKiBzaW11bGF0ZSBpdC4gSXQgYWxzbyBhdXRvbWF0aWNhbGx5IGNoZWNrc1xuICAgKiBpZiB0aGUgcHJvcCBpcyBmdW5jdGlvbiBvciBnZXR0ZXIgYW5kIGJlaGF2ZXNcbiAgICogYWNjb3JkaW5nbHkuICovXG4gIGZ1bmN0aW9uIGxvb2t1cEdldHRlcihvYmplY3QsIHByb3ApIHtcbiAgICB3aGlsZSAob2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3ApO1xuICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy5nZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHVuYXBwbHkoZGVzYy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmYWxsYmFja1ZhbHVlKGVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybignZmFsbGJhY2sgdmFsdWUgZm9yJywgZWxlbWVudCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxuXG4gIHZhciBodG1sID0gZnJlZXplKFsnYScsICdhYmJyJywgJ2Fjcm9ueW0nLCAnYWRkcmVzcycsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYXVkaW8nLCAnYicsICdiZGknLCAnYmRvJywgJ2JpZycsICdibGluaycsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhbnZhcycsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjaXRlJywgJ2NvZGUnLCAnY29sJywgJ2NvbGdyb3VwJywgJ2NvbnRlbnQnLCAnZGF0YScsICdkYXRhbGlzdCcsICdkZCcsICdkZWNvcmF0b3InLCAnZGVsJywgJ2RldGFpbHMnLCAnZGZuJywgJ2RpYWxvZycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VsZW1lbnQnLCAnZW0nLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9udCcsICdmb290ZXInLCAnZm9ybScsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpJywgJ2ltZycsICdpbnB1dCcsICdpbnMnLCAna2JkJywgJ2xhYmVsJywgJ2xlZ2VuZCcsICdsaScsICdtYWluJywgJ21hcCcsICdtYXJrJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRlcicsICduYXYnLCAnbm9icicsICdvbCcsICdvcHRncm91cCcsICdvcHRpb24nLCAnb3V0cHV0JywgJ3AnLCAncGljdHVyZScsICdwcmUnLCAncHJvZ3Jlc3MnLCAncScsICdycCcsICdydCcsICdydWJ5JywgJ3MnLCAnc2FtcCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzaGFkb3cnLCAnc21hbGwnLCAnc291cmNlJywgJ3NwYWNlcicsICdzcGFuJywgJ3N0cmlrZScsICdzdHJvbmcnLCAnc3R5bGUnLCAnc3ViJywgJ3N1bW1hcnknLCAnc3VwJywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpbWUnLCAndHInLCAndHJhY2snLCAndHQnLCAndScsICd1bCcsICd2YXInLCAndmlkZW8nLCAnd2JyJ10pO1xuXG4gIC8vIFNWR1xuICB2YXIgc3ZnID0gZnJlZXplKFsnc3ZnJywgJ2EnLCAnYWx0Z2x5cGgnLCAnYWx0Z2x5cGhkZWYnLCAnYWx0Z2x5cGhpdGVtJywgJ2FuaW1hdGVjb2xvcicsICdhbmltYXRlbW90aW9uJywgJ2FuaW1hdGV0cmFuc2Zvcm0nLCAnY2lyY2xlJywgJ2NsaXBwYXRoJywgJ2RlZnMnLCAnZGVzYycsICdlbGxpcHNlJywgJ2ZpbHRlcicsICdmb250JywgJ2cnLCAnZ2x5cGgnLCAnZ2x5cGhyZWYnLCAnaGtlcm4nLCAnaW1hZ2UnLCAnbGluZScsICdsaW5lYXJncmFkaWVudCcsICdtYXJrZXInLCAnbWFzaycsICdtZXRhZGF0YScsICdtcGF0aCcsICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxncmFkaWVudCcsICdyZWN0JywgJ3N0b3AnLCAnc3R5bGUnLCAnc3dpdGNoJywgJ3N5bWJvbCcsICd0ZXh0JywgJ3RleHRwYXRoJywgJ3RpdGxlJywgJ3RyZWYnLCAndHNwYW4nLCAndmlldycsICd2a2VybiddKTtcblxuICB2YXIgc3ZnRmlsdGVycyA9IGZyZWV6ZShbJ2ZlQmxlbmQnLCAnZmVDb2xvck1hdHJpeCcsICdmZUNvbXBvbmVudFRyYW5zZmVyJywgJ2ZlQ29tcG9zaXRlJywgJ2ZlQ29udm9sdmVNYXRyaXgnLCAnZmVEaWZmdXNlTGlnaHRpbmcnLCAnZmVEaXNwbGFjZW1lbnRNYXAnLCAnZmVEaXN0YW50TGlnaHQnLCAnZmVGbG9vZCcsICdmZUZ1bmNBJywgJ2ZlRnVuY0InLCAnZmVGdW5jRycsICdmZUZ1bmNSJywgJ2ZlR2F1c3NpYW5CbHVyJywgJ2ZlTWVyZ2UnLCAnZmVNZXJnZU5vZGUnLCAnZmVNb3JwaG9sb2d5JywgJ2ZlT2Zmc2V0JywgJ2ZlUG9pbnRMaWdodCcsICdmZVNwZWN1bGFyTGlnaHRpbmcnLCAnZmVTcG90TGlnaHQnLCAnZmVUaWxlJywgJ2ZlVHVyYnVsZW5jZSddKTtcblxuICAvLyBMaXN0IG9mIFNWRyBlbGVtZW50cyB0aGF0IGFyZSBkaXNhbGxvd2VkIGJ5IGRlZmF1bHQuXG4gIC8vIFdlIHN0aWxsIG5lZWQgdG8ga25vdyB0aGVtIHNvIHRoYXQgd2UgY2FuIGRvIG5hbWVzcGFjZVxuICAvLyBjaGVja3MgcHJvcGVybHkgaW4gY2FzZSBvbmUgd2FudHMgdG8gYWRkIHRoZW0gdG9cbiAgLy8gYWxsb3ctbGlzdC5cbiAgdmFyIHN2Z0Rpc2FsbG93ZWQgPSBmcmVlemUoWydhbmltYXRlJywgJ2NvbG9yLXByb2ZpbGUnLCAnY3Vyc29yJywgJ2Rpc2NhcmQnLCAnZmVkcm9wc2hhZG93JywgJ2ZlaW1hZ2UnLCAnZm9udC1mYWNlJywgJ2ZvbnQtZmFjZS1mb3JtYXQnLCAnZm9udC1mYWNlLW5hbWUnLCAnZm9udC1mYWNlLXNyYycsICdmb250LWZhY2UtdXJpJywgJ2ZvcmVpZ25vYmplY3QnLCAnaGF0Y2gnLCAnaGF0Y2hwYXRoJywgJ21lc2gnLCAnbWVzaGdyYWRpZW50JywgJ21lc2hwYXRjaCcsICdtZXNocm93JywgJ21pc3NpbmctZ2x5cGgnLCAnc2NyaXB0JywgJ3NldCcsICdzb2xpZGNvbG9yJywgJ3Vua25vd24nLCAndXNlJ10pO1xuXG4gIHZhciBtYXRoTWwgPSBmcmVlemUoWydtYXRoJywgJ21lbmNsb3NlJywgJ21lcnJvcicsICdtZmVuY2VkJywgJ21mcmFjJywgJ21nbHlwaCcsICdtaScsICdtbGFiZWxlZHRyJywgJ21tdWx0aXNjcmlwdHMnLCAnbW4nLCAnbW8nLCAnbW92ZXInLCAnbXBhZGRlZCcsICdtcGhhbnRvbScsICdtcm9vdCcsICdtcm93JywgJ21zJywgJ21zcGFjZScsICdtc3FydCcsICdtc3R5bGUnLCAnbXN1YicsICdtc3VwJywgJ21zdWJzdXAnLCAnbXRhYmxlJywgJ210ZCcsICdtdGV4dCcsICdtdHInLCAnbXVuZGVyJywgJ211bmRlcm92ZXInXSk7XG5cbiAgLy8gU2ltaWxhcmx5IHRvIFNWRywgd2Ugd2FudCB0byBrbm93IGFsbCBNYXRoTUwgZWxlbWVudHMsXG4gIC8vIGV2ZW4gdGhvc2UgdGhhdCB3ZSBkaXNhbGxvdyBieSBkZWZhdWx0LlxuICB2YXIgbWF0aE1sRGlzYWxsb3dlZCA9IGZyZWV6ZShbJ21hY3Rpb24nLCAnbWFsaWduZ3JvdXAnLCAnbWFsaWdubWFyaycsICdtbG9uZ2RpdicsICdtc2NhcnJpZXMnLCAnbXNjYXJyeScsICdtc2dyb3VwJywgJ21zdGFjaycsICdtc2xpbmUnLCAnbXNyb3cnLCAnc2VtYW50aWNzJywgJ2Fubm90YXRpb24nLCAnYW5ub3RhdGlvbi14bWwnLCAnbXByZXNjcmlwdHMnLCAnbm9uZSddKTtcblxuICB2YXIgdGV4dCA9IGZyZWV6ZShbJyN0ZXh0J10pO1xuXG4gIHZhciBodG1sJDEgPSBmcmVlemUoWydhY2NlcHQnLCAnYWN0aW9uJywgJ2FsaWduJywgJ2FsdCcsICdhdXRvY2FwaXRhbGl6ZScsICdhdXRvY29tcGxldGUnLCAnYXV0b3BpY3R1cmVpbnBpY3R1cmUnLCAnYXV0b3BsYXknLCAnYmFja2dyb3VuZCcsICdiZ2NvbG9yJywgJ2JvcmRlcicsICdjYXB0dXJlJywgJ2NlbGxwYWRkaW5nJywgJ2NlbGxzcGFjaW5nJywgJ2NoZWNrZWQnLCAnY2l0ZScsICdjbGFzcycsICdjbGVhcicsICdjb2xvcicsICdjb2xzJywgJ2NvbHNwYW4nLCAnY29udHJvbHMnLCAnY29udHJvbHNsaXN0JywgJ2Nvb3JkcycsICdjcm9zc29yaWdpbicsICdkYXRldGltZScsICdkZWNvZGluZycsICdkZWZhdWx0JywgJ2RpcicsICdkaXNhYmxlZCcsICdkaXNhYmxlcGljdHVyZWlucGljdHVyZScsICdkaXNhYmxlcmVtb3RlcGxheWJhY2snLCAnZG93bmxvYWQnLCAnZHJhZ2dhYmxlJywgJ2VuY3R5cGUnLCAnZW50ZXJrZXloaW50JywgJ2ZhY2UnLCAnZm9yJywgJ2hlYWRlcnMnLCAnaGVpZ2h0JywgJ2hpZGRlbicsICdoaWdoJywgJ2hyZWYnLCAnaHJlZmxhbmcnLCAnaWQnLCAnaW5wdXRtb2RlJywgJ2ludGVncml0eScsICdpc21hcCcsICdraW5kJywgJ2xhYmVsJywgJ2xhbmcnLCAnbGlzdCcsICdsb2FkaW5nJywgJ2xvb3AnLCAnbG93JywgJ21heCcsICdtYXhsZW5ndGgnLCAnbWVkaWEnLCAnbWV0aG9kJywgJ21pbicsICdtaW5sZW5ndGgnLCAnbXVsdGlwbGUnLCAnbXV0ZWQnLCAnbmFtZScsICdub3NoYWRlJywgJ25vdmFsaWRhdGUnLCAnbm93cmFwJywgJ29wZW4nLCAnb3B0aW11bScsICdwYXR0ZXJuJywgJ3BsYWNlaG9sZGVyJywgJ3BsYXlzaW5saW5lJywgJ3Bvc3RlcicsICdwcmVsb2FkJywgJ3B1YmRhdGUnLCAncmFkaW9ncm91cCcsICdyZWFkb25seScsICdyZWwnLCAncmVxdWlyZWQnLCAncmV2JywgJ3JldmVyc2VkJywgJ3JvbGUnLCAncm93cycsICdyb3dzcGFuJywgJ3NwZWxsY2hlY2snLCAnc2NvcGUnLCAnc2VsZWN0ZWQnLCAnc2hhcGUnLCAnc2l6ZScsICdzaXplcycsICdzcGFuJywgJ3NyY2xhbmcnLCAnc3RhcnQnLCAnc3JjJywgJ3NyY3NldCcsICdzdGVwJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFiaW5kZXgnLCAndGl0bGUnLCAndHJhbnNsYXRlJywgJ3R5cGUnLCAndXNlbWFwJywgJ3ZhbGlnbicsICd2YWx1ZScsICd3aWR0aCcsICd4bWxucycsICdzbG90J10pO1xuXG4gIHZhciBzdmckMSA9IGZyZWV6ZShbJ2FjY2VudC1oZWlnaHQnLCAnYWNjdW11bGF0ZScsICdhZGRpdGl2ZScsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYXNjZW50JywgJ2F0dHJpYnV0ZW5hbWUnLCAnYXR0cmlidXRldHlwZScsICdhemltdXRoJywgJ2Jhc2VmcmVxdWVuY3knLCAnYmFzZWxpbmUtc2hpZnQnLCAnYmVnaW4nLCAnYmlhcycsICdieScsICdjbGFzcycsICdjbGlwJywgJ2NsaXBwYXRodW5pdHMnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvcicsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdjeCcsICdjeScsICdkJywgJ2R4JywgJ2R5JywgJ2RpZmZ1c2Vjb25zdGFudCcsICdkaXJlY3Rpb24nLCAnZGlzcGxheScsICdkaXZpc29yJywgJ2R1cicsICdlZGdlbW9kZScsICdlbGV2YXRpb24nLCAnZW5kJywgJ2ZpbGwnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmaWx0ZXInLCAnZmlsdGVydW5pdHMnLCAnZmxvb2QtY29sb3InLCAnZmxvb2Qtb3BhY2l0eScsICdmb250LWZhbWlseScsICdmb250LXNpemUnLCAnZm9udC1zaXplLWFkanVzdCcsICdmb250LXN0cmV0Y2gnLCAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnZngnLCAnZnknLCAnZzEnLCAnZzInLCAnZ2x5cGgtbmFtZScsICdnbHlwaHJlZicsICdncmFkaWVudHVuaXRzJywgJ2dyYWRpZW50dHJhbnNmb3JtJywgJ2hlaWdodCcsICdocmVmJywgJ2lkJywgJ2ltYWdlLXJlbmRlcmluZycsICdpbicsICdpbjInLCAnaycsICdrMScsICdrMicsICdrMycsICdrNCcsICdrZXJuaW5nJywgJ2tleXBvaW50cycsICdrZXlzcGxpbmVzJywgJ2tleXRpbWVzJywgJ2xhbmcnLCAnbGVuZ3RoYWRqdXN0JywgJ2xldHRlci1zcGFjaW5nJywgJ2tlcm5lbG1hdHJpeCcsICdrZXJuZWx1bml0bGVuZ3RoJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ2xvY2FsJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnbWFya2VyaGVpZ2h0JywgJ21hcmtlcnVuaXRzJywgJ21hcmtlcndpZHRoJywgJ21hc2tjb250ZW50dW5pdHMnLCAnbWFza3VuaXRzJywgJ21heCcsICdtYXNrJywgJ21lZGlhJywgJ21ldGhvZCcsICdtb2RlJywgJ21pbicsICduYW1lJywgJ251bW9jdGF2ZXMnLCAnb2Zmc2V0JywgJ29wZXJhdG9yJywgJ29wYWNpdHknLCAnb3JkZXInLCAnb3JpZW50JywgJ29yaWVudGF0aW9uJywgJ29yaWdpbicsICdvdmVyZmxvdycsICdwYWludC1vcmRlcicsICdwYXRoJywgJ3BhdGhsZW5ndGgnLCAncGF0dGVybmNvbnRlbnR1bml0cycsICdwYXR0ZXJudHJhbnNmb3JtJywgJ3BhdHRlcm51bml0cycsICdwb2ludHMnLCAncHJlc2VydmVhbHBoYScsICdwcmVzZXJ2ZWFzcGVjdHJhdGlvJywgJ3ByaW1pdGl2ZXVuaXRzJywgJ3InLCAncngnLCAncnknLCAncmFkaXVzJywgJ3JlZngnLCAncmVmeScsICdyZXBlYXRjb3VudCcsICdyZXBlYXRkdXInLCAncmVzdGFydCcsICdyZXN1bHQnLCAncm90YXRlJywgJ3NjYWxlJywgJ3NlZWQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3NwZWN1bGFyY29uc3RhbnQnLCAnc3BlY3VsYXJleHBvbmVudCcsICdzcHJlYWRtZXRob2QnLCAnc3RhcnRvZmZzZXQnLCAnc3RkZGV2aWF0aW9uJywgJ3N0aXRjaHRpbGVzJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cm9rZS1kYXNoYXJyYXknLCAnc3Ryb2tlLWRhc2hvZmZzZXQnLCAnc3Ryb2tlLWxpbmVjYXAnLCAnc3Ryb2tlLWxpbmVqb2luJywgJ3N0cm9rZS1taXRlcmxpbWl0JywgJ3N0cm9rZS1vcGFjaXR5JywgJ3N0cm9rZScsICdzdHJva2Utd2lkdGgnLCAnc3R5bGUnLCAnc3VyZmFjZXNjYWxlJywgJ3N5c3RlbWxhbmd1YWdlJywgJ3RhYmluZGV4JywgJ3RhcmdldHgnLCAndGFyZ2V0eScsICd0cmFuc2Zvcm0nLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3RleHRsZW5ndGgnLCAndHlwZScsICd1MScsICd1MicsICd1bmljb2RlJywgJ3ZhbHVlcycsICd2aWV3Ym94JywgJ3Zpc2liaWxpdHknLCAndmVyc2lvbicsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3aWR0aCcsICd3b3JkLXNwYWNpbmcnLCAnd3JhcCcsICd3cml0aW5nLW1vZGUnLCAneGNoYW5uZWxzZWxlY3RvcicsICd5Y2hhbm5lbHNlbGVjdG9yJywgJ3gnLCAneDEnLCAneDInLCAneG1sbnMnLCAneScsICd5MScsICd5MicsICd6JywgJ3pvb21hbmRwYW4nXSk7XG5cbiAgdmFyIG1hdGhNbCQxID0gZnJlZXplKFsnYWNjZW50JywgJ2FjY2VudHVuZGVyJywgJ2FsaWduJywgJ2JldmVsbGVkJywgJ2Nsb3NlJywgJ2NvbHVtbnNhbGlnbicsICdjb2x1bW5saW5lcycsICdjb2x1bW5zcGFuJywgJ2Rlbm9tYWxpZ24nLCAnZGVwdGgnLCAnZGlyJywgJ2Rpc3BsYXknLCAnZGlzcGxheXN0eWxlJywgJ2VuY29kaW5nJywgJ2ZlbmNlJywgJ2ZyYW1lJywgJ2hlaWdodCcsICdocmVmJywgJ2lkJywgJ2xhcmdlb3AnLCAnbGVuZ3RoJywgJ2xpbmV0aGlja25lc3MnLCAnbHNwYWNlJywgJ2xxdW90ZScsICdtYXRoYmFja2dyb3VuZCcsICdtYXRoY29sb3InLCAnbWF0aHNpemUnLCAnbWF0aHZhcmlhbnQnLCAnbWF4c2l6ZScsICdtaW5zaXplJywgJ21vdmFibGVsaW1pdHMnLCAnbm90YXRpb24nLCAnbnVtYWxpZ24nLCAnb3BlbicsICdyb3dhbGlnbicsICdyb3dsaW5lcycsICdyb3dzcGFjaW5nJywgJ3Jvd3NwYW4nLCAncnNwYWNlJywgJ3JxdW90ZScsICdzY3JpcHRsZXZlbCcsICdzY3JpcHRtaW5zaXplJywgJ3NjcmlwdHNpemVtdWx0aXBsaWVyJywgJ3NlbGVjdGlvbicsICdzZXBhcmF0b3InLCAnc2VwYXJhdG9ycycsICdzdHJldGNoeScsICdzdWJzY3JpcHRzaGlmdCcsICdzdXBzY3JpcHRzaGlmdCcsICdzeW1tZXRyaWMnLCAndm9mZnNldCcsICd3aWR0aCcsICd4bWxucyddKTtcblxuICB2YXIgeG1sID0gZnJlZXplKFsneGxpbms6aHJlZicsICd4bWw6aWQnLCAneGxpbms6dGl0bGUnLCAneG1sOnNwYWNlJywgJ3htbG5zOnhsaW5rJ10pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2JldHRlci1yZWdleFxuICB2YXIgTVVTVEFDSEVfRVhQUiA9IHNlYWwoL1xce1xce1tcXHNcXFNdKnxbXFxzXFxTXSpcXH1cXH0vZ20pOyAvLyBTcGVjaWZ5IHRlbXBsYXRlIGRldGVjdGlvbiByZWdleCBmb3IgU0FGRV9GT1JfVEVNUExBVEVTIG1vZGVcbiAgdmFyIEVSQl9FWFBSID0gc2VhbCgvPCVbXFxzXFxTXSp8W1xcc1xcU10qJT4vZ20pO1xuICB2YXIgREFUQV9BVFRSID0gc2VhbCgvXmRhdGEtW1xcLVxcdy5cXHUwMEI3LVxcdUZGRkZdLyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgdmFyIEFSSUFfQVRUUiA9IHNlYWwoL15hcmlhLVtcXC1cXHddKyQvKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgSVNfQUxMT1dFRF9VUkkgPSBzZWFsKC9eKD86KD86KD86ZnxodCl0cHM/fG1haWx0b3x0ZWx8Y2FsbHRvfGNpZHx4bXBwKTp8W15hLXpdfFthLXorLlxcLV0rKD86W15hLXorLlxcLTpdfCQpKS9pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgKTtcbiAgdmFyIElTX1NDUklQVF9PUl9EQVRBID0gc2VhbCgvXig/OlxcdytzY3JpcHR8ZGF0YSk6L2kpO1xuICB2YXIgQVRUUl9XSElURVNQQUNFID0gc2VhbCgvW1xcdTAwMDAtXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MTgwRVxcdTIwMDAtXFx1MjAyOVxcdTIwNUZcXHUzMDAwXS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuICApO1xuXG4gIHZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkkMShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG4gIHZhciBnZXRHbG9iYWwgPSBmdW5jdGlvbiBnZXRHbG9iYWwoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHdpbmRvdztcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5vLW9wIHBvbGljeSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAqIERvbid0IGV4cG9ydCB0aGlzIGZ1bmN0aW9uIG91dHNpZGUgdGhpcyBtb2R1bGUhXG4gICAqIEBwYXJhbSB7P1RydXN0ZWRUeXBlUG9saWN5RmFjdG9yeX0gdHJ1c3RlZFR5cGVzIFRoZSBwb2xpY3kgZmFjdG9yeS5cbiAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jdW1lbnQgVGhlIGRvY3VtZW50IG9iamVjdCAodG8gZGV0ZXJtaW5lIHBvbGljeSBuYW1lIHN1ZmZpeClcbiAgICogQHJldHVybiB7P1RydXN0ZWRUeXBlUG9saWN5fSBUaGUgcG9saWN5IGNyZWF0ZWQgKG9yIG51bGwsIGlmIFRydXN0ZWQgVHlwZXNcbiAgICogYXJlIG5vdCBzdXBwb3J0ZWQpLlxuICAgKi9cbiAgdmFyIF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kgPSBmdW5jdGlvbiBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KHRydXN0ZWRUeXBlcywgZG9jdW1lbnQpIHtcbiAgICBpZiAoKHR5cGVvZiB0cnVzdGVkVHlwZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHRydXN0ZWRUeXBlcykpICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgdGhlIGNhbGxlcnMgdG8gY29udHJvbCB0aGUgdW5pcXVlIHBvbGljeSBuYW1lXG4gICAgLy8gYnkgYWRkaW5nIGEgZGF0YS10dC1wb2xpY3ktc3VmZml4IHRvIHRoZSBzY3JpcHQgZWxlbWVudCB3aXRoIHRoZSBET01QdXJpZnkuXG4gICAgLy8gUG9saWN5IGNyZWF0aW9uIHdpdGggZHVwbGljYXRlIG5hbWVzIHRocm93cyBpbiBUcnVzdGVkIFR5cGVzLlxuICAgIHZhciBzdWZmaXggPSBudWxsO1xuICAgIHZhciBBVFRSX05BTUUgPSAnZGF0YS10dC1wb2xpY3ktc3VmZml4JztcbiAgICBpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0Lmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKSB7XG4gICAgICBzdWZmaXggPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LmdldEF0dHJpYnV0ZShBVFRSX05BTUUpO1xuICAgIH1cblxuICAgIHZhciBwb2xpY3lOYW1lID0gJ2RvbXB1cmlmeScgKyAoc3VmZml4ID8gJyMnICsgc3VmZml4IDogJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KHBvbGljeU5hbWUsIHtcbiAgICAgICAgY3JlYXRlSFRNTDogZnVuY3Rpb24gY3JlYXRlSFRNTChodG1sJCQxKSB7XG4gICAgICAgICAgcmV0dXJuIGh0bWwkJDE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8vIFBvbGljeSBjcmVhdGlvbiBmYWlsZWQgKG1vc3QgbGlrZWx5IGFub3RoZXIgRE9NUHVyaWZ5IHNjcmlwdCBoYXNcbiAgICAgIC8vIGFscmVhZHkgcnVuKS4gU2tpcCBjcmVhdGluZyB0aGUgcG9saWN5LCBhcyB0aGlzIHdpbGwgb25seSBjYXVzZSBlcnJvcnNcbiAgICAgIC8vIGlmIFRUIGFyZSBlbmZvcmNlZC5cbiAgICAgIGNvbnNvbGUud2FybignVHJ1c3RlZFR5cGVzIHBvbGljeSAnICsgcG9saWN5TmFtZSArICcgY291bGQgbm90IGJlIGNyZWF0ZWQuJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gY3JlYXRlRE9NUHVyaWZ5KCkge1xuICAgIHZhciB3aW5kb3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldEdsb2JhbCgpO1xuXG4gICAgdmFyIERPTVB1cmlmeSA9IGZ1bmN0aW9uIERPTVB1cmlmeShyb290KSB7XG4gICAgICByZXR1cm4gY3JlYXRlRE9NUHVyaWZ5KHJvb3QpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIGxhYmVsLCBleHBvc2VkIGZvciBlYXNpZXIgY2hlY2tzXG4gICAgICogaWYgRE9NUHVyaWZ5IGlzIHVwIHRvIGRhdGUgb3Igbm90XG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnZlcnNpb24gPSAnMi4zLjEnO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBET01QdXJpZnkgcmVtb3ZlZCBkdXJpbmcgc2FuaXRhdGlvbi5cbiAgICAgKiBFbXB0eSBpZiBub3RoaW5nIHdhcyByZW1vdmVkLlxuICAgICAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgICBpZiAoIXdpbmRvdyB8fCAhd2luZG93LmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudC5ub2RlVHlwZSAhPT0gOSkge1xuICAgICAgLy8gTm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLCBwcm92aWRlIGEgZmFjdG9yeSBmdW5jdGlvblxuICAgICAgLy8gc28gdGhhdCB5b3UgY2FuIHBhc3MgeW91ciBvd24gV2luZG93XG4gICAgICBET01QdXJpZnkuaXNTdXBwb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgcmV0dXJuIERPTVB1cmlmeTtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2luYWxEb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxuICAgIHZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICB2YXIgRG9jdW1lbnRGcmFnbWVudCA9IHdpbmRvdy5Eb2N1bWVudEZyYWdtZW50LFxuICAgICAgICBIVE1MVGVtcGxhdGVFbGVtZW50ID0gd2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4gICAgICAgIE5vZGUgPSB3aW5kb3cuTm9kZSxcbiAgICAgICAgRWxlbWVudCA9IHdpbmRvdy5FbGVtZW50LFxuICAgICAgICBOb2RlRmlsdGVyID0gd2luZG93Lk5vZGVGaWx0ZXIsXG4gICAgICAgIF93aW5kb3ckTmFtZWROb2RlTWFwID0gd2luZG93Lk5hbWVkTm9kZU1hcCxcbiAgICAgICAgTmFtZWROb2RlTWFwID0gX3dpbmRvdyROYW1lZE5vZGVNYXAgPT09IHVuZGVmaW5lZCA/IHdpbmRvdy5OYW1lZE5vZGVNYXAgfHwgd2luZG93Lk1vek5hbWVkQXR0ck1hcCA6IF93aW5kb3ckTmFtZWROb2RlTWFwLFxuICAgICAgICBUZXh0ID0gd2luZG93LlRleHQsXG4gICAgICAgIENvbW1lbnQgPSB3aW5kb3cuQ29tbWVudCxcbiAgICAgICAgRE9NUGFyc2VyID0gd2luZG93LkRPTVBhcnNlcixcbiAgICAgICAgdHJ1c3RlZFR5cGVzID0gd2luZG93LnRydXN0ZWRUeXBlcztcblxuXG4gICAgdmFyIEVsZW1lbnRQcm90b3R5cGUgPSBFbGVtZW50LnByb3RvdHlwZTtcblxuICAgIHZhciBjbG9uZU5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ2Nsb25lTm9kZScpO1xuICAgIHZhciBnZXROZXh0U2libGluZyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnbmV4dFNpYmxpbmcnKTtcbiAgICB2YXIgZ2V0Q2hpbGROb2RlcyA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2hpbGROb2RlcycpO1xuICAgIHZhciBnZXRQYXJlbnROb2RlID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdwYXJlbnROb2RlJyk7XG5cbiAgICAvLyBBcyBwZXIgaXNzdWUgIzQ3LCB0aGUgd2ViLWNvbXBvbmVudHMgcmVnaXN0cnkgaXMgaW5oZXJpdGVkIGJ5IGFcbiAgICAvLyBuZXcgZG9jdW1lbnQgY3JlYXRlZCB2aWEgY3JlYXRlSFRNTERvY3VtZW50LiBBcyBwZXIgdGhlIHNwZWNcbiAgICAvLyAoaHR0cDovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3JlYXRpbmctYW5kLXBhc3NpbmctcmVnaXN0cmllcylcbiAgICAvLyBhIG5ldyBlbXB0eSByZWdpc3RyeSBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0ZW1wbGF0ZSBjb250ZW50cyBvd25lclxuICAgIC8vIGRvY3VtZW50LCBzbyB3ZSB1c2UgdGhhdCBhcyBvdXIgcGFyZW50IGRvY3VtZW50IHRvIGVuc3VyZSBub3RoaW5nXG4gICAgLy8gaXMgaW5oZXJpdGVkLlxuICAgIGlmICh0eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgIGlmICh0ZW1wbGF0ZS5jb250ZW50ICYmIHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgICBkb2N1bWVudCA9IHRlbXBsYXRlLmNvbnRlbnQub3duZXJEb2N1bWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJ1c3RlZFR5cGVzUG9saWN5ID0gX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSh0cnVzdGVkVHlwZXMsIG9yaWdpbmFsRG9jdW1lbnQpO1xuICAgIHZhciBlbXB0eUhUTUwgPSB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRSA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKCcnKSA6ICcnO1xuXG4gICAgdmFyIF9kb2N1bWVudCA9IGRvY3VtZW50LFxuICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IF9kb2N1bWVudC5pbXBsZW1lbnRhdGlvbixcbiAgICAgICAgY3JlYXRlTm9kZUl0ZXJhdG9yID0gX2RvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcixcbiAgICAgICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCA9IF9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50LFxuICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZSA9IF9kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZTtcbiAgICB2YXIgaW1wb3J0Tm9kZSA9IG9yaWdpbmFsRG9jdW1lbnQuaW1wb3J0Tm9kZTtcblxuXG4gICAgdmFyIGRvY3VtZW50TW9kZSA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudE1vZGUgPSBjbG9uZShkb2N1bWVudCkuZG9jdW1lbnRNb2RlID8gZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDoge307XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIHZhciBob29rcyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogRXhwb3NlIHdoZXRoZXIgdGhpcyBicm93c2VyIHN1cHBvcnRzIHJ1bm5pbmcgdGhlIGZ1bGwgRE9NUHVyaWZ5LlxuICAgICAqL1xuICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IHR5cGVvZiBnZXRQYXJlbnROb2RlID09PSAnZnVuY3Rpb24nICYmIGltcGxlbWVudGF0aW9uICYmIHR5cGVvZiBpbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50TW9kZSAhPT0gOTtcblxuICAgIHZhciBNVVNUQUNIRV9FWFBSJCQxID0gTVVTVEFDSEVfRVhQUixcbiAgICAgICAgRVJCX0VYUFIkJDEgPSBFUkJfRVhQUixcbiAgICAgICAgREFUQV9BVFRSJCQxID0gREFUQV9BVFRSLFxuICAgICAgICBBUklBX0FUVFIkJDEgPSBBUklBX0FUVFIsXG4gICAgICAgIElTX1NDUklQVF9PUl9EQVRBJCQxID0gSVNfU0NSSVBUX09SX0RBVEEsXG4gICAgICAgIEFUVFJfV0hJVEVTUEFDRSQkMSA9IEFUVFJfV0hJVEVTUEFDRTtcbiAgICB2YXIgSVNfQUxMT1dFRF9VUkkkJDEgPSBJU19BTExPV0VEX1VSSTtcblxuICAgIC8qKlxuICAgICAqIFdlIGNvbnNpZGVyIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBiZWxvdyB0byBiZSBzYWZlLiBJZGVhbGx5XG4gICAgICogZG9uJ3QgYWRkIGFueSBuZXcgb25lcyBidXQgZmVlbCBmcmVlIHRvIHJlbW92ZSB1bndhbnRlZCBvbmVzLlxuICAgICAqL1xuXG4gICAgLyogYWxsb3dlZCBlbGVtZW50IG5hbWVzICovXG5cbiAgICB2YXIgQUxMT1dFRF9UQUdTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX1RBR1MgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSQxKGh0bWwpLCBfdG9Db25zdW1hYmxlQXJyYXkkMShzdmcpLCBfdG9Db25zdW1hYmxlQXJyYXkkMShzdmdGaWx0ZXJzKSwgX3RvQ29uc3VtYWJsZUFycmF5JDEobWF0aE1sKSwgX3RvQ29uc3VtYWJsZUFycmF5JDEodGV4dCkpKTtcblxuICAgIC8qIEFsbG93ZWQgYXR0cmlidXRlIG5hbWVzICovXG4gICAgdmFyIEFMTE9XRURfQVRUUiA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfQUxMT1dFRF9BVFRSID0gYWRkVG9TZXQoe30sIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkkMShodG1sJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkkMShzdmckMSksIF90b0NvbnN1bWFibGVBcnJheSQxKG1hdGhNbCQxKSwgX3RvQ29uc3VtYWJsZUFycmF5JDEoeG1sKSkpO1xuXG4gICAgLyogRXhwbGljaXRseSBmb3JiaWRkZW4gdGFncyAob3ZlcnJpZGVzIEFMTE9XRURfVEFHUy9BRERfVEFHUykgKi9cbiAgICB2YXIgRk9SQklEX1RBR1MgPSBudWxsO1xuXG4gICAgLyogRXhwbGljaXRseSBmb3JiaWRkZW4gYXR0cmlidXRlcyAob3ZlcnJpZGVzIEFMTE9XRURfQVRUUi9BRERfQVRUUikgKi9cbiAgICB2YXIgRk9SQklEX0FUVFIgPSBudWxsO1xuXG4gICAgLyogRGVjaWRlIGlmIEFSSUEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICAgIHZhciBBTExPV19BUklBX0FUVFIgPSB0cnVlO1xuXG4gICAgLyogRGVjaWRlIGlmIGN1c3RvbSBkYXRhIGF0dHJpYnV0ZXMgYXJlIG9rYXkgKi9cbiAgICB2YXIgQUxMT1dfREFUQV9BVFRSID0gdHJ1ZTtcblxuICAgIC8qIERlY2lkZSBpZiB1bmtub3duIHByb3RvY29scyBhcmUgb2theSAqL1xuICAgIHZhciBBTExPV19VTktOT1dOX1BST1RPQ09MUyA9IGZhbHNlO1xuXG4gICAgLyogT3V0cHV0IHNob3VsZCBiZSBzYWZlIGZvciBjb21tb24gdGVtcGxhdGUgZW5naW5lcy5cbiAgICAgKiBUaGlzIG1lYW5zLCBET01QdXJpZnkgcmVtb3ZlcyBkYXRhIGF0dHJpYnV0ZXMsIG11c3RhY2hlcyBhbmQgRVJCXG4gICAgICovXG4gICAgdmFyIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGRvY3VtZW50IHdpdGggPGh0bWw+Li4uIHNob3VsZCBiZSByZXR1cm5lZCAqL1xuICAgIHZhciBXSE9MRV9ET0NVTUVOVCA9IGZhbHNlO1xuXG4gICAgLyogVHJhY2sgd2hldGhlciBjb25maWcgaXMgYWxyZWFkeSBzZXQgb24gdGhpcyBpbnN0YW5jZSBvZiBET01QdXJpZnkuICovXG4gICAgdmFyIFNFVF9DT05GSUcgPSBmYWxzZTtcblxuICAgIC8qIERlY2lkZSBpZiBhbGwgZWxlbWVudHMgKGUuZy4gc3R5bGUsIHNjcmlwdCkgbXVzdCBiZSBjaGlsZHJlbiBvZlxuICAgICAqIGRvY3VtZW50LmJvZHkuIEJ5IGRlZmF1bHQsIGJyb3dzZXJzIG1pZ2h0IG1vdmUgdGhlbSB0byBkb2N1bWVudC5oZWFkICovXG4gICAgdmFyIEZPUkNFX0JPRFkgPSBmYWxzZTtcblxuICAgIC8qIERlY2lkZSBpZiBhIERPTSBgSFRNTEJvZHlFbGVtZW50YCBzaG91bGQgYmUgcmV0dXJuZWQsIGluc3RlYWQgb2YgYSBodG1sXG4gICAgICogc3RyaW5nIChvciBhIFRydXN0ZWRIVE1MIG9iamVjdCBpZiBUcnVzdGVkIFR5cGVzIGFyZSBzdXBwb3J0ZWQpLlxuICAgICAqIElmIGBXSE9MRV9ET0NVTUVOVGAgaXMgZW5hYmxlZCBhIGBIVE1MSHRtbEVsZW1lbnRgIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZFxuICAgICAqL1xuICAgIHZhciBSRVRVUk5fRE9NID0gZmFsc2U7XG5cbiAgICAvKiBEZWNpZGUgaWYgYSBET00gYERvY3VtZW50RnJhZ21lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICAgKiBzdHJpbmcgIChvciBhIFRydXN0ZWRIVE1MIG9iamVjdCBpZiBUcnVzdGVkIFR5cGVzIGFyZSBzdXBwb3J0ZWQpICovXG4gICAgdmFyIFJFVFVSTl9ET01fRlJBR01FTlQgPSBmYWxzZTtcblxuICAgIC8qIElmIGBSRVRVUk5fRE9NYCBvciBgUkVUVVJOX0RPTV9GUkFHTUVOVGAgaXMgZW5hYmxlZCwgZGVjaWRlIGlmIHRoZSByZXR1cm5lZCBET01cbiAgICAgKiBgTm9kZWAgaXMgaW1wb3J0ZWQgaW50byB0aGUgY3VycmVudCBgRG9jdW1lbnRgLiBJZiB0aGlzIGZsYWcgaXMgbm90IGVuYWJsZWQgdGhlXG4gICAgICogYE5vZGVgIHdpbGwgYmVsb25nIChpdHMgb3duZXJEb2N1bWVudCkgdG8gYSBmcmVzaCBgSFRNTERvY3VtZW50YCwgY3JlYXRlZCBieVxuICAgICAqIERPTVB1cmlmeS5cbiAgICAgKlxuICAgICAqIFRoaXMgZGVmYXVsdHMgdG8gYHRydWVgIHN0YXJ0aW5nIERPTVB1cmlmeSAyLjIuMC4gTm90ZSB0aGF0IHNldHRpbmcgaXQgdG8gYGZhbHNlYFxuICAgICAqIG1pZ2h0IGNhdXNlIFhTUyBmcm9tIGF0dGFja3MgaGlkZGVuIGluIGNsb3NlZCBzaGFkb3dyb290cyBpbiBjYXNlIHRoZSBicm93c2VyXG4gICAgICogc3VwcG9ydHMgRGVjbGFyYXRpdmUgU2hhZG93OiBET00gaHR0cHM6Ly93ZWIuZGV2L2RlY2xhcmF0aXZlLXNoYWRvdy1kb20vXG4gICAgICovXG4gICAgdmFyIFJFVFVSTl9ET01fSU1QT1JUID0gdHJ1ZTtcblxuICAgIC8qIFRyeSB0byByZXR1cm4gYSBUcnVzdGVkIFR5cGUgb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmcsIHJldHVybiBhIHN0cmluZyBpblxuICAgICAqIGNhc2UgVHJ1c3RlZCBUeXBlcyBhcmUgbm90IHN1cHBvcnRlZCAgKi9cbiAgICB2YXIgUkVUVVJOX1RSVVNURURfVFlQRSA9IGZhbHNlO1xuXG4gICAgLyogT3V0cHV0IHNob3VsZCBiZSBmcmVlIGZyb20gRE9NIGNsb2JiZXJpbmcgYXR0YWNrcz8gKi9cbiAgICB2YXIgU0FOSVRJWkVfRE9NID0gdHJ1ZTtcblxuICAgIC8qIEtlZXAgZWxlbWVudCBjb250ZW50IHdoZW4gcmVtb3ZpbmcgZWxlbWVudD8gKi9cbiAgICB2YXIgS0VFUF9DT05URU5UID0gdHJ1ZTtcblxuICAgIC8qIElmIGEgYE5vZGVgIGlzIHBhc3NlZCB0byBzYW5pdGl6ZSgpLCB0aGVuIHBlcmZvcm1zIHNhbml0aXphdGlvbiBpbi1wbGFjZSBpbnN0ZWFkXG4gICAgICogb2YgaW1wb3J0aW5nIGl0IGludG8gYSBuZXcgRG9jdW1lbnQgYW5kIHJldHVybmluZyBhIHNhbml0aXplZCBjb3B5ICovXG4gICAgdmFyIElOX1BMQUNFID0gZmFsc2U7XG5cbiAgICAvKiBBbGxvdyB1c2FnZSBvZiBwcm9maWxlcyBsaWtlIGh0bWwsIHN2ZyBhbmQgbWF0aE1sICovXG4gICAgdmFyIFVTRV9QUk9GSUxFUyA9IHt9O1xuXG4gICAgLyogVGFncyB0byBpZ25vcmUgY29udGVudCBvZiB3aGVuIEtFRVBfQ09OVEVOVCBpcyB0cnVlICovXG4gICAgdmFyIEZPUkJJRF9DT05URU5UUyA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfRk9SQklEX0NPTlRFTlRTID0gYWRkVG9TZXQoe30sIFsnYW5ub3RhdGlvbi14bWwnLCAnYXVkaW8nLCAnY29sZ3JvdXAnLCAnZGVzYycsICdmb3JlaWdub2JqZWN0JywgJ2hlYWQnLCAnaWZyYW1lJywgJ21hdGgnLCAnbWknLCAnbW4nLCAnbW8nLCAnbXMnLCAnbXRleHQnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdwbGFpbnRleHQnLCAnc2NyaXB0JywgJ3N0eWxlJywgJ3N2ZycsICd0ZW1wbGF0ZScsICd0aGVhZCcsICd0aXRsZScsICd2aWRlbycsICd4bXAnXSk7XG5cbiAgICAvKiBUYWdzIHRoYXQgYXJlIHNhZmUgZm9yIGRhdGE6IFVSSXMgKi9cbiAgICB2YXIgREFUQV9VUklfVEFHUyA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfREFUQV9VUklfVEFHUyA9IGFkZFRvU2V0KHt9LCBbJ2F1ZGlvJywgJ3ZpZGVvJywgJ2ltZycsICdzb3VyY2UnLCAnaW1hZ2UnLCAndHJhY2snXSk7XG5cbiAgICAvKiBBdHRyaWJ1dGVzIHNhZmUgZm9yIHZhbHVlcyBsaWtlIFwiamF2YXNjcmlwdDpcIiAqL1xuICAgIHZhciBVUklfU0FGRV9BVFRSSUJVVEVTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTID0gYWRkVG9TZXQoe30sIFsnYWx0JywgJ2NsYXNzJywgJ2ZvcicsICdpZCcsICdsYWJlbCcsICduYW1lJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncm9sZScsICdzdW1tYXJ5JywgJ3RpdGxlJywgJ3ZhbHVlJywgJ3N0eWxlJywgJ3htbG5zJ10pO1xuXG4gICAgdmFyIE1BVEhNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7XG4gICAgdmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuICAgIHZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAvKiBEb2N1bWVudCBuYW1lc3BhY2UgKi9cbiAgICB2YXIgTkFNRVNQQUNFID0gSFRNTF9OQU1FU1BBQ0U7XG4gICAgdmFyIElTX0VNUFRZX0lOUFVUID0gZmFsc2U7XG5cbiAgICAvKiBLZWVwIGEgcmVmZXJlbmNlIHRvIGNvbmZpZyB0byBwYXNzIHRvIGhvb2tzICovXG4gICAgdmFyIENPTkZJRyA9IG51bGw7XG5cbiAgICAvKiBJZGVhbGx5LCBkbyBub3QgdG91Y2ggYW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lICovXG4gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqL1xuXG4gICAgdmFyIGZvcm1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xuXG4gICAgLyoqXG4gICAgICogX3BhcnNlQ29uZmlnXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGNmZyBvcHRpb25hbCBjb25maWcgbGl0ZXJhbFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgdmFyIF9wYXJzZUNvbmZpZyA9IGZ1bmN0aW9uIF9wYXJzZUNvbmZpZyhjZmcpIHtcbiAgICAgIGlmIChDT05GSUcgJiYgQ09ORklHID09PSBjZmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKiBTaGllbGQgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0YW1wZXJpbmcgKi9cbiAgICAgIGlmICghY2ZnIHx8ICh0eXBlb2YgY2ZnID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihjZmcpKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY2ZnID0ge307XG4gICAgICB9XG5cbiAgICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHByb3RvdHlwZSBwb2xsdXRpb24gKi9cbiAgICAgIGNmZyA9IGNsb25lKGNmZyk7XG5cbiAgICAgIC8qIFNldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICAgIEFMTE9XRURfVEFHUyA9ICdBTExPV0VEX1RBR1MnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuQUxMT1dFRF9UQUdTKSA6IERFRkFVTFRfQUxMT1dFRF9UQUdTO1xuICAgICAgQUxMT1dFRF9BVFRSID0gJ0FMTE9XRURfQVRUUicgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX0FUVFIpIDogREVGQVVMVF9BTExPV0VEX0FUVFI7XG4gICAgICBVUklfU0FGRV9BVFRSSUJVVEVTID0gJ0FERF9VUklfU0FGRV9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldChjbG9uZShERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMpLCBjZmcuQUREX1VSSV9TQUZFX0FUVFIpIDogREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTO1xuICAgICAgREFUQV9VUklfVEFHUyA9ICdBRERfREFUQV9VUklfVEFHUycgaW4gY2ZnID8gYWRkVG9TZXQoY2xvbmUoREVGQVVMVF9EQVRBX1VSSV9UQUdTKSwgY2ZnLkFERF9EQVRBX1VSSV9UQUdTKSA6IERFRkFVTFRfREFUQV9VUklfVEFHUztcbiAgICAgIEZPUkJJRF9DT05URU5UUyA9ICdGT1JCSURfQ09OVEVOVFMnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX0NPTlRFTlRTKSA6IERFRkFVTFRfRk9SQklEX0NPTlRFTlRTO1xuICAgICAgRk9SQklEX1RBR1MgPSAnRk9SQklEX1RBR1MnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX1RBR1MpIDoge307XG4gICAgICBGT1JCSURfQVRUUiA9ICdGT1JCSURfQVRUUicgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfQVRUUikgOiB7fTtcbiAgICAgIFVTRV9QUk9GSUxFUyA9ICdVU0VfUFJPRklMRVMnIGluIGNmZyA/IGNmZy5VU0VfUFJPRklMRVMgOiBmYWxzZTtcbiAgICAgIEFMTE9XX0FSSUFfQVRUUiA9IGNmZy5BTExPV19BUklBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIEFMTE9XX0RBVEFfQVRUUiA9IGNmZy5BTExPV19EQVRBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gY2ZnLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBTQUZFX0ZPUl9URU1QTEFURVMgPSBjZmcuU0FGRV9GT1JfVEVNUExBVEVTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBXSE9MRV9ET0NVTUVOVCA9IGNmZy5XSE9MRV9ET0NVTUVOVCB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gY2ZnLlJFVFVSTl9ET01fRlJBR01FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFJFVFVSTl9ET01fSU1QT1JUID0gY2ZnLlJFVFVSTl9ET01fSU1QT1JUICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBSRVRVUk5fVFJVU1RFRF9UWVBFID0gY2ZnLlJFVFVSTl9UUlVTVEVEX1RZUEUgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIEZPUkNFX0JPRFkgPSBjZmcuRk9SQ0VfQk9EWSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgU0FOSVRJWkVfRE9NID0gY2ZnLlNBTklUSVpFX0RPTSAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgSU5fUExBQ0UgPSBjZmcuSU5fUExBQ0UgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIElTX0FMTE9XRURfVVJJJCQxID0gY2ZnLkFMTE9XRURfVVJJX1JFR0VYUCB8fCBJU19BTExPV0VEX1VSSSQkMTtcbiAgICAgIE5BTUVTUEFDRSA9IGNmZy5OQU1FU1BBQ0UgfHwgSFRNTF9OQU1FU1BBQ0U7XG4gICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICAgIEFMTE9XX0RBVEFfQVRUUiA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICBSRVRVUk5fRE9NID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogUGFyc2UgcHJvZmlsZSBpbmZvICovXG4gICAgICBpZiAoVVNFX1BST0ZJTEVTKSB7XG4gICAgICAgIEFMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5JDEodGV4dCkpKTtcbiAgICAgICAgQUxMT1dFRF9BVFRSID0gW107XG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMuaHRtbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgaHRtbCk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBodG1sJDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5zdmcgPT09IHRydWUpIHtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIHN2Zyk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCBzdmckMSk7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9BVFRSLCB4bWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5zdmdGaWx0ZXJzID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBzdmdGaWx0ZXJzKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHN2ZyQxKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLm1hdGhNbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgbWF0aE1sKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIG1hdGhNbCQxKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogTWVyZ2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovXG4gICAgICBpZiAoY2ZnLkFERF9UQUdTKSB7XG4gICAgICAgIGlmIChBTExPV0VEX1RBR1MgPT09IERFRkFVTFRfQUxMT1dFRF9UQUdTKSB7XG4gICAgICAgICAgQUxMT1dFRF9UQUdTID0gY2xvbmUoQUxMT1dFRF9UQUdTKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgY2ZnLkFERF9UQUdTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5BRERfQVRUUikge1xuICAgICAgICBpZiAoQUxMT1dFRF9BVFRSID09PSBERUZBVUxUX0FMTE9XRURfQVRUUikge1xuICAgICAgICAgIEFMTE9XRURfQVRUUiA9IGNsb25lKEFMTE9XRURfQVRUUik7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGNmZy5BRERfQVRUUik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZmcuQUREX1VSSV9TQUZFX0FUVFIpIHtcbiAgICAgICAgYWRkVG9TZXQoVVJJX1NBRkVfQVRUUklCVVRFUywgY2ZnLkFERF9VUklfU0FGRV9BVFRSKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgICAgaWYgKEZPUkJJRF9DT05URU5UUyA9PT0gREVGQVVMVF9GT1JCSURfQ09OVEVOVFMpIHtcbiAgICAgICAgICBGT1JCSURfQ09OVEVOVFMgPSBjbG9uZShGT1JCSURfQ09OVEVOVFMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVG9TZXQoRk9SQklEX0NPTlRFTlRTLCBjZmcuRk9SQklEX0NPTlRFTlRTKTtcbiAgICAgIH1cblxuICAgICAgLyogQWRkICN0ZXh0IGluIGNhc2UgS0VFUF9DT05URU5UIGlzIHNldCB0byB0cnVlICovXG4gICAgICBpZiAoS0VFUF9DT05URU5UKSB7XG4gICAgICAgIEFMTE9XRURfVEFHU1snI3RleHQnXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIEFkZCBodG1sLCBoZWFkIGFuZCBib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIFdIT0xFX0RPQ1VNRU5UIGlzIHRydWUgKi9cbiAgICAgIGlmIChXSE9MRV9ET0NVTUVOVCkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsnaHRtbCcsICdoZWFkJywgJ2JvZHknXSk7XG4gICAgICB9XG5cbiAgICAgIC8qIEFkZCB0Ym9keSB0byBBTExPV0VEX1RBR1MgaW4gY2FzZSB0YWJsZXMgYXJlIHBlcm1pdHRlZCwgc2VlICMyODYsICMzNjUgKi9cbiAgICAgIGlmIChBTExPV0VEX1RBR1MudGFibGUpIHtcbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBbJ3Rib2R5J10pO1xuICAgICAgICBkZWxldGUgRk9SQklEX1RBR1MudGJvZHk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgZnVydGhlciBtYW5pcHVsYXRpb24gb2YgY29uZmlndXJhdGlvbi5cbiAgICAgIC8vIE5vdCBhdmFpbGFibGUgaW4gSUU4LCBTYWZhcmkgNSwgZXRjLlxuICAgICAgaWYgKGZyZWV6ZSkge1xuICAgICAgICBmcmVlemUoY2ZnKTtcbiAgICAgIH1cblxuICAgICAgQ09ORklHID0gY2ZnO1xuICAgIH07XG5cbiAgICB2YXIgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTID0gYWRkVG9TZXQoe30sIFsnbWknLCAnbW8nLCAnbW4nLCAnbXMnLCAnbXRleHQnXSk7XG5cbiAgICB2YXIgSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMgPSBhZGRUb1NldCh7fSwgWydmb3JlaWdub2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnLCAnYW5ub3RhdGlvbi14bWwnXSk7XG5cbiAgICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBwb3NzaWJsZSBTVkcgYW5kIE1hdGhNTCB0YWdzXG4gICAgICogc28gdGhhdCB3ZSBjYW4gcGVyZm9ybSB0aGUgbmFtZXNwYWNlIGNoZWNrc1xuICAgICAqIGNvcnJlY3RseS4gKi9cbiAgICB2YXIgQUxMX1NWR19UQUdTID0gYWRkVG9TZXQoe30sIHN2Zyk7XG4gICAgYWRkVG9TZXQoQUxMX1NWR19UQUdTLCBzdmdGaWx0ZXJzKTtcbiAgICBhZGRUb1NldChBTExfU1ZHX1RBR1MsIHN2Z0Rpc2FsbG93ZWQpO1xuXG4gICAgdmFyIEFMTF9NQVRITUxfVEFHUyA9IGFkZFRvU2V0KHt9LCBtYXRoTWwpO1xuICAgIGFkZFRvU2V0KEFMTF9NQVRITUxfVEFHUywgbWF0aE1sRGlzYWxsb3dlZCk7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RWxlbWVudH0gZWxlbWVudCBhIERPTSBlbGVtZW50IHdob3NlIG5hbWVzcGFjZSBpcyBiZWluZyBjaGVja2VkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBoYXMgYVxuICAgICAqICBuYW1lc3BhY2UgdGhhdCBhIHNwZWMtY29tcGxpYW50IHBhcnNlciB3b3VsZCBuZXZlclxuICAgICAqICByZXR1cm4uIFJldHVybiB0cnVlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB2YXIgX2NoZWNrVmFsaWROYW1lc3BhY2UgPSBmdW5jdGlvbiBfY2hlY2tWYWxpZE5hbWVzcGFjZShlbGVtZW50KSB7XG4gICAgICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICAgICAgLy8gSW4gSlNET00sIGlmIHdlJ3JlIGluc2lkZSBzaGFkb3cgRE9NLCB0aGVuIHBhcmVudE5vZGVcbiAgICAgIC8vIGNhbiBiZSBudWxsLiBXZSBqdXN0IHNpbXVsYXRlIHBhcmVudCBpbiB0aGlzIGNhc2UuXG4gICAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LnRhZ05hbWUpIHtcbiAgICAgICAgcGFyZW50ID0ge1xuICAgICAgICAgIG5hbWVzcGFjZVVSSTogSFRNTF9OQU1FU1BBQ0UsXG4gICAgICAgICAgdGFnTmFtZTogJ3RlbXBsYXRlJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgdGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQudGFnTmFtZSk7XG4gICAgICB2YXIgcGFyZW50VGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKHBhcmVudC50YWdOYW1lKTtcblxuICAgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBTVkdcbiAgICAgICAgLy8gaXMgdmlhIDxzdmc+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBNYXRoTUwgdG8gU1ZHIGlzIHZpYVxuICAgICAgICAvLyBzdmcgaWYgcGFyZW50IGlzIGVpdGhlciA8YW5ub3RhdGlvbi14bWw+IG9yIE1hdGhNTFxuICAgICAgICAvLyB0ZXh0IGludGVncmF0aW9uIHBvaW50cy5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ3N2ZycgJiYgKHBhcmVudFRhZ05hbWUgPT09ICdhbm5vdGF0aW9uLXhtbCcgfHwgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBTVkdcbiAgICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBTVkcgbmFtZXNwYWNlLlxuICAgICAgICByZXR1cm4gQm9vbGVhbihBTExfU1ZHX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIE1hdGhNTFxuICAgICAgICAvLyBpcyB2aWEgPG1hdGg+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIE1hdGhNTCBpcyB2aWFcbiAgICAgICAgLy8gPG1hdGg+IGFuZCBIVE1MIGludGVncmF0aW9uIHBvaW50c1xuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCcgJiYgSFRNTF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gTWF0aE1MXG4gICAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gTWF0aE1MIG5hbWVzcGFjZS5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIEhUTUwgaXMgdmlhXG4gICAgICAgIC8vIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgZnJvbSBNYXRoTUwgdG8gSFRNTFxuICAgICAgICAvLyBpcyB2aWEgTWF0aE1MIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFICYmICFIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFICYmICFNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDZXJ0YWluIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGJvdGggU1ZHIGFuZCBIVE1MXG4gICAgICAgIC8vIG5hbWVzcGFjZS4gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZW0gZXhwbGljaXRseVxuICAgICAgICAvLyBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGVycm9ub3VzbHkgZGVsZXRlZCBmcm9tXG4gICAgICAgIC8vIEhUTUwgbmFtZXNwYWNlLlxuICAgICAgICB2YXIgY29tbW9uU3ZnQW5kSFRNTEVsZW1lbnRzID0gYWRkVG9TZXQoe30sIFsndGl0bGUnLCAnc3R5bGUnLCAnZm9udCcsICdhJywgJ3NjcmlwdCddKTtcblxuICAgICAgICAvLyBXZSBkaXNhbGxvdyB0YWdzIHRoYXQgYXJlIHNwZWNpZmljIGZvciBNYXRoTUxcbiAgICAgICAgLy8gb3IgU1ZHIGFuZCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIEhUTUwgbmFtZXNwYWNlXG4gICAgICAgIHJldHVybiAhQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdICYmIChjb21tb25TdmdBbmRIVE1MRWxlbWVudHNbdGFnTmFtZV0gfHwgIUFMTF9TVkdfVEFHU1t0YWdOYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb2RlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBsYWNlICh0aGlzIG1lYW5zXG4gICAgICAvLyB0aGF0IHRoZSBlbGVtZW50IHNvbWVob3cgZ290IG5hbWVzcGFjZSB0aGF0IGlzIG5vdFxuICAgICAgLy8gSFRNTCwgU1ZHIG9yIE1hdGhNTCkuIFJldHVybiBmYWxzZSBqdXN0IGluIGNhc2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9mb3JjZVJlbW92ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBhIERPTSBub2RlXG4gICAgICovXG4gICAgdmFyIF9mb3JjZVJlbW92ZSA9IGZ1bmN0aW9uIF9mb3JjZVJlbW92ZShub2RlKSB7XG4gICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHsgZWxlbWVudDogbm9kZSB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1yZW1vdmVcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG5vZGUub3V0ZXJIVE1MID0gZW1wdHlIVE1MO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfcmVtb3ZlQXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgYW4gQXR0cmlidXRlIG5hbWVcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBub2RlIGEgRE9NIG5vZGVcbiAgICAgKi9cbiAgICB2YXIgX3JlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgbm9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgICAgYXR0cmlidXRlOiBub2RlLmdldEF0dHJpYnV0ZU5vZGUobmFtZSksXG4gICAgICAgICAgZnJvbTogbm9kZVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7XG4gICAgICAgICAgYXR0cmlidXRlOiBudWxsLFxuICAgICAgICAgIGZyb206IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXG4gICAgICAvLyBXZSB2b2lkIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIHVucmVtb3ZhYmxlIFwiaXNcIlwiIGF0dHJpYnV0ZXNcbiAgICAgIGlmIChuYW1lID09PSAnaXMnICYmICFBTExPV0VEX0FUVFJbbmFtZV0pIHtcbiAgICAgICAgaWYgKFJFVFVSTl9ET00gfHwgUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfZm9yY2VSZW1vdmUobm9kZSk7XG4gICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2luaXREb2N1bWVudFxuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBkaXJ0eSBhIHN0cmluZyBvZiBkaXJ0eSBtYXJrdXBcbiAgICAgKiBAcmV0dXJuIHtEb2N1bWVudH0gYSBET00sIGZpbGxlZCB3aXRoIHRoZSBkaXJ0eSBtYXJrdXBcbiAgICAgKi9cbiAgICB2YXIgX2luaXREb2N1bWVudCA9IGZ1bmN0aW9uIF9pbml0RG9jdW1lbnQoZGlydHkpIHtcbiAgICAgIC8qIENyZWF0ZSBhIEhUTUwgZG9jdW1lbnQgKi9cbiAgICAgIHZhciBkb2MgPSB2b2lkIDA7XG4gICAgICB2YXIgbGVhZGluZ1doaXRlc3BhY2UgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChGT1JDRV9CT0RZKSB7XG4gICAgICAgIGRpcnR5ID0gJzxyZW1vdmU+PC9yZW1vdmU+JyArIGRpcnR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogSWYgRk9SQ0VfQk9EWSBpc24ndCB1c2VkLCBsZWFkaW5nIHdoaXRlc3BhY2UgbmVlZHMgdG8gYmUgcHJlc2VydmVkIG1hbnVhbGx5ICovXG4gICAgICAgIHZhciBtYXRjaGVzID0gc3RyaW5nTWF0Y2goZGlydHksIC9eW1xcclxcblxcdCBdKy8pO1xuICAgICAgICBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1swXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpcnR5UGF5bG9hZCA9IHRydXN0ZWRUeXBlc1BvbGljeSA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKGRpcnR5KSA6IGRpcnR5O1xuICAgICAgLypcbiAgICAgICAqIFVzZSB0aGUgRE9NUGFyc2VyIEFQSSBieSBkZWZhdWx0LCBmYWxsYmFjayBsYXRlciBpZiBuZWVkcyBiZVxuICAgICAgICogRE9NUGFyc2VyIG5vdCB3b3JrIGZvciBzdmcgd2hlbiBoYXMgbXVsdGlwbGUgcm9vdCBlbGVtZW50LlxuICAgICAgICovXG4gICAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoZGlydHlQYXlsb2FkLCAndGV4dC9odG1sJyk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG5cbiAgICAgIC8qIFVzZSBjcmVhdGVIVE1MRG9jdW1lbnQgaW4gY2FzZSBET01QYXJzZXIgaXMgbm90IGF2YWlsYWJsZSAqL1xuICAgICAgaWYgKCFkb2MgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgZG9jID0gaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoTkFNRVNQQUNFLCAndGVtcGxhdGUnLCBudWxsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IElTX0VNUFRZX0lOUFVUID8gJycgOiBkaXJ0eVBheWxvYWQ7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAvLyBTeW50YXggZXJyb3IgaWYgZGlydHlQYXlsb2FkIGlzIGludmFsaWQgeG1sXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGJvZHkgPSBkb2MuYm9keSB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICBpZiAoZGlydHkgJiYgbGVhZGluZ1doaXRlc3BhY2UpIHtcbiAgICAgICAgYm9keS5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVhZGluZ1doaXRlc3BhY2UpLCBib2R5LmNoaWxkTm9kZXNbMF0gfHwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIC8qIFdvcmsgb24gd2hvbGUgZG9jdW1lbnQgb3IganVzdCBpdHMgYm9keSAqL1xuICAgICAgaWYgKE5BTUVTUEFDRSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lLmNhbGwoZG9jLCBXSE9MRV9ET0NVTUVOVCA/ICdodG1sJyA6ICdib2R5JylbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBXSE9MRV9ET0NVTUVOVCA/IGRvYy5kb2N1bWVudEVsZW1lbnQgOiBib2R5O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfY3JlYXRlSXRlcmF0b3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0RvY3VtZW50fSByb290IGRvY3VtZW50L2ZyYWdtZW50IHRvIGNyZWF0ZSBpdGVyYXRvciBmb3JcbiAgICAgKiBAcmV0dXJuIHtJdGVyYXRvcn0gaXRlcmF0b3IgaW5zdGFuY2VcbiAgICAgKi9cbiAgICB2YXIgX2NyZWF0ZUl0ZXJhdG9yID0gZnVuY3Rpb24gX2NyZWF0ZUl0ZXJhdG9yKHJvb3QpIHtcbiAgICAgIHJldHVybiBjcmVhdGVOb2RlSXRlcmF0b3IuY2FsbChyb290Lm93bmVyRG9jdW1lbnQgfHwgcm9vdCwgcm9vdCwgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQgfCBOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19URVhULCBudWxsLCBmYWxzZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9pc0Nsb2JiZXJlZFxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gZWxtIGVsZW1lbnQgdG8gY2hlY2sgZm9yIGNsb2JiZXJpbmcgYXR0YWNrc1xuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgY2xvYmJlcmVkLCBmYWxzZSBpZiBzYWZlXG4gICAgICovXG4gICAgdmFyIF9pc0Nsb2JiZXJlZCA9IGZ1bmN0aW9uIF9pc0Nsb2JiZXJlZChlbG0pIHtcbiAgICAgIGlmIChlbG0gaW5zdGFuY2VvZiBUZXh0IHx8IGVsbSBpbnN0YW5jZW9mIENvbW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGVsbS5ub2RlTmFtZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsbS50ZXh0Q29udGVudCAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsbS5yZW1vdmVDaGlsZCAhPT0gJ2Z1bmN0aW9uJyB8fCAhKGVsbS5hdHRyaWJ1dGVzIGluc3RhbmNlb2YgTmFtZWROb2RlTWFwKSB8fCB0eXBlb2YgZWxtLnJlbW92ZUF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZWxtLnNldEF0dHJpYnV0ZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgZWxtLm5hbWVzcGFjZVVSSSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsbS5pbnNlcnRCZWZvcmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2lzTm9kZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gb2JqIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIGl0J3MgYSBET00gbm9kZVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaXMgb2JqZWN0IGlzIGEgRE9NIG5vZGVcbiAgICAgKi9cbiAgICB2YXIgX2lzTm9kZSA9IGZ1bmN0aW9uIF9pc05vZGUob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKHR5cGVvZiBOb2RlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihOb2RlKSkgPT09ICdvYmplY3QnID8gb2JqZWN0IGluc3RhbmNlb2YgTm9kZSA6IG9iamVjdCAmJiAodHlwZW9mIG9iamVjdCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqZWN0KSkgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBvYmplY3Qubm9kZU5hbWUgPT09ICdzdHJpbmcnO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfZXhlY3V0ZUhvb2tcbiAgICAgKiBFeGVjdXRlIHVzZXIgY29uZmlndXJhYmxlIGhvb2tzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGVudHJ5UG9pbnQgIE5hbWUgb2YgdGhlIGhvb2sncyBlbnRyeSBwb2ludFxuICAgICAqIEBwYXJhbSAge05vZGV9IGN1cnJlbnROb2RlIG5vZGUgdG8gd29yayBvbiB3aXRoIHRoZSBob29rXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBkYXRhIGFkZGl0aW9uYWwgaG9vayBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgdmFyIF9leGVjdXRlSG9vayA9IGZ1bmN0aW9uIF9leGVjdXRlSG9vayhlbnRyeVBvaW50LCBjdXJyZW50Tm9kZSwgZGF0YSkge1xuICAgICAgaWYgKCFob29rc1tlbnRyeVBvaW50XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFycmF5Rm9yRWFjaChob29rc1tlbnRyeVBvaW50XSwgZnVuY3Rpb24gKGhvb2spIHtcbiAgICAgICAgaG9vay5jYWxsKERPTVB1cmlmeSwgY3VycmVudE5vZGUsIGRhdGEsIENPTkZJRyk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX3Nhbml0aXplRWxlbWVudHNcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAgICogQHByb3RlY3QgdGV4dENvbnRlbnRcbiAgICAgKiBAcHJvdGVjdCByZW1vdmVDaGlsZFxuICAgICAqXG4gICAgICogQHBhcmFtICAge05vZGV9IGN1cnJlbnROb2RlIHRvIGNoZWNrIGZvciBwZXJtaXNzaW9uIHRvIGV4aXN0XG4gICAgICogQHJldHVybiAge0Jvb2xlYW59IHRydWUgaWYgbm9kZSB3YXMga2lsbGVkLCBmYWxzZSBpZiBsZWZ0IGFsaXZlXG4gICAgICovXG4gICAgdmFyIF9zYW5pdGl6ZUVsZW1lbnRzID0gZnVuY3Rpb24gX3Nhbml0aXplRWxlbWVudHMoY3VycmVudE5vZGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gdm9pZCAwO1xuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplRWxlbWVudHMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAgIC8qIENoZWNrIGlmIGVsZW1lbnQgaXMgY2xvYmJlcmVkIG9yIGNhbiBjbG9iYmVyICovXG4gICAgICBpZiAoX2lzQ2xvYmJlcmVkKGN1cnJlbnROb2RlKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogQ2hlY2sgaWYgdGFnbmFtZSBjb250YWlucyBVbmljb2RlICovXG4gICAgICBpZiAoc3RyaW5nTWF0Y2goY3VycmVudE5vZGUubm9kZU5hbWUsIC9bXFx1MDA4MC1cXHVGRkZGXS8pKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBOb3cgbGV0J3MgY2hlY2sgdGhlIGVsZW1lbnQncyB0eXBlIGFuZCBuYW1lICovXG4gICAgICB2YXIgdGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGN1cnJlbnROb2RlLm5vZGVOYW1lKTtcblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rKCd1cG9uU2FuaXRpemVFbGVtZW50JywgY3VycmVudE5vZGUsIHtcbiAgICAgICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICAgICAgYWxsb3dlZFRhZ3M6IEFMTE9XRURfVEFHU1xuICAgICAgfSk7XG5cbiAgICAgIC8qIERldGVjdCBtWFNTIGF0dGVtcHRzIGFidXNpbmcgbmFtZXNwYWNlIGNvbmZ1c2lvbiAqL1xuICAgICAgaWYgKCFfaXNOb2RlKGN1cnJlbnROb2RlLmZpcnN0RWxlbWVudENoaWxkKSAmJiAoIV9pc05vZGUoY3VycmVudE5vZGUuY29udGVudCkgfHwgIV9pc05vZGUoY3VycmVudE5vZGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCkpICYmIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUuaW5uZXJIVE1MKSAmJiByZWdFeHBUZXN0KC88Wy9cXHddL2csIGN1cnJlbnROb2RlLnRleHRDb250ZW50KSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogTWl0aWdhdGUgYSBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGluc2lkZSBzZWxlY3QgKi9cbiAgICAgIGlmICh0YWdOYW1lID09PSAnc2VsZWN0JyAmJiByZWdFeHBUZXN0KC88dGVtcGxhdGUvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogUmVtb3ZlIGVsZW1lbnQgaWYgYW55dGhpbmcgZm9yYmlkcyBpdHMgcHJlc2VuY2UgKi9cbiAgICAgIGlmICghQUxMT1dFRF9UQUdTW3RhZ05hbWVdIHx8IEZPUkJJRF9UQUdTW3RhZ05hbWVdKSB7XG4gICAgICAgIC8qIEtlZXAgY29udGVudCBleGNlcHQgZm9yIGJhZC1saXN0ZWQgZWxlbWVudHMgKi9cbiAgICAgICAgaWYgKEtFRVBfQ09OVEVOVCAmJiAhRk9SQklEX0NPTlRFTlRTW3RhZ05hbWVdKSB7XG4gICAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIHZhciBjaGlsZE5vZGVzID0gZ2V0Q2hpbGROb2RlcyhjdXJyZW50Tm9kZSkgfHwgY3VycmVudE5vZGUuY2hpbGROb2RlcztcblxuICAgICAgICAgIGlmIChjaGlsZE5vZGVzICYmIHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZENvdW50ID0gY2hpbGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBjaGlsZENvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2xvbmVOb2RlKGNoaWxkTm9kZXNbaV0sIHRydWUpLCBnZXROZXh0U2libGluZyhjdXJyZW50Tm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayB3aGV0aGVyIGVsZW1lbnQgaGFzIGEgdmFsaWQgbmFtZXNwYWNlICovXG4gICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmICFfY2hlY2tWYWxpZE5hbWVzcGFjZShjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICgodGFnTmFtZSA9PT0gJ25vc2NyaXB0JyB8fCB0YWdOYW1lID09PSAnbm9lbWJlZCcpICYmIHJlZ0V4cFRlc3QoLzxcXC9ubyhzY3JpcHR8ZW1iZWQpL2ksIGN1cnJlbnROb2RlLmlubmVySFRNTCkpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIFNhbml0aXplIGVsZW1lbnQgY29udGVudCB0byBiZSB0ZW1wbGF0ZS1zYWZlICovXG4gICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTICYmIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgIC8qIEdldCB0aGUgZWxlbWVudCdzIHRleHQgY29udGVudCAqL1xuICAgICAgICBjb250ZW50ID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIE1VU1RBQ0hFX0VYUFIkJDEsICcgJyk7XG4gICAgICAgIGNvbnRlbnQgPSBzdHJpbmdSZXBsYWNlKGNvbnRlbnQsIEVSQl9FWFBSJCQxLCAnICcpO1xuICAgICAgICBpZiAoY3VycmVudE5vZGUudGV4dENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHsgZWxlbWVudDogY3VycmVudE5vZGUuY2xvbmVOb2RlKCkgfSk7XG4gICAgICAgICAgY3VycmVudE5vZGUudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzJywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9pc1ZhbGlkQXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxjVGFnIExvd2VyY2FzZSB0YWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBsY05hbWUgTG93ZXJjYXNlIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICB2YXIgX2lzVmFsaWRBdHRyaWJ1dGUgPSBmdW5jdGlvbiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSkge1xuICAgICAgLyogTWFrZSBzdXJlIGF0dHJpYnV0ZSBjYW5ub3QgY2xvYmJlciAqL1xuICAgICAgaWYgKFNBTklUSVpFX0RPTSAmJiAobGNOYW1lID09PSAnaWQnIHx8IGxjTmFtZSA9PT0gJ25hbWUnKSAmJiAodmFsdWUgaW4gZG9jdW1lbnQgfHwgdmFsdWUgaW4gZm9ybUVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLyogQWxsb3cgdmFsaWQgZGF0YS0qIGF0dHJpYnV0ZXM6IEF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgYWZ0ZXIgXCItXCJcbiAgICAgICAgICAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZG9tLmh0bWwjZW1iZWRkaW5nLWN1c3RvbS1ub24tdmlzaWJsZS1kYXRhLXdpdGgtdGhlLWRhdGEtKi1hdHRyaWJ1dGVzKVxuICAgICAgICAgIFhNTC1jb21wYXRpYmxlIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbmZyYXN0cnVjdHVyZS5odG1sI3htbC1jb21wYXRpYmxlIGFuZCBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI2QwZTgwNClcbiAgICAgICAgICBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZTsgaXQncyBhbHdheXMgVVJJIHNhZmUuICovXG4gICAgICBpZiAoQUxMT1dfREFUQV9BVFRSICYmICFGT1JCSURfQVRUUltsY05hbWVdICYmIHJlZ0V4cFRlc3QoREFUQV9BVFRSJCQxLCBsY05hbWUpKSA7IGVsc2UgaWYgKEFMTE9XX0FSSUFfQVRUUiAmJiByZWdFeHBUZXN0KEFSSUFfQVRUUiQkMSwgbGNOYW1lKSkgOyBlbHNlIGlmICghQUxMT1dFRF9BVFRSW2xjTmFtZV0gfHwgRk9SQklEX0FUVFJbbGNOYW1lXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLyogQ2hlY2sgdmFsdWUgaXMgc2FmZS4gRmlyc3QsIGlzIGF0dHIgaW5lcnQ/IElmIHNvLCBpcyBzYWZlICovXG4gICAgICB9IGVsc2UgaWYgKFVSSV9TQUZFX0FUVFJJQlVURVNbbGNOYW1lXSkgOyBlbHNlIGlmIChyZWdFeHBUZXN0KElTX0FMTE9XRURfVVJJJCQxLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UkJDEsICcnKSkpIDsgZWxzZSBpZiAoKGxjTmFtZSA9PT0gJ3NyYycgfHwgbGNOYW1lID09PSAneGxpbms6aHJlZicgfHwgbGNOYW1lID09PSAnaHJlZicpICYmIGxjVGFnICE9PSAnc2NyaXB0JyAmJiBzdHJpbmdJbmRleE9mKHZhbHVlLCAnZGF0YTonKSA9PT0gMCAmJiBEQVRBX1VSSV9UQUdTW2xjVGFnXSkgOyBlbHNlIGlmIChBTExPV19VTktOT1dOX1BST1RPQ09MUyAmJiAhcmVnRXhwVGVzdChJU19TQ1JJUFRfT1JfREFUQSQkMSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFJCQxLCAnJykpKSA7IGVsc2UgaWYgKCF2YWx1ZSkgOyBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX3Nhbml0aXplQXR0cmlidXRlc1xuICAgICAqXG4gICAgICogQHByb3RlY3QgYXR0cmlidXRlc1xuICAgICAqIEBwcm90ZWN0IG5vZGVOYW1lXG4gICAgICogQHByb3RlY3QgcmVtb3ZlQXR0cmlidXRlXG4gICAgICogQHByb3RlY3Qgc2V0QXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBjdXJyZW50Tm9kZSB0byBzYW5pdGl6ZVxuICAgICAqL1xuICAgIHZhciBfc2FuaXRpemVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gX3Nhbml0aXplQXR0cmlidXRlcyhjdXJyZW50Tm9kZSkge1xuICAgICAgdmFyIGF0dHIgPSB2b2lkIDA7XG4gICAgICB2YXIgdmFsdWUgPSB2b2lkIDA7XG4gICAgICB2YXIgbGNOYW1lID0gdm9pZCAwO1xuICAgICAgdmFyIGwgPSB2b2lkIDA7XG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplQXR0cmlidXRlcycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBjdXJyZW50Tm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGF0dHJpYnV0ZXM7IGlmIG5vdCB3ZSBtaWdodCBoYXZlIGEgdGV4dCBub2RlICovXG5cbiAgICAgIGlmICghYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBob29rRXZlbnQgPSB7XG4gICAgICAgIGF0dHJOYW1lOiAnJyxcbiAgICAgICAgYXR0clZhbHVlOiAnJyxcbiAgICAgICAga2VlcEF0dHI6IHRydWUsXG4gICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzOiBBTExPV0VEX0FUVFJcbiAgICAgIH07XG4gICAgICBsID0gYXR0cmlidXRlcy5sZW5ndGg7XG5cbiAgICAgIC8qIEdvIGJhY2t3YXJkcyBvdmVyIGFsbCBhdHRyaWJ1dGVzOyBzYWZlbHkgcmVtb3ZlIGJhZCBvbmVzICovXG4gICAgICB3aGlsZSAobC0tKSB7XG4gICAgICAgIGF0dHIgPSBhdHRyaWJ1dGVzW2xdO1xuICAgICAgICB2YXIgX2F0dHIgPSBhdHRyLFxuICAgICAgICAgICAgbmFtZSA9IF9hdHRyLm5hbWUsXG4gICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBfYXR0ci5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgdmFsdWUgPSBzdHJpbmdUcmltKGF0dHIudmFsdWUpO1xuICAgICAgICBsY05hbWUgPSBzdHJpbmdUb0xvd2VyQ2FzZShuYW1lKTtcblxuICAgICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICAgIGhvb2tFdmVudC5hdHRyTmFtZSA9IGxjTmFtZTtcbiAgICAgICAgaG9va0V2ZW50LmF0dHJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBob29rRXZlbnQua2VlcEF0dHIgPSB0cnVlO1xuICAgICAgICBob29rRXZlbnQuZm9yY2VLZWVwQXR0ciA9IHVuZGVmaW5lZDsgLy8gQWxsb3dzIGRldmVsb3BlcnMgdG8gc2VlIHRoaXMgaXMgYSBwcm9wZXJ0eSB0aGV5IGNhbiBzZXRcbiAgICAgICAgX2V4ZWN1dGVIb29rKCd1cG9uU2FuaXRpemVBdHRyaWJ1dGUnLCBjdXJyZW50Tm9kZSwgaG9va0V2ZW50KTtcbiAgICAgICAgdmFsdWUgPSBob29rRXZlbnQuYXR0clZhbHVlO1xuICAgICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cbiAgICAgICAgaWYgKGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBSZW1vdmUgYXR0cmlidXRlICovXG4gICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuXG4gICAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgICBpZiAoIWhvb2tFdmVudC5rZWVwQXR0cikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogV29yayBhcm91bmQgYSBzZWN1cml0eSBpc3N1ZSBpbiBqUXVlcnkgMy4wICovXG4gICAgICAgIGlmIChyZWdFeHBUZXN0KC9cXC8+L2ksIHZhbHVlKSkge1xuICAgICAgICAgIF9yZW1vdmVBdHRyaWJ1dGUobmFtZSwgY3VycmVudE5vZGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2FuaXRpemUgYXR0cmlidXRlIGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBNVVNUQUNIRV9FWFBSJCQxLCAnICcpO1xuICAgICAgICAgIHZhbHVlID0gc3RyaW5nUmVwbGFjZSh2YWx1ZSwgRVJCX0VYUFIkJDEsICcgJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBJcyBgdmFsdWVgIHZhbGlkIGZvciB0aGlzIGF0dHJpYnV0ZT8gKi9cbiAgICAgICAgdmFyIGxjVGFnID0gY3VycmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEhhbmRsZSBpbnZhbGlkIGRhdGEtKiBhdHRyaWJ1dGUgc2V0IGJ5IHRyeS1jYXRjaGluZyBpdCAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBGYWxsYmFjayB0byBzZXRBdHRyaWJ1dGUoKSBmb3IgYnJvd3Nlci11bnJlY29nbml6ZWQgbmFtZXNwYWNlcyBlLmcuIFwieC1zY2hlbWFcIi4gKi9cbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXJyYXlQb3AoRE9NUHVyaWZ5LnJlbW92ZWQpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgY3VycmVudE5vZGUsIG51bGwpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVTaGFkb3dET01cbiAgICAgKlxuICAgICAqIEBwYXJhbSAge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50IHRvIGl0ZXJhdGUgb3ZlciByZWN1cnNpdmVseVxuICAgICAqL1xuICAgIHZhciBfc2FuaXRpemVTaGFkb3dET00gPSBmdW5jdGlvbiBfc2FuaXRpemVTaGFkb3dET00oZnJhZ21lbnQpIHtcbiAgICAgIHZhciBzaGFkb3dOb2RlID0gdm9pZCAwO1xuICAgICAgdmFyIHNoYWRvd0l0ZXJhdG9yID0gX2NyZWF0ZUl0ZXJhdG9yKGZyYWdtZW50KTtcblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rKCdiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTScsIGZyYWdtZW50LCBudWxsKTtcblxuICAgICAgd2hpbGUgKHNoYWRvd05vZGUgPSBzaGFkb3dJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgICAgX2V4ZWN1dGVIb29rKCd1cG9uU2FuaXRpemVTaGFkb3dOb2RlJywgc2hhZG93Tm9kZSwgbnVsbCk7XG5cbiAgICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKHNoYWRvd05vZGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBEZWVwIHNoYWRvdyBET00gZGV0ZWN0ZWQgKi9cbiAgICAgICAgaWYgKHNoYWRvd05vZGUuY29udGVudCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgICBfc2FuaXRpemVTaGFkb3dET00oc2hhZG93Tm9kZS5jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMsIHNhbml0aXplIGlmIG5lY2Vzc2FyeSAqL1xuICAgICAgICBfc2FuaXRpemVBdHRyaWJ1dGVzKHNoYWRvd05vZGUpO1xuICAgICAgfVxuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVTaGFkb3dET00nLCBmcmFnbWVudCwgbnVsbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNhbml0aXplXG4gICAgICogUHVibGljIG1ldGhvZCBwcm92aWRpbmcgY29yZSBzYW5pdGF0aW9uIGZ1bmN0aW9uYWxpdHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE5vZGV9IGRpcnR5IHN0cmluZyBvciBET00gbm9kZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgRE9NUHVyaWZ5LnNhbml0aXplID0gZnVuY3Rpb24gKGRpcnR5LCBjZmcpIHtcbiAgICAgIHZhciBib2R5ID0gdm9pZCAwO1xuICAgICAgdmFyIGltcG9ydGVkTm9kZSA9IHZvaWQgMDtcbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHZvaWQgMDtcbiAgICAgIHZhciBvbGROb2RlID0gdm9pZCAwO1xuICAgICAgdmFyIHJldHVybk5vZGUgPSB2b2lkIDA7XG4gICAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHN0cmluZyB0byBzYW5pdGl6ZS5cbiAgICAgICAgRE8gTk9UIHJldHVybiBlYXJseSwgYXMgdGhpcyB3aWxsIHJldHVybiB0aGUgd3JvbmcgdHlwZSBpZlxuICAgICAgICB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgRE9NIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAqL1xuICAgICAgSVNfRU1QVFlfSU5QVVQgPSAhZGlydHk7XG4gICAgICBpZiAoSVNfRU1QVFlfSU5QVVQpIHtcbiAgICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgICAgfVxuXG4gICAgICAvKiBTdHJpbmdpZnksIGluIGNhc2UgZGlydHkgaXMgYW4gb2JqZWN0ICovXG4gICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJyAmJiAhX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lZ2F0ZWQtY29uZGl0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgZGlydHkudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ3RvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlydHkgPSBkaXJ0eS50b1N0cmluZygpO1xuICAgICAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ2RpcnR5IGlzIG5vdCBhIHN0cmluZywgYWJvcnRpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogQ2hlY2sgd2UgY2FuIHJ1bi4gT3RoZXJ3aXNlIGZhbGwgYmFjayBvciBpZ25vcmUgKi9cbiAgICAgIGlmICghRE9NUHVyaWZ5LmlzU3VwcG9ydGVkKSB7XG4gICAgICAgIGlmIChfdHlwZW9mKHdpbmRvdy50b1N0YXRpY0hUTUwpID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygd2luZG93LnRvU3RhdGljSFRNTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGlydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnRvU3RhdGljSFRNTChkaXJ0eSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9pc05vZGUoZGlydHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnRvU3RhdGljSFRNTChkaXJ0eS5vdXRlckhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaXJ0eTtcbiAgICAgIH1cblxuICAgICAgLyogQXNzaWduIGNvbmZpZyB2YXJzICovXG4gICAgICBpZiAoIVNFVF9DT05GSUcpIHtcbiAgICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgICB9XG5cbiAgICAgIC8qIENsZWFuIHVwIHJlbW92ZWQgZWxlbWVudHMgKi9cbiAgICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgICAgIC8qIENoZWNrIGlmIGRpcnR5IGlzIGNvcnJlY3RseSB0eXBlZCBmb3IgSU5fUExBQ0UgKi9cbiAgICAgIGlmICh0eXBlb2YgZGlydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIElOX1BMQUNFID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChJTl9QTEFDRSkgOyBlbHNlIGlmIChkaXJ0eSBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgLyogSWYgZGlydHkgaXMgYSBET00gZWxlbWVudCwgYXBwZW5kIHRvIGFuIGVtcHR5IGRvY3VtZW50IHRvIGF2b2lkXG4gICAgICAgICAgIGVsZW1lbnRzIGJlaW5nIHN0cmlwcGVkIGJ5IHRoZSBwYXJzZXIgKi9cbiAgICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoJzwhLS0tLT4nKTtcbiAgICAgICAgaW1wb3J0ZWROb2RlID0gYm9keS5vd25lckRvY3VtZW50LmltcG9ydE5vZGUoZGlydHksIHRydWUpO1xuICAgICAgICBpZiAoaW1wb3J0ZWROb2RlLm5vZGVUeXBlID09PSAxICYmIGltcG9ydGVkTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgLyogTm9kZSBpcyBhbHJlYWR5IGEgYm9keSwgdXNlIGFzIGlzICovXG4gICAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgICAgIGJvZHkgPSBpbXBvcnRlZE5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoaW1wb3J0ZWROb2RlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogRXhpdCBkaXJlY3RseSBpZiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gKi9cbiAgICAgICAgaWYgKCFSRVRVUk5fRE9NICYmICFTQUZFX0ZPUl9URU1QTEFURVMgJiYgIVdIT0xFX0RPQ1VNRU5UICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1pbmNsdWRlc1xuICAgICAgICBkaXJ0eS5pbmRleE9mKCc8JykgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpIDogZGlydHk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBkb2N1bWVudCB0byB3b3JrIG9uICovXG4gICAgICAgIGJvZHkgPSBfaW5pdERvY3VtZW50KGRpcnR5KTtcblxuICAgICAgICAvKiBDaGVjayB3ZSBoYXZlIGEgRE9NIG5vZGUgZnJvbSB0aGUgZGF0YSAqL1xuICAgICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gUkVUVVJOX0RPTSA/IG51bGwgOiBlbXB0eUhUTUw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogUmVtb3ZlIGZpcnN0IGVsZW1lbnQgbm9kZSAob3VycykgaWYgRk9SQ0VfQk9EWSBpcyBzZXQgKi9cbiAgICAgIGlmIChib2R5ICYmIEZPUkNFX0JPRFkpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIC8qIEdldCBub2RlIGl0ZXJhdG9yICovXG4gICAgICB2YXIgbm9kZUl0ZXJhdG9yID0gX2NyZWF0ZUl0ZXJhdG9yKElOX1BMQUNFID8gZGlydHkgOiBib2R5KTtcblxuICAgICAgLyogTm93IHN0YXJ0IGl0ZXJhdGluZyBvdmVyIHRoZSBjcmVhdGVkIGRvY3VtZW50ICovXG4gICAgICB3aGlsZSAoY3VycmVudE5vZGUgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkge1xuICAgICAgICAvKiBGaXggSUUncyBzdHJhbmdlIGJlaGF2aW9yIHdpdGggbWFuaXB1bGF0ZWQgdGV4dE5vZGVzICM4OSAqL1xuICAgICAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IDMgJiYgY3VycmVudE5vZGUgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFNhbml0aXplIHRhZ3MgYW5kIGVsZW1lbnRzICovXG4gICAgICAgIGlmIChfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFNoYWRvdyBET00gZGV0ZWN0ZWQsIHNhbml0aXplIGl0ICovXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShjdXJyZW50Tm9kZS5jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIENoZWNrIGF0dHJpYnV0ZXMsIHNhbml0aXplIGlmIG5lY2Vzc2FyeSAqL1xuICAgICAgICBfc2FuaXRpemVBdHRyaWJ1dGVzKGN1cnJlbnROb2RlKTtcblxuICAgICAgICBvbGROb2RlID0gY3VycmVudE5vZGU7XG4gICAgICB9XG5cbiAgICAgIG9sZE5vZGUgPSBudWxsO1xuXG4gICAgICAvKiBJZiB3ZSBzYW5pdGl6ZWQgYGRpcnR5YCBpbi1wbGFjZSwgcmV0dXJuIGl0LiAqL1xuICAgICAgaWYgKElOX1BMQUNFKSB7XG4gICAgICAgIHJldHVybiBkaXJ0eTtcbiAgICAgIH1cblxuICAgICAgLyogUmV0dXJuIHNhbml0aXplZCBzdHJpbmcgb3IgRE9NICovXG4gICAgICBpZiAoUkVUVVJOX0RPTSkge1xuICAgICAgICBpZiAoUkVUVVJOX0RPTV9GUkFHTUVOVCkge1xuICAgICAgICAgIHJldHVybk5vZGUgPSBjcmVhdGVEb2N1bWVudEZyYWdtZW50LmNhbGwoYm9keS5vd25lckRvY3VtZW50KTtcblxuICAgICAgICAgIHdoaWxlIChib2R5LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1kb20tbm9kZS1hcHBlbmRcbiAgICAgICAgICAgIHJldHVybk5vZGUuYXBwZW5kQ2hpbGQoYm9keS5maXJzdENoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGJvZHk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoUkVUVVJOX0RPTV9JTVBPUlQpIHtcbiAgICAgICAgICAvKlxuICAgICAgICAgICAgQWRvcHROb2RlKCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpbnRlcm5hbCBzdGF0ZSBpcyBub3QgcmVzZXRcbiAgICAgICAgICAgIChlLmcuIHRoZSBwYXN0IG5hbWVzIG1hcCBvZiBhIEhUTUxGb3JtRWxlbWVudCksIHRoaXMgaXMgc2FmZVxuICAgICAgICAgICAgaW4gdGhlb3J5IGJ1dCB3ZSB3b3VsZCByYXRoZXIgbm90IHJpc2sgYW5vdGhlciBhdHRhY2sgdmVjdG9yLlxuICAgICAgICAgICAgVGhlIHN0YXRlIHRoYXQgaXMgY2xvbmVkIGJ5IGltcG9ydE5vZGUoKSBpcyBleHBsaWNpdGx5IGRlZmluZWRcbiAgICAgICAgICAgIGJ5IHRoZSBzcGVjcy5cbiAgICAgICAgICAqL1xuICAgICAgICAgIHJldHVybk5vZGUgPSBpbXBvcnROb2RlLmNhbGwob3JpZ2luYWxEb2N1bWVudCwgcmV0dXJuTm9kZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0dXJuTm9kZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNlcmlhbGl6ZWRIVE1MID0gV0hPTEVfRE9DVU1FTlQgPyBib2R5Lm91dGVySFRNTCA6IGJvZHkuaW5uZXJIVE1MO1xuXG4gICAgICAvKiBTYW5pdGl6ZSBmaW5hbCBzdHJpbmcgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICBzZXJpYWxpemVkSFRNTCA9IHN0cmluZ1JlcGxhY2Uoc2VyaWFsaXplZEhUTUwsIE1VU1RBQ0hFX0VYUFIkJDEsICcgJyk7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgRVJCX0VYUFIkJDEsICcgJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVzdGVkVHlwZXNQb2xpY3kgJiYgUkVUVVJOX1RSVVNURURfVFlQRSA/IHRydXN0ZWRUeXBlc1BvbGljeS5jcmVhdGVIVE1MKHNlcmlhbGl6ZWRIVE1MKSA6IHNlcmlhbGl6ZWRIVE1MO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHNldCB0aGUgY29uZmlndXJhdGlvbiBvbmNlXG4gICAgICogc2V0Q29uZmlnXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnNldENvbmZpZyA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICAgIF9wYXJzZUNvbmZpZyhjZmcpO1xuICAgICAgU0VUX0NPTkZJRyA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBjb25maWd1cmF0aW9uXG4gICAgICogY2xlYXJDb25maWdcbiAgICAgKlxuICAgICAqL1xuICAgIERPTVB1cmlmeS5jbGVhckNvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIENPTkZJRyA9IG51bGw7XG4gICAgICBTRVRfQ09ORklHID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gY2hlY2sgaWYgYW4gYXR0cmlidXRlIHZhbHVlIGlzIHZhbGlkLlxuICAgICAqIFVzZXMgbGFzdCBzZXQgY29uZmlnLCBpZiBhbnkuIE90aGVyd2lzZSwgdXNlcyBjb25maWcgZGVmYXVsdHMuXG4gICAgICogaXNWYWxpZEF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB0YWcgVGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gYXR0ciBBdHRyaWJ1dGUgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLlxuICAgICAqL1xuICAgIERPTVB1cmlmeS5pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gKHRhZywgYXR0ciwgdmFsdWUpIHtcbiAgICAgIC8qIEluaXRpYWxpemUgc2hhcmVkIGNvbmZpZyB2YXJzIGlmIG5lY2Vzc2FyeS4gKi9cbiAgICAgIGlmICghQ09ORklHKSB7XG4gICAgICAgIF9wYXJzZUNvbmZpZyh7fSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBsY1RhZyA9IHN0cmluZ1RvTG93ZXJDYXNlKHRhZyk7XG4gICAgICB2YXIgbGNOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoYXR0cik7XG4gICAgICByZXR1cm4gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRIb29rXG4gICAgICogUHVibGljIG1ldGhvZCB0byBhZGQgRE9NUHVyaWZ5IGhvb2tzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gYWRkXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaG9va0Z1bmN0aW9uIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICAgKi9cbiAgICBET01QdXJpZnkuYWRkSG9vayA9IGZ1bmN0aW9uIChlbnRyeVBvaW50LCBob29rRnVuY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgaG9va0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaG9va3NbZW50cnlQb2ludF0gPSBob29rc1tlbnRyeVBvaW50XSB8fCBbXTtcbiAgICAgIGFycmF5UHVzaChob29rc1tlbnRyeVBvaW50XSwgaG9va0Z1bmN0aW9uKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlSG9va1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIGEgRE9NUHVyaWZ5IGhvb2sgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAgICogKHBvcHMgaXQgZnJvbSB0aGUgc3RhY2sgb2YgaG9va3MgaWYgbW9yZSBhcmUgcHJlc2VudClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBET01QdXJpZnkucmVtb3ZlSG9vayA9IGZ1bmN0aW9uIChlbnRyeVBvaW50KSB7XG4gICAgICBpZiAoaG9va3NbZW50cnlQb2ludF0pIHtcbiAgICAgICAgYXJyYXlQb3AoaG9va3NbZW50cnlQb2ludF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVIb29rc1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIGFsbCBET01QdXJpZnkgaG9va3MgYXQgYSBnaXZlbiBlbnRyeVBvaW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rcyB0byByZW1vdmVcbiAgICAgKi9cbiAgICBET01QdXJpZnkucmVtb3ZlSG9va3MgPSBmdW5jdGlvbiAoZW50cnlQb2ludCkge1xuICAgICAgaWYgKGhvb2tzW2VudHJ5UG9pbnRdKSB7XG4gICAgICAgIGhvb2tzW2VudHJ5UG9pbnRdID0gW107XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZUFsbEhvb2tzXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgYWxsIERPTVB1cmlmeSBob29rc1xuICAgICAqXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZUFsbEhvb2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaG9va3MgPSB7fTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIERPTVB1cmlmeTtcbiAgfVxuXG4gIHZhciBwdXJpZnkgPSBjcmVhdGVET01QdXJpZnkoKTtcblxuICByZXR1cm4gcHVyaWZ5O1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdXJpZnkuanMubWFwXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICwgcHJlZml4ID0gJ34nO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIHN0b3JhZ2UgZm9yIG91ciBgRUVgIG9iamVjdHMuXG4gKiBBbiBgRXZlbnRzYCBpbnN0YW5jZSBpcyBhIHBsYWluIG9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBldmVudCBuYW1lcy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cygpIHt9XG5cbi8vXG4vLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuLy8gaW5zdGFuY2UgaW4gdGhpcyB3YXkgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgZGlyZWN0bHkuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG4vLyBvdmVycmlkZGVuIG9yIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vXG5pZiAoT2JqZWN0LmNyZWF0ZSkge1xuICBFdmVudHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvL1xuICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuICAvLyBzb21lIG9sZCBicm93c2VycyBsaWtlIEFuZHJvaWQgNCwgaVBob25lIDUuMSwgT3BlcmEgMTEgYW5kIFNhZmFyaSA1LlxuICAvL1xuICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvbmNlPWZhbHNlXSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCBlbWl0dGVyLCBvbmNlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuICBlbHNlIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0uZm4pIGVtaXR0ZXIuX2V2ZW50c1tldnRdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gW2VtaXR0ZXIuX2V2ZW50c1tldnRdLCBsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIGVtaXR0ZXI7XG59XG5cbi8qKlxuICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG4gIGlmICgtLWVtaXR0ZXIuX2V2ZW50c0NvdW50ID09PSAwKSBlbWl0dGVyLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIGVsc2UgZGVsZXRlIGVtaXR0ZXIuX2V2ZW50c1tldnRdO1xufVxuXG4vKipcbiAqIE1pbmltYWwgYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgdmFyIG5hbWVzID0gW11cbiAgICAsIGV2ZW50c1xuICAgICwgbmFtZTtcblxuICBpZiAodGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcbiAgICBpZiAoaGFzLmNhbGwoZXZlbnRzLCBuYW1lKSkgbmFtZXMucHVzaChwcmVmaXggPyBuYW1lLnNsaWNlKDEpIDogbmFtZSk7XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHJldHVybiBuYW1lcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhldmVudHMpKTtcbiAgfVxuXG4gIHJldHVybiBuYW1lcztcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGhhbmRsZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuICBpZiAoaGFuZGxlcnMuZm4pIHJldHVybiBbaGFuZGxlcnMuZm5dO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoLCBlZSA9IG5ldyBBcnJheShsKTsgaSA8IGw7IGkrKykge1xuICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBsaXN0ZW5pbmcgdG8gYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtYmVyIG9mIGxpc3RlbmVycy5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKCFsaXN0ZW5lcnMpIHJldHVybiAwO1xuICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcbiAgcmV0dXJuIGxpc3RlbmVycy5sZW5ndGg7XG59O1xuXG4vKipcbiAqIENhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGVsc2UgYGZhbHNlYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF1cbiAgICAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGFyZ3NcbiAgICAsIGk7XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgY2FzZSA0OiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyLCBhMyk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBhZGRMaXN0ZW5lcih0aGlzLCBldmVudCwgZm4sIGNvbnRleHQsIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgdGhlIGxpc3RlbmVycyBvZiBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBtYXRjaCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IE9ubHkgcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdGhhdCBoYXZlIHRoaXMgY29udGV4dC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG4gIGlmICghZm4pIHtcbiAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW2V2dF07XG5cbiAgaWYgKGxpc3RlbmVycy5mbikge1xuICAgIGlmIChcbiAgICAgIGxpc3RlbmVycy5mbiA9PT0gZm4gJiZcbiAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcbiAgICAgICghY29udGV4dCB8fCBsaXN0ZW5lcnMuY29udGV4dCA9PT0gY29udGV4dClcbiAgICApIHtcbiAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbGlzdGVuZXJzW2ldLmZuICE9PSBmbiB8fFxuICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG4gICAgICAgIChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBSZXNldCB0aGUgYXJyYXksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMuXG4gICAgLy9cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuICAgIGVsc2UgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBbZXZlbnRdIFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0O1xuXG4gIGlmIChldmVudCkge1xuICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG4gICAgaWYgKHRoaXMuX2V2ZW50c1tldnRdKSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cbi8vXG4vLyBFeHBvc2UgdGhlIHByZWZpeC5cbi8vXG5FdmVudEVtaXR0ZXIucHJlZml4ZWQgPSBwcmVmaXg7XG5cbi8vXG4vLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuLy9cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbi8vXG4vLyBFeHBvc2UgdGhlIG1vZHVsZS5cbi8vXG5pZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtb2R1bGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXHJcbi8vXHJcbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXHJcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcclxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXHJcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcclxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxyXG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcclxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbi8vXHJcbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXHJcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4vL1xyXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXHJcbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcclxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxyXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcclxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXHJcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcclxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcblxyXG52YXIgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcclxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XHJcblxyXG5cclxuLy8gcmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIGFycmF5IHdpdGggZGlyZWN0b3J5IG5hbWVzIHRoZXJlXHJcbi8vIG11c3QgYmUgbm8gc2xhc2hlcyBvciBkZXZpY2UgbmFtZXMgKGM6XFwpIGluIHRoZSBhcnJheVxyXG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcclxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxyXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0cywgYWxsb3dBYm92ZVJvb3QpIHtcclxuICB2YXIgcmVzID0gW107XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgdmFyIHAgPSBwYXJ0c1tpXTtcclxuXHJcbiAgICAvLyBpZ25vcmUgZW1wdHkgcGFydHNcclxuICAgIGlmICghcCB8fCBwID09PSAnLicpXHJcbiAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgIGlmIChwID09PSAnLi4nKSB7XHJcbiAgICAgIGlmIChyZXMubGVuZ3RoICYmIHJlc1tyZXMubGVuZ3RoIC0gMV0gIT09ICcuLicpIHtcclxuICAgICAgICByZXMucG9wKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcclxuICAgICAgICByZXMucHVzaCgnLi4nKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzLnB1c2gocCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzO1xyXG59XHJcblxyXG4vLyByZXR1cm5zIGFuIGFycmF5IHdpdGggZW1wdHkgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIGVpdGhlciBlbmQgb2YgdGhlIGlucHV0XHJcbi8vIGFycmF5IG9yIHRoZSBvcmlnaW5hbCBhcnJheSBpZiBubyBlbGVtZW50cyBuZWVkIHRvIGJlIHJlbW92ZWRcclxuZnVuY3Rpb24gdHJpbUFycmF5KGFycikge1xyXG4gIHZhciBsYXN0SW5kZXggPSBhcnIubGVuZ3RoIC0gMTtcclxuICB2YXIgc3RhcnQgPSAwO1xyXG4gIGZvciAoOyBzdGFydCA8PSBsYXN0SW5kZXg7IHN0YXJ0KyspIHtcclxuICAgIGlmIChhcnJbc3RhcnRdKVxyXG4gICAgICBicmVhaztcclxuICB9XHJcblxyXG4gIHZhciBlbmQgPSBsYXN0SW5kZXg7XHJcbiAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xyXG4gICAgaWYgKGFycltlbmRdKVxyXG4gICAgICBicmVhaztcclxuICB9XHJcblxyXG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGxhc3RJbmRleClcclxuICAgIHJldHVybiBhcnI7XHJcbiAgaWYgKHN0YXJ0ID4gZW5kKVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCArIDEpO1xyXG59XHJcblxyXG4vLyBSZWdleCB0byBzcGxpdCBhIHdpbmRvd3MgcGF0aCBpbnRvIHRocmVlIHBhcnRzOiBbKiwgZGV2aWNlLCBzbGFzaCxcclxuLy8gdGFpbF0gd2luZG93cy1vbmx5XHJcbnZhciBzcGxpdERldmljZVJlID1cclxuICAgIC9eKFthLXpBLVpdOnxbXFxcXFxcL117Mn1bXlxcXFxcXC9dK1tcXFxcXFwvXStbXlxcXFxcXC9dKyk/KFtcXFxcXFwvXSk/KFtcXHNcXFNdKj8pJC87XHJcblxyXG4vLyBSZWdleCB0byBzcGxpdCB0aGUgdGFpbCBwYXJ0IG9mIHRoZSBhYm92ZSBpbnRvIFsqLCBkaXIsIGJhc2VuYW1lLCBleHRdXHJcbnZhciBzcGxpdFRhaWxSZSA9XHJcbiAgICAvXihbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcXFxcXC9dKz98KShcXC5bXi5cXC9cXFxcXSp8KSkoPzpbXFxcXFxcL10qKSQvO1xyXG5cclxudmFyIHdpbjMyID0ge307XHJcblxyXG4vLyBGdW5jdGlvbiB0byBzcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF1cclxuZnVuY3Rpb24gd2luMzJTcGxpdFBhdGgoZmlsZW5hbWUpIHtcclxuICAvLyBTZXBhcmF0ZSBkZXZpY2Urc2xhc2ggZnJvbSB0YWlsXHJcbiAgdmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhmaWxlbmFtZSksXHJcbiAgICAgIGRldmljZSA9IChyZXN1bHRbMV0gfHwgJycpICsgKHJlc3VsdFsyXSB8fCAnJyksXHJcbiAgICAgIHRhaWwgPSByZXN1bHRbM10gfHwgJyc7XHJcbiAgLy8gU3BsaXQgdGhlIHRhaWwgaW50byBkaXIsIGJhc2VuYW1lIGFuZCBleHRlbnNpb25cclxuICB2YXIgcmVzdWx0MiA9IHNwbGl0VGFpbFJlLmV4ZWModGFpbCksXHJcbiAgICAgIGRpciA9IHJlc3VsdDJbMV0sXHJcbiAgICAgIGJhc2VuYW1lID0gcmVzdWx0MlsyXSxcclxuICAgICAgZXh0ID0gcmVzdWx0MlszXTtcclxuICByZXR1cm4gW2RldmljZSwgZGlyLCBiYXNlbmFtZSwgZXh0XTtcclxufVxyXG5cclxuZnVuY3Rpb24gd2luMzJTdGF0UGF0aChwYXRoKSB7XHJcbiAgdmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhwYXRoKSxcclxuICAgICAgZGV2aWNlID0gcmVzdWx0WzFdIHx8ICcnLFxyXG4gICAgICBpc1VuYyA9ICEhZGV2aWNlICYmIGRldmljZVsxXSAhPT0gJzonO1xyXG4gIHJldHVybiB7XHJcbiAgICBkZXZpY2U6IGRldmljZSxcclxuICAgIGlzVW5jOiBpc1VuYyxcclxuICAgIGlzQWJzb2x1dGU6IGlzVW5jIHx8ICEhcmVzdWx0WzJdLCAvLyBVTkMgcGF0aHMgYXJlIGFsd2F5cyBhYnNvbHV0ZVxyXG4gICAgdGFpbDogcmVzdWx0WzNdXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gbm9ybWFsaXplVU5DUm9vdChkZXZpY2UpIHtcclxuICByZXR1cm4gJ1xcXFxcXFxcJyArIGRldmljZS5yZXBsYWNlKC9eW1xcXFxcXC9dKy8sICcnKS5yZXBsYWNlKC9bXFxcXFxcL10rL2csICdcXFxcJyk7XHJcbn1cclxuXHJcbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcclxud2luMzIucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciByZXNvbHZlZERldmljZSA9ICcnLFxyXG4gICAgICByZXNvbHZlZFRhaWwgPSAnJyxcclxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xyXG5cclxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTE7IGktLSkge1xyXG4gICAgdmFyIHBhdGg7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIHBhdGggPSBhcmd1bWVudHNbaV07XHJcbiAgICB9IGVsc2UgaWYgKCFyZXNvbHZlZERldmljZSkge1xyXG4gICAgICBwYXRoID0gcHJvY2Vzcy5jd2QoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFdpbmRvd3MgaGFzIHRoZSBjb25jZXB0IG9mIGRyaXZlLXNwZWNpZmljIGN1cnJlbnQgd29ya2luZ1xyXG4gICAgICAvLyBkaXJlY3Rvcmllcy4gSWYgd2UndmUgcmVzb2x2ZWQgYSBkcml2ZSBsZXR0ZXIgYnV0IG5vdCB5ZXQgYW5cclxuICAgICAgLy8gYWJzb2x1dGUgcGF0aCwgZ2V0IGN3ZCBmb3IgdGhhdCBkcml2ZS4gV2UncmUgc3VyZSB0aGUgZGV2aWNlIGlzIG5vdFxyXG4gICAgICAvLyBhbiB1bmMgcGF0aCBhdCB0aGlzIHBvaW50cywgYmVjYXVzZSB1bmMgcGF0aHMgYXJlIGFsd2F5cyBhYnNvbHV0ZS5cclxuICAgICAgcGF0aCA9IHByb2Nlc3MuZW52Wyc9JyArIHJlc29sdmVkRGV2aWNlXTtcclxuICAgICAgLy8gVmVyaWZ5IHRoYXQgYSBkcml2ZS1sb2NhbCBjd2Qgd2FzIGZvdW5kIGFuZCB0aGF0IGl0IGFjdHVhbGx5IHBvaW50c1xyXG4gICAgICAvLyB0byBvdXIgZHJpdmUuIElmIG5vdCwgZGVmYXVsdCB0byB0aGUgZHJpdmUncyByb290LlxyXG4gICAgICBpZiAoIXBhdGggfHwgcGF0aC5zdWJzdHIoMCwgMykudG9Mb3dlckNhc2UoKSAhPT1cclxuICAgICAgICAgIHJlc29sdmVkRGV2aWNlLnRvTG93ZXJDYXNlKCkgKyAnXFxcXCcpIHtcclxuICAgICAgICBwYXRoID0gcmVzb2x2ZWREZXZpY2UgKyAnXFxcXCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcclxuICAgIGlmICghdXRpbC5pc1N0cmluZyhwYXRoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVzdWx0ID0gd2luMzJTdGF0UGF0aChwYXRoKSxcclxuICAgICAgICBkZXZpY2UgPSByZXN1bHQuZGV2aWNlLFxyXG4gICAgICAgIGlzVW5jID0gcmVzdWx0LmlzVW5jLFxyXG4gICAgICAgIGlzQWJzb2x1dGUgPSByZXN1bHQuaXNBYnNvbHV0ZSxcclxuICAgICAgICB0YWlsID0gcmVzdWx0LnRhaWw7XHJcblxyXG4gICAgaWYgKGRldmljZSAmJlxyXG4gICAgICAgIHJlc29sdmVkRGV2aWNlICYmXHJcbiAgICAgICAgZGV2aWNlLnRvTG93ZXJDYXNlKCkgIT09IHJlc29sdmVkRGV2aWNlLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgLy8gVGhpcyBwYXRoIHBvaW50cyB0byBhbm90aGVyIGRldmljZSBzbyBpdCBpcyBub3QgYXBwbGljYWJsZVxyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXJlc29sdmVkRGV2aWNlKSB7XHJcbiAgICAgIHJlc29sdmVkRGV2aWNlID0gZGV2aWNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFyZXNvbHZlZEFic29sdXRlKSB7XHJcbiAgICAgIHJlc29sdmVkVGFpbCA9IHRhaWwgKyAnXFxcXCcgKyByZXNvbHZlZFRhaWw7XHJcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBpc0Fic29sdXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNvbHZlZERldmljZSAmJiByZXNvbHZlZEFic29sdXRlKSB7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ29udmVydCBzbGFzaGVzIHRvIGJhY2tzbGFzaGVzIHdoZW4gYHJlc29sdmVkRGV2aWNlYCBwb2ludHMgdG8gYW4gVU5DXHJcbiAgLy8gcm9vdC4gQWxzbyBzcXVhc2ggbXVsdGlwbGUgc2xhc2hlcyBpbnRvIGEgc2luZ2xlIG9uZSB3aGVyZSBhcHByb3ByaWF0ZS5cclxuICBpZiAoaXNVbmMpIHtcclxuICAgIHJlc29sdmVkRGV2aWNlID0gbm9ybWFsaXplVU5DUm9vdChyZXNvbHZlZERldmljZSk7XHJcbiAgfVxyXG5cclxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCxcclxuICAvLyBidXQgaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKClcclxuICAvLyBmYWlscylcclxuXHJcbiAgLy8gTm9ybWFsaXplIHRoZSB0YWlsIHBhdGhcclxuICByZXNvbHZlZFRhaWwgPSBub3JtYWxpemVBcnJheShyZXNvbHZlZFRhaWwuc3BsaXQoL1tcXFxcXFwvXSsvKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignXFxcXCcpO1xyXG5cclxuICByZXR1cm4gKHJlc29sdmVkRGV2aWNlICsgKHJlc29sdmVkQWJzb2x1dGUgPyAnXFxcXCcgOiAnJykgKyByZXNvbHZlZFRhaWwpIHx8XHJcbiAgICAgICAgICcuJztcclxufTtcclxuXHJcblxyXG53aW4zMi5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgdmFyIHJlc3VsdCA9IHdpbjMyU3RhdFBhdGgocGF0aCksXHJcbiAgICAgIGRldmljZSA9IHJlc3VsdC5kZXZpY2UsXHJcbiAgICAgIGlzVW5jID0gcmVzdWx0LmlzVW5jLFxyXG4gICAgICBpc0Fic29sdXRlID0gcmVzdWx0LmlzQWJzb2x1dGUsXHJcbiAgICAgIHRhaWwgPSByZXN1bHQudGFpbCxcclxuICAgICAgdHJhaWxpbmdTbGFzaCA9IC9bXFxcXFxcL10kLy50ZXN0KHRhaWwpO1xyXG5cclxuICAvLyBOb3JtYWxpemUgdGhlIHRhaWwgcGF0aFxyXG4gIHRhaWwgPSBub3JtYWxpemVBcnJheSh0YWlsLnNwbGl0KC9bXFxcXFxcL10rLyksICFpc0Fic29sdXRlKS5qb2luKCdcXFxcJyk7XHJcblxyXG4gIGlmICghdGFpbCAmJiAhaXNBYnNvbHV0ZSkge1xyXG4gICAgdGFpbCA9ICcuJztcclxuICB9XHJcbiAgaWYgKHRhaWwgJiYgdHJhaWxpbmdTbGFzaCkge1xyXG4gICAgdGFpbCArPSAnXFxcXCc7XHJcbiAgfVxyXG5cclxuICAvLyBDb252ZXJ0IHNsYXNoZXMgdG8gYmFja3NsYXNoZXMgd2hlbiBgZGV2aWNlYCBwb2ludHMgdG8gYW4gVU5DIHJvb3QuXHJcbiAgLy8gQWxzbyBzcXVhc2ggbXVsdGlwbGUgc2xhc2hlcyBpbnRvIGEgc2luZ2xlIG9uZSB3aGVyZSBhcHByb3ByaWF0ZS5cclxuICBpZiAoaXNVbmMpIHtcclxuICAgIGRldmljZSA9IG5vcm1hbGl6ZVVOQ1Jvb3QoZGV2aWNlKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkZXZpY2UgKyAoaXNBYnNvbHV0ZSA/ICdcXFxcJyA6ICcnKSArIHRhaWw7XHJcbn07XHJcblxyXG5cclxud2luMzIuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICByZXR1cm4gd2luMzJTdGF0UGF0aChwYXRoKS5pc0Fic29sdXRlO1xyXG59O1xyXG5cclxud2luMzIuam9pbiA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBwYXRocyA9IFtdO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xyXG4gICAgaWYgKCF1dGlsLmlzU3RyaW5nKGFyZykpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcclxuICAgIH1cclxuICAgIGlmIChhcmcpIHtcclxuICAgICAgcGF0aHMucHVzaChhcmcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFyIGpvaW5lZCA9IHBhdGhzLmpvaW4oJ1xcXFwnKTtcclxuXHJcbiAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGpvaW5lZCBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0d28gc2xhc2hlcywgYmVjYXVzZVxyXG4gIC8vIG5vcm1hbGl6ZSgpIHdpbGwgbWlzdGFrZSBpdCBmb3IgYW4gVU5DIHBhdGggdGhlbi5cclxuICAvL1xyXG4gIC8vIFRoaXMgc3RlcCBpcyBza2lwcGVkIHdoZW4gaXQgaXMgdmVyeSBjbGVhciB0aGF0IHRoZSB1c2VyIGFjdHVhbGx5XHJcbiAgLy8gaW50ZW5kZWQgdG8gcG9pbnQgYXQgYW4gVU5DIHBhdGguIFRoaXMgaXMgYXNzdW1lZCB3aGVuIHRoZSBmaXJzdFxyXG4gIC8vIG5vbi1lbXB0eSBzdHJpbmcgYXJndW1lbnRzIHN0YXJ0cyB3aXRoIGV4YWN0bHkgdHdvIHNsYXNoZXMgZm9sbG93ZWQgYnlcclxuICAvLyBhdCBsZWFzdCBvbmUgbW9yZSBub24tc2xhc2ggY2hhcmFjdGVyLlxyXG4gIC8vXHJcbiAgLy8gTm90ZSB0aGF0IGZvciBub3JtYWxpemUoKSB0byB0cmVhdCBhIHBhdGggYXMgYW4gVU5DIHBhdGggaXQgbmVlZHMgdG9cclxuICAvLyBoYXZlIGF0IGxlYXN0IDIgY29tcG9uZW50cywgc28gd2UgZG9uJ3QgZmlsdGVyIGZvciB0aGF0IGhlcmUuXHJcbiAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSB1c2VyIGNhbiB1c2Ugam9pbiB0byBjb25zdHJ1Y3QgVU5DIHBhdGhzIGZyb21cclxuICAvLyBhIHNlcnZlciBuYW1lIGFuZCBhIHNoYXJlIG5hbWU7IGZvciBleGFtcGxlOlxyXG4gIC8vICAgcGF0aC5qb2luKCcvL3NlcnZlcicsICdzaGFyZScpIC0+ICdcXFxcXFxcXHNlcnZlclxcXFxzaGFyZVxcJylcclxuICBpZiAoIS9eW1xcXFxcXC9dezJ9W15cXFxcXFwvXS8udGVzdChwYXRoc1swXSkpIHtcclxuICAgIGpvaW5lZCA9IGpvaW5lZC5yZXBsYWNlKC9eW1xcXFxcXC9dezIsfS8sICdcXFxcJyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gd2luMzIubm9ybWFsaXplKGpvaW5lZCk7XHJcbn07XHJcblxyXG5cclxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcclxuLy8gaXQgd2lsbCBzb2x2ZSB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tICdmcm9tJyB0byAndG8nLCBmb3IgaW5zdGFuY2U6XHJcbi8vIGZyb20gPSAnQzpcXFxcb3JhbmRlYVxcXFx0ZXN0XFxcXGFhYSdcclxuLy8gdG8gPSAnQzpcXFxcb3JhbmRlYVxcXFxpbXBsXFxcXGJiYidcclxuLy8gVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlOiAnLi5cXFxcLi5cXFxcaW1wbFxcXFxiYmInXHJcbndpbjMyLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcclxuICBmcm9tID0gd2luMzIucmVzb2x2ZShmcm9tKTtcclxuICB0byA9IHdpbjMyLnJlc29sdmUodG8pO1xyXG5cclxuICAvLyB3aW5kb3dzIGlzIG5vdCBjYXNlIHNlbnNpdGl2ZVxyXG4gIHZhciBsb3dlckZyb20gPSBmcm9tLnRvTG93ZXJDYXNlKCk7XHJcbiAgdmFyIGxvd2VyVG8gPSB0by50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICB2YXIgdG9QYXJ0cyA9IHRyaW1BcnJheSh0by5zcGxpdCgnXFxcXCcpKTtcclxuXHJcbiAgdmFyIGxvd2VyRnJvbVBhcnRzID0gdHJpbUFycmF5KGxvd2VyRnJvbS5zcGxpdCgnXFxcXCcpKTtcclxuICB2YXIgbG93ZXJUb1BhcnRzID0gdHJpbUFycmF5KGxvd2VyVG8uc3BsaXQoJ1xcXFwnKSk7XHJcblxyXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihsb3dlckZyb21QYXJ0cy5sZW5ndGgsIGxvd2VyVG9QYXJ0cy5sZW5ndGgpO1xyXG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgaWYgKGxvd2VyRnJvbVBhcnRzW2ldICE9PSBsb3dlclRvUGFydHNbaV0pIHtcclxuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpZiAoc2FtZVBhcnRzTGVuZ3RoID09IDApIHtcclxuICAgIHJldHVybiB0bztcclxuICB9XHJcblxyXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xyXG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBsb3dlckZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcclxuICB9XHJcblxyXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XHJcblxyXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCdcXFxcJyk7XHJcbn07XHJcblxyXG5cclxud2luMzIuX21ha2VMb25nID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIC8vIE5vdGU6IHRoaXMgd2lsbCAqcHJvYmFibHkqIHRocm93IHNvbWV3aGVyZS5cclxuICBpZiAoIXV0aWwuaXNTdHJpbmcocGF0aCkpXHJcbiAgICByZXR1cm4gcGF0aDtcclxuXHJcbiAgaWYgKCFwYXRoKSB7XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICB2YXIgcmVzb2x2ZWRQYXRoID0gd2luMzIucmVzb2x2ZShwYXRoKTtcclxuXHJcbiAgaWYgKC9eW2EtekEtWl1cXDpcXFxcLy50ZXN0KHJlc29sdmVkUGF0aCkpIHtcclxuICAgIC8vIHBhdGggaXMgbG9jYWwgZmlsZXN5c3RlbSBwYXRoLCB3aGljaCBuZWVkcyB0byBiZSBjb252ZXJ0ZWRcclxuICAgIC8vIHRvIGxvbmcgVU5DIHBhdGguXHJcbiAgICByZXR1cm4gJ1xcXFxcXFxcP1xcXFwnICsgcmVzb2x2ZWRQYXRoO1xyXG4gIH0gZWxzZSBpZiAoL15cXFxcXFxcXFtePy5dLy50ZXN0KHJlc29sdmVkUGF0aCkpIHtcclxuICAgIC8vIHBhdGggaXMgbmV0d29yayBVTkMgcGF0aCwgd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkXHJcbiAgICAvLyB0byBsb25nIFVOQyBwYXRoLlxyXG4gICAgcmV0dXJuICdcXFxcXFxcXD9cXFxcVU5DXFxcXCcgKyByZXNvbHZlZFBhdGguc3Vic3RyaW5nKDIpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBhdGg7XHJcbn07XHJcblxyXG5cclxud2luMzIuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICB2YXIgcmVzdWx0ID0gd2luMzJTcGxpdFBhdGgocGF0aCksXHJcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXHJcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcclxuXHJcbiAgaWYgKCFyb290ICYmICFkaXIpIHtcclxuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxyXG4gICAgcmV0dXJuICcuJztcclxuICB9XHJcblxyXG4gIGlmIChkaXIpIHtcclxuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXHJcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByb290ICsgZGlyO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XHJcbiAgdmFyIGYgPSB3aW4zMlNwbGl0UGF0aChwYXRoKVsyXTtcclxuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XHJcbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcclxuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xyXG4gIH1cclxuICByZXR1cm4gZjtcclxufTtcclxuXHJcblxyXG53aW4zMi5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHJldHVybiB3aW4zMlNwbGl0UGF0aChwYXRoKVszXTtcclxufTtcclxuXHJcblxyXG53aW4zMi5mb3JtYXQgPSBmdW5jdGlvbihwYXRoT2JqZWN0KSB7XHJcbiAgaWYgKCF1dGlsLmlzT2JqZWN0KHBhdGhPYmplY3QpKSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoT2JqZWN0JyBtdXN0IGJlIGFuIG9iamVjdCwgbm90IFwiICsgdHlwZW9mIHBhdGhPYmplY3RcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB2YXIgcm9vdCA9IHBhdGhPYmplY3Qucm9vdCB8fCAnJztcclxuXHJcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHJvb3QpKSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgIFwiJ3BhdGhPYmplY3Qucm9vdCcgbXVzdCBiZSBhIHN0cmluZyBvciB1bmRlZmluZWQsIG5vdCBcIiArXHJcbiAgICAgICAgdHlwZW9mIHBhdGhPYmplY3Qucm9vdFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhciBkaXIgPSBwYXRoT2JqZWN0LmRpcjtcclxuICB2YXIgYmFzZSA9IHBhdGhPYmplY3QuYmFzZSB8fCAnJztcclxuICBpZiAoIWRpcikge1xyXG4gICAgcmV0dXJuIGJhc2U7XHJcbiAgfVxyXG4gIGlmIChkaXJbZGlyLmxlbmd0aCAtIDFdID09PSB3aW4zMi5zZXApIHtcclxuICAgIHJldHVybiBkaXIgKyBiYXNlO1xyXG4gIH1cclxuICByZXR1cm4gZGlyICsgd2luMzIuc2VwICsgYmFzZTtcclxufTtcclxuXHJcblxyXG53aW4zMi5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcclxuICBpZiAoIXV0aWwuaXNTdHJpbmcocGF0aFN0cmluZykpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCJQYXJhbWV0ZXIgJ3BhdGhTdHJpbmcnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiBwYXRoU3RyaW5nXHJcbiAgICApO1xyXG4gIH1cclxuICB2YXIgYWxsUGFydHMgPSB3aW4zMlNwbGl0UGF0aChwYXRoU3RyaW5nKTtcclxuICBpZiAoIWFsbFBhcnRzIHx8IGFsbFBhcnRzLmxlbmd0aCAhPT0gNCkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgcm9vdDogYWxsUGFydHNbMF0sXHJcbiAgICBkaXI6IGFsbFBhcnRzWzBdICsgYWxsUGFydHNbMV0uc2xpY2UoMCwgLTEpLFxyXG4gICAgYmFzZTogYWxsUGFydHNbMl0sXHJcbiAgICBleHQ6IGFsbFBhcnRzWzNdLFxyXG4gICAgbmFtZTogYWxsUGFydHNbMl0uc2xpY2UoMCwgYWxsUGFydHNbMl0ubGVuZ3RoIC0gYWxsUGFydHNbM10ubGVuZ3RoKVxyXG4gIH07XHJcbn07XHJcblxyXG5cclxud2luMzIuc2VwID0gJ1xcXFwnO1xyXG53aW4zMi5kZWxpbWl0ZXIgPSAnOyc7XHJcblxyXG5cclxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cclxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cclxudmFyIHNwbGl0UGF0aFJlID1cclxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xyXG52YXIgcG9zaXggPSB7fTtcclxuXHJcblxyXG5mdW5jdGlvbiBwb3NpeFNwbGl0UGF0aChmaWxlbmFtZSkge1xyXG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcclxufVxyXG5cclxuXHJcbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcclxuLy8gcG9zaXggdmVyc2lvblxyXG5wb3NpeC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxyXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XHJcblxyXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XHJcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcclxuXHJcbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcclxuICAgIGlmICghdXRpbC5pc1N0cmluZyhwYXRoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xyXG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGhbMF0gPT09ICcvJztcclxuICB9XHJcblxyXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcclxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcclxuXHJcbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXHJcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcclxuXHJcbiAgcmV0dXJuICgocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCkgfHwgJy4nO1xyXG59O1xyXG5cclxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcclxuLy8gcG9zaXggdmVyc2lvblxyXG5wb3NpeC5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgdmFyIGlzQWJzb2x1dGUgPSBwb3NpeC5pc0Fic29sdXRlKHBhdGgpLFxyXG4gICAgICB0cmFpbGluZ1NsYXNoID0gcGF0aCAmJiBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09ICcvJztcclxuXHJcbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXHJcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KHBhdGguc3BsaXQoJy8nKSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcclxuXHJcbiAgaWYgKCFwYXRoICYmICFpc0Fic29sdXRlKSB7XHJcbiAgICBwYXRoID0gJy4nO1xyXG4gIH1cclxuICBpZiAocGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XHJcbiAgICBwYXRoICs9ICcvJztcclxuICB9XHJcblxyXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XHJcbn07XHJcblxyXG4vLyBwb3NpeCB2ZXJzaW9uXHJcbnBvc2l4LmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XHJcbn07XHJcblxyXG4vLyBwb3NpeCB2ZXJzaW9uXHJcbnBvc2l4LmpvaW4gPSBmdW5jdGlvbigpIHtcclxuICB2YXIgcGF0aCA9ICcnO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICB2YXIgc2VnbWVudCA9IGFyZ3VtZW50c1tpXTtcclxuICAgIGlmICghdXRpbC5pc1N0cmluZyhzZWdtZW50KSkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHNlZ21lbnQpIHtcclxuICAgICAgaWYgKCFwYXRoKSB7XHJcbiAgICAgICAgcGF0aCArPSBzZWdtZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhdGggKz0gJy8nICsgc2VnbWVudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcG9zaXgubm9ybWFsaXplKHBhdGgpO1xyXG59O1xyXG5cclxuXHJcbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXHJcbi8vIHBvc2l4IHZlcnNpb25cclxucG9zaXgucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xyXG4gIGZyb20gPSBwb3NpeC5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcclxuICB0byA9IHBvc2l4LnJlc29sdmUodG8pLnN1YnN0cigxKTtcclxuXHJcbiAgdmFyIGZyb21QYXJ0cyA9IHRyaW1BcnJheShmcm9tLnNwbGl0KCcvJykpO1xyXG4gIHZhciB0b1BhcnRzID0gdHJpbUFycmF5KHRvLnNwbGl0KCcvJykpO1xyXG5cclxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xyXG4gIHZhciBzYW1lUGFydHNMZW5ndGggPSBsZW5ndGg7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xyXG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xyXG4gIGZvciAodmFyIGkgPSBzYW1lUGFydHNMZW5ndGg7IGkgPCBmcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XHJcbiAgfVxyXG5cclxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xyXG5cclxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignLycpO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4Ll9tYWtlTG9uZyA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICByZXR1cm4gcGF0aDtcclxufTtcclxuXHJcblxyXG5wb3NpeC5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHZhciByZXN1bHQgPSBwb3NpeFNwbGl0UGF0aChwYXRoKSxcclxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcclxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xyXG5cclxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xyXG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXHJcbiAgICByZXR1cm4gJy4nO1xyXG4gIH1cclxuXHJcbiAgaWYgKGRpcikge1xyXG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcclxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJvb3QgKyBkaXI7XHJcbn07XHJcblxyXG5cclxucG9zaXguYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcclxuICB2YXIgZiA9IHBvc2l4U3BsaXRQYXRoKHBhdGgpWzJdO1xyXG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cclxuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xyXG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XHJcbiAgfVxyXG4gIHJldHVybiBmO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgcmV0dXJuIHBvc2l4U3BsaXRQYXRoKHBhdGgpWzNdO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LmZvcm1hdCA9IGZ1bmN0aW9uKHBhdGhPYmplY3QpIHtcclxuICBpZiAoIXV0aWwuaXNPYmplY3QocGF0aE9iamVjdCkpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCJQYXJhbWV0ZXIgJ3BhdGhPYmplY3QnIG11c3QgYmUgYW4gb2JqZWN0LCBub3QgXCIgKyB0eXBlb2YgcGF0aE9iamVjdFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhciByb290ID0gcGF0aE9iamVjdC5yb290IHx8ICcnO1xyXG5cclxuICBpZiAoIXV0aWwuaXNTdHJpbmcocm9vdCkpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCIncGF0aE9iamVjdC5yb290JyBtdXN0IGJlIGEgc3RyaW5nIG9yIHVuZGVmaW5lZCwgbm90IFwiICtcclxuICAgICAgICB0eXBlb2YgcGF0aE9iamVjdC5yb290XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFyIGRpciA9IHBhdGhPYmplY3QuZGlyID8gcGF0aE9iamVjdC5kaXIgKyBwb3NpeC5zZXAgOiAnJztcclxuICB2YXIgYmFzZSA9IHBhdGhPYmplY3QuYmFzZSB8fCAnJztcclxuICByZXR1cm4gZGlyICsgYmFzZTtcclxufTtcclxuXHJcblxyXG5wb3NpeC5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcclxuICBpZiAoIXV0aWwuaXNTdHJpbmcocGF0aFN0cmluZykpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCJQYXJhbWV0ZXIgJ3BhdGhTdHJpbmcnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiBwYXRoU3RyaW5nXHJcbiAgICApO1xyXG4gIH1cclxuICB2YXIgYWxsUGFydHMgPSBwb3NpeFNwbGl0UGF0aChwYXRoU3RyaW5nKTtcclxuICBpZiAoIWFsbFBhcnRzIHx8IGFsbFBhcnRzLmxlbmd0aCAhPT0gNCkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xyXG4gIH1cclxuICBhbGxQYXJ0c1sxXSA9IGFsbFBhcnRzWzFdIHx8ICcnO1xyXG4gIGFsbFBhcnRzWzJdID0gYWxsUGFydHNbMl0gfHwgJyc7XHJcbiAgYWxsUGFydHNbM10gPSBhbGxQYXJ0c1szXSB8fCAnJztcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHJvb3Q6IGFsbFBhcnRzWzBdLFxyXG4gICAgZGlyOiBhbGxQYXJ0c1swXSArIGFsbFBhcnRzWzFdLnNsaWNlKDAsIC0xKSxcclxuICAgIGJhc2U6IGFsbFBhcnRzWzJdLFxyXG4gICAgZXh0OiBhbGxQYXJ0c1szXSxcclxuICAgIG5hbWU6IGFsbFBhcnRzWzJdLnNsaWNlKDAsIGFsbFBhcnRzWzJdLmxlbmd0aCAtIGFsbFBhcnRzWzNdLmxlbmd0aClcclxuICB9O1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LnNlcCA9ICcvJztcclxucG9zaXguZGVsaW1pdGVyID0gJzonO1xyXG5cclxuXHJcbmlmIChpc1dpbmRvd3MpXHJcbiAgbW9kdWxlLmV4cG9ydHMgPSB3aW4zMjtcclxuZWxzZSAvKiBwb3NpeCAqL1xyXG4gIG1vZHVsZS5leHBvcnRzID0gcG9zaXg7XHJcblxyXG5tb2R1bGUuZXhwb3J0cy5wb3NpeCA9IHBvc2l4O1xyXG5tb2R1bGUuZXhwb3J0cy53aW4zMiA9IHdpbjMyO1xyXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiLyoqXG4gKiBTb3VyY2U6IGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvVUNEL2xhdGVzdC91Y2QvU3BlY2lhbENhc2luZy50eHRcbiAqL1xudmFyIFNVUFBPUlRFRF9MT0NBTEUgPSB7XG4gICAgdHI6IHtcbiAgICAgICAgcmVnZXhwOiAvXFx1MDEzMHxcXHUwMDQ5fFxcdTAwNDlcXHUwMzA3L2csXG4gICAgICAgIG1hcDoge1xuICAgICAgICAgICAgxLA6IFwiXFx1MDA2OVwiLFxuICAgICAgICAgICAgSTogXCJcXHUwMTMxXCIsXG4gICAgICAgICAgICBJzIc6IFwiXFx1MDA2OVwiLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgYXo6IHtcbiAgICAgICAgcmVnZXhwOiAvXFx1MDEzMC9nLFxuICAgICAgICBtYXA6IHtcbiAgICAgICAgICAgIMSwOiBcIlxcdTAwNjlcIixcbiAgICAgICAgICAgIEk6IFwiXFx1MDEzMVwiLFxuICAgICAgICAgICAgScyHOiBcIlxcdTAwNjlcIixcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIGx0OiB7XG4gICAgICAgIHJlZ2V4cDogL1xcdTAwNDl8XFx1MDA0QXxcXHUwMTJFfFxcdTAwQ0N8XFx1MDBDRHxcXHUwMTI4L2csXG4gICAgICAgIG1hcDoge1xuICAgICAgICAgICAgSTogXCJcXHUwMDY5XFx1MDMwN1wiLFxuICAgICAgICAgICAgSjogXCJcXHUwMDZBXFx1MDMwN1wiLFxuICAgICAgICAgICAgxK46IFwiXFx1MDEyRlxcdTAzMDdcIixcbiAgICAgICAgICAgIMOMOiBcIlxcdTAwNjlcXHUwMzA3XFx1MDMwMFwiLFxuICAgICAgICAgICAgw406IFwiXFx1MDA2OVxcdTAzMDdcXHUwMzAxXCIsXG4gICAgICAgICAgICDEqDogXCJcXHUwMDY5XFx1MDMwN1xcdTAzMDNcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbi8qKlxuICogTG9jYWxpemVkIGxvd2VyIGNhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbGVMb3dlckNhc2Uoc3RyLCBsb2NhbGUpIHtcbiAgICB2YXIgbGFuZyA9IFNVUFBPUlRFRF9MT0NBTEVbbG9jYWxlLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChsYW5nKVxuICAgICAgICByZXR1cm4gbG93ZXJDYXNlKHN0ci5yZXBsYWNlKGxhbmcucmVnZXhwLCBmdW5jdGlvbiAobSkgeyByZXR1cm4gbGFuZy5tYXBbbV07IH0pKTtcbiAgICByZXR1cm4gbG93ZXJDYXNlKHN0cik7XG59XG4vKipcbiAqIExvd2VyIGNhc2UgYXMgYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBsb3dlckNhc2UgfSBmcm9tIFwibG93ZXItY2FzZVwiO1xuLy8gU3VwcG9ydCBjYW1lbCBjYXNlIChcImNhbWVsQ2FzZVwiIC0+IFwiY2FtZWwgQ2FzZVwiIGFuZCBcIkNBTUVMQ2FzZVwiIC0+IFwiQ0FNRUwgQ2FzZVwiKS5cbnZhciBERUZBVUxUX1NQTElUX1JFR0VYUCA9IFsvKFthLXowLTldKShbQS1aXSkvZywgLyhbQS1aXSkoW0EtWl1bYS16XSkvZ107XG4vLyBSZW1vdmUgYWxsIG5vbi13b3JkIGNoYXJhY3RlcnMuXG52YXIgREVGQVVMVF9TVFJJUF9SRUdFWFAgPSAvW15BLVowLTldKy9naTtcbi8qKlxuICogTm9ybWFsaXplIHRoZSBzdHJpbmcgaW50byBzb21ldGhpbmcgb3RoZXIgbGlicmFyaWVzIGNhbiBtYW5pcHVsYXRlIGVhc2llci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vQ2FzZShpbnB1dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIF9hID0gb3B0aW9ucy5zcGxpdFJlZ2V4cCwgc3BsaXRSZWdleHAgPSBfYSA9PT0gdm9pZCAwID8gREVGQVVMVF9TUExJVF9SRUdFWFAgOiBfYSwgX2IgPSBvcHRpb25zLnN0cmlwUmVnZXhwLCBzdHJpcFJlZ2V4cCA9IF9iID09PSB2b2lkIDAgPyBERUZBVUxUX1NUUklQX1JFR0VYUCA6IF9iLCBfYyA9IG9wdGlvbnMudHJhbnNmb3JtLCB0cmFuc2Zvcm0gPSBfYyA9PT0gdm9pZCAwID8gbG93ZXJDYXNlIDogX2MsIF9kID0gb3B0aW9ucy5kZWxpbWl0ZXIsIGRlbGltaXRlciA9IF9kID09PSB2b2lkIDAgPyBcIiBcIiA6IF9kO1xuICAgIHZhciByZXN1bHQgPSByZXBsYWNlKHJlcGxhY2UoaW5wdXQsIHNwbGl0UmVnZXhwLCBcIiQxXFwwJDJcIiksIHN0cmlwUmVnZXhwLCBcIlxcMFwiKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIHZhciBlbmQgPSByZXN1bHQubGVuZ3RoO1xuICAgIC8vIFRyaW0gdGhlIGRlbGltaXRlciBmcm9tIGFyb3VuZCB0aGUgb3V0cHV0IHN0cmluZy5cbiAgICB3aGlsZSAocmVzdWx0LmNoYXJBdChzdGFydCkgPT09IFwiXFwwXCIpXG4gICAgICAgIHN0YXJ0Kys7XG4gICAgd2hpbGUgKHJlc3VsdC5jaGFyQXQoZW5kIC0gMSkgPT09IFwiXFwwXCIpXG4gICAgICAgIGVuZC0tO1xuICAgIC8vIFRyYW5zZm9ybSBlYWNoIHRva2VuIGluZGVwZW5kZW50bHkuXG4gICAgcmV0dXJuIHJlc3VsdC5zbGljZShzdGFydCwgZW5kKS5zcGxpdChcIlxcMFwiKS5tYXAodHJhbnNmb3JtKS5qb2luKGRlbGltaXRlcik7XG59XG4vKipcbiAqIFJlcGxhY2UgYHJlYCBpbiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlIHJlcGxhY2VtZW50IHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXBsYWNlKGlucHV0LCByZSwgdmFsdWUpIHtcbiAgICBpZiAocmUgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHJlLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHJlLnJlZHVjZShmdW5jdGlvbiAoaW5wdXQsIHJlKSB7IHJldHVybiBpbnB1dC5yZXBsYWNlKHJlLCB2YWx1ZSk7IH0sIGlucHV0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkb3RDYXNlIH0gZnJvbSBcImRvdC1jYXNlXCI7XG5leHBvcnQgZnVuY3Rpb24gc25ha2VDYXNlKGlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICByZXR1cm4gZG90Q2FzZShpbnB1dCwgX19hc3NpZ24oeyBkZWxpbWl0ZXI6IFwiX1wiIH0sIG9wdGlvbnMpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBub0Nhc2UgfSBmcm9tIFwibm8tY2FzZVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGRvdENhc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHJldHVybiBub0Nhc2UoaW5wdXQsIF9fYXNzaWduKHsgZGVsaW1pdGVyOiBcIi5cIiB9LCBvcHRpb25zKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBzbmFrZUNhc2UgfSBmcm9tICdzbmFrZS1jYXNlJztcbmltcG9ydCAqIGFzIG5vZGVQYXRoIGZyb20gJ3BhdGgnO1xuZXhwb3J0IGNvbnN0IHBhdGggPSBuYXZpZ2F0b3IucGxhdGZvcm0udG9Mb3dlckNhc2UoKSA9PT0gJ3dpbjMyJyA/IG5vZGVQYXRoLndpbjMyIDogbm9kZVBhdGgucG9zaXg7XG5leHBvcnQgY29uc3QgSVNfREVWID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG5leHBvcnQgY29uc3QgUFJPVE9DT0xfRklMRSA9ICdmaWxlOi8vJztcbmV4cG9ydCBjb25zdCBQUk9UT0NPTF9MU1AgPSAnbHNwOi8vJztcbmV4cG9ydCBjb25zdCBVUkxfTFNQID0gUFJPVE9DT0xfTFNQICsgJ2xvZ3NlcS5pby8nO1xubGV0IF9hcHBQYXRoUm9vdDtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcHBQYXRoUm9vdCgpIHtcbiAgICBpZiAoX2FwcFBhdGhSb290KSB7XG4gICAgICAgIHJldHVybiBfYXBwUGF0aFJvb3Q7XG4gICAgfVxuICAgIHJldHVybiAoX2FwcFBhdGhSb290ID1cbiAgICAgICAgYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdfY2FsbEFwcGxpY2F0aW9uJywgJ2dldEFwcFBhdGgnKSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U0RLUGF0aFJvb3QoKSB7XG4gICAgaWYgKElTX0RFVikge1xuICAgICAgICAvLyBUT0RPOiBjYWNoZSBpbiBwcmVmZXJlbmNlIGZpbGVcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdMU1BfREVWX1NES19ST09UJykgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MCc7XG4gICAgfVxuICAgIGNvbnN0IGFwcFBhdGhSb290ID0gYXdhaXQgZ2V0QXBwUGF0aFJvb3QoKTtcbiAgICByZXR1cm4gc2FmZXR5UGF0aEpvaW4oYXBwUGF0aFJvb3QsICdqcycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGl0ZW0pIHtcbiAgICByZXR1cm4gKGl0ZW0gPT09IE9iamVjdChpdGVtKSAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgLi4uc291cmNlcykge1xuICAgIC8vIHJldHVybiB0aGUgdGFyZ2V0IGlmIG5vIHNvdXJjZXMgcGFzc2VkXG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0YXJnZXQ7XG4gICAgaWYgKGlzT2JqZWN0KHJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgbGVuID0gc291cmNlcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsbSA9IHNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZWxtKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVsbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxtLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChlbG1ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFtrZXldIHx8ICFpc09iamVjdChyZXN1bHRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcE1lcmdlKHJlc3VsdFtrZXldLCBlbG1ba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRba2V5XSkgJiYgQXJyYXkuaXNBcnJheShlbG1ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGUgdGhlIHR3byBhcnJheXMgYW5kIHJlbW92ZSBhbnkgZHVwbGljYXRlIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBBcnJheS5mcm9tKG5ldyBTZXQocmVzdWx0W2tleV0uY29uY2F0KGVsbVtrZXldKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBlbG1ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZW5JRCgpIHtcbiAgICAvLyBNYXRoLnJhbmRvbSBzaG91bGQgYmUgdW5pcXVlIGJlY2F1c2Ugb2YgaXRzIHNlZWRpbmcgYWxnb3JpdGhtLlxuICAgIC8vIENvbnZlcnQgaXQgdG8gYmFzZSAzNiAobnVtYmVycyArIGxldHRlcnMpLCBhbmQgZ3JhYiB0aGUgZmlyc3QgOSBjaGFyYWN0ZXJzXG4gICAgLy8gYWZ0ZXIgdGhlIGRlY2ltYWwuXG4gICAgcmV0dXJuICdfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1Y0ZpcnN0KHN0cikge1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aEZpbGVQcm90b2NvbChwYXRoKSB7XG4gICAgaWYgKCFwYXRoKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgY29uc3QgcmVnID0gL14oaHR0cHxmaWxlfGxzcCkvO1xuICAgIGlmICghcmVnLnRlc3QocGF0aCkpIHtcbiAgICAgICAgcGF0aCA9IFBST1RPQ09MX0ZJTEUgKyBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzYWZldHlQYXRoSm9pbihiYXNlUGF0aCwgLi4ucGFydHMpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGJhc2VQYXRoKTtcbiAgICAgICAgaWYgKCF1cmwub3JpZ2luKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG51bGwpO1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aC5zdWJzdHIodXJsLm9yaWdpbi5sZW5ndGgpLCAuLi5wYXJ0cyk7XG4gICAgICAgIHJldHVybiB1cmwub3JpZ2luICsgZnVsbFBhdGg7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oYmFzZVBhdGgsIC4uLnBhcnRzKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2FmZXR5UGF0aE5vcm1hbGl6ZShiYXNlUGF0aCkge1xuICAgIGlmICghYmFzZVBhdGg/Lm1hdGNoKC9eKGh0dHA/fGxzcHxhc3NldHMpOi8pKSB7XG4gICAgICAgIGJhc2VQYXRoID0gcGF0aC5ub3JtYWxpemUoYmFzZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZVBhdGg7XG59XG4vKipcbiAqIEBwYXJhbSB0aW1lb3V0IG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHRhZyBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmVycmVkKHRpbWVvdXQsIHRhZykge1xuICAgIGxldCByZXNvbHZlLCByZWplY3Q7XG4gICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICBjb25zdCB0aW1lRm4gPSAocikgPT4ge1xuICAgICAgICByZXR1cm4gKHYpID0+IHtcbiAgICAgICAgICAgIHRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgcih2KTtcbiAgICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlMSwgcmVqZWN0MSkgPT4ge1xuICAgICAgICByZXNvbHZlID0gdGltZUZuKHJlc29sdmUxKTtcbiAgICAgICAgcmVqZWN0ID0gdGltZUZuKHJlamVjdDEpO1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgW2RlZmVycmVkIHRpbWVvdXRdICR7dGFnfWApKSwgdGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjcmVhdGVkOiBEYXRlLm5vdygpLFxuICAgICAgICBzZXRUYWc6ICh0KSA9PiB0YWcgPSB0LFxuICAgICAgICByZXNvbHZlLCByZWplY3QsIHByb21pc2UsXG4gICAgICAgIGdldCBzZXR0bGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldHRsZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUhvc3RFeHBvcnRlZEFwaShtZXRob2QsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBtZXRob2QxID0gc25ha2VDYXNlKG1ldGhvZCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGxvZ3NlcUhvc3RFeHBvcnRlZEFwaSA9IHdpbmRvdy5sb2dzZXE/LmFwaSB8fCB7fTtcbiAgICBjb25zdCBmbiA9IGxvZ3NlcUhvc3RFeHBvcnRlZEFwaVttZXRob2QxXSB8fCB3aW5kb3cuYXBpc1ttZXRob2QxXSB8fFxuICAgICAgICBsb2dzZXFIb3N0RXhwb3J0ZWRBcGlbbWV0aG9kXSB8fCB3aW5kb3cuYXBpc1ttZXRob2RdO1xuICAgIGlmICghZm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZXhpc3RlZCBtZXRob2QgIyR7bWV0aG9kfWApO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nID8gZm4gOiBmbi5hcHBseShudWxsLCBhcmdzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cElmcmFtZVNhbmRib3gocHJvcHMsIHRhcmdldCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIGlmcmFtZS5jbGFzc0xpc3QuYWRkKCdsc3AtaWZyYW1lLXNhbmRib3gnKTtcbiAgICBPYmplY3QuZW50cmllcyhwcm9wcykuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEluamVjdGVkU3R5bGUoc3R5bGUsIGF0dHJzKSB7XG4gICAgY29uc3Qga2V5ID0gYXR0cnNbJ2RhdGEtaW5qZWN0ZWQtc3R5bGUnXTtcbiAgICBsZXQgZWwgPSBrZXkgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtaW5qZWN0ZWQtc3R5bGU9JHtrZXl9XWApO1xuICAgIGlmIChlbCkge1xuICAgICAgICBlbC50ZXh0Q29udGVudCA9IHN0eWxlO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBlbC50ZXh0Q29udGVudCA9IHN0eWxlO1xuICAgIGF0dHJzICYmIE9iamVjdC5lbnRyaWVzKGF0dHJzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKGssIHYpO1xuICAgIH0pO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKGVsKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKGVsKTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW5qZWN0ZWRVSSh1aSwgYXR0cnMpIHtcbiAgICBjb25zdCBwbCA9IHRoaXM7XG4gICAgbGV0IHNsb3QgPSAnJztcbiAgICBsZXQgc2VsZWN0b3IgPSAnJztcbiAgICBpZiAoJ3Nsb3QnIGluIHVpKSB7XG4gICAgICAgIHNsb3QgPSB1aS5zbG90O1xuICAgICAgICBzZWxlY3RvciA9IGAjJHtzbG90fWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZWxlY3RvciA9IHVpLnBhdGg7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdG9yICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5kZWJ1Z1RhZ30gY2FuIG5vdCByZXNvbHZlIHNlbGVjdG9yIHRhcmdldCAke3NlbGVjdG9yfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYCR7dWkua2V5fS0ke3Nsb3R9LSR7cGwuaWR9YDtcbiAgICBjb25zdCBrZXkgPSBgJHt1aS5rZXl9LSR7cGwuaWR9YDtcbiAgICBsZXQgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpZH1gKTtcbiAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gdWkudGVtcGxhdGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbC5pZCA9IGlkO1xuICAgIGVsLmRhdGFzZXQuaW5qZWN0ZWRVaSA9IGtleSB8fCAnJztcbiAgICAvLyBUT0RPOiBTdXBwb3J0IG1vcmVcbiAgICBlbC5pbm5lckhUTUwgPSB1aS50ZW1wbGF0ZTtcbiAgICBhdHRycyAmJiBPYmplY3QuZW50cmllcyhhdHRycykuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICB9KTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIC8vIFRPRE86IEhvdyBoYW5kbGUgZXZlbnRzXG4gICAgWydjbGljaycsICdmb2N1cycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2JsdXInLCAnZGJsY2xpY2snLFxuICAgICAgICAna2V5dXAnLCAna2V5cHJlc3MnLCAna2V5ZG93bicsICdjaGFuZ2UnLCAnaW5wdXQnXS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IHRhcmdldC5jbG9zZXN0KGBbZGF0YS1vbi0ke3R5cGV9XWApO1xuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG1zZ1R5cGUgPSB0cmlnZ2VyLmRhdGFzZXRbYG9uJHt1Y0ZpcnN0KHR5cGUpfWBdO1xuICAgICAgICAgICAgbXNnVHlwZSAmJiBwbC5jYWxsZXI/LmNhbGxVc2VyTW9kZWwobXNnVHlwZSwgdHJhbnNmb3JtYWJsZUV2ZW50KHRyaWdnZXIsIGUpKTtcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChlbCk7XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1hYmxlRXZlbnQodGFyZ2V0LCBlKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgICBjb25zdCBkcyA9IHRhcmdldC5kYXRhc2V0O1xuICAgICAgICBjb25zdCBGTEFHX1JFQ1QgPSAncmVjdCc7XG4gICAgICAgIFsndmFsdWUnLCAnaWQnLCAnY2xhc3NOYW1lJyxcbiAgICAgICAgICAgICdkYXRhc2V0JywgRkxBR19SRUNUXG4gICAgICAgIF0uZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgbGV0IHY7XG4gICAgICAgICAgICBzd2l0Y2ggKGspIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZMQUdfUkVDVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkcy5oYXNPd25Qcm9wZXJ0eShGTEFHX1JFQ1QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB2ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvSlNPTigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB2ID0gdGFyZ2V0W2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHYgPSB7IC4uLnYgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9ialtrXSA9IHY7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxubGV0IGluamVjdGVkVGhlbWVFZmZlY3QgPSBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW5qZWN0ZWRUaGVtZSh1cmwpIHtcbiAgICBpbmplY3RlZFRoZW1lRWZmZWN0Py5jYWxsKCk7XG4gICAgaWYgKCF1cmwpXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIHJldHVybiAoaW5qZWN0ZWRUaGVtZUVmZmVjdCA9ICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgaW5qZWN0ZWRUaGVtZUVmZmVjdCA9IG51bGw7XG4gICAgfSk7XG59XG4iLCIvLyBGb3JrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RvbGxhcnNoYXZlY2x1Yi9wb3N0bWF0ZVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBtZXNzYWdlcyBvdXIgZnJhbWVzIG91ciBzZW5kaW5nXG4gKiBAdHlwZSB7U3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZVR5cGUgPSAnYXBwbGljYXRpb24veC1wb3N0bWF0ZS12MStqc29uJztcbi8qKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIHRvIHNlbmQgYSBoYW5kc2hha2UgcmVxdWVzdCB0byB0aGUgcGFyZW50XG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgbWF4SGFuZHNoYWtlUmVxdWVzdHMgPSA1O1xuLyoqXG4gKiBBIHVuaXF1ZSBtZXNzYWdlIElEIHRoYXQgaXMgdXNlZCB0byBlbnN1cmUgcmVzcG9uc2VzIGFyZSBzZW50IHRvIHRoZSBjb3JyZWN0IHJlcXVlc3RzXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5sZXQgX21lc3NhZ2VJZCA9IDA7XG4vKipcbiAqIEluY3JlbWVudHMgYW5kIHJldHVybnMgYSBtZXNzYWdlIElEXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEEgdW5pcXVlIElEIGZvciBhIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTmV3TWVzc2FnZUlkID0gKCkgPT4gKytfbWVzc2FnZUlkO1xuLyoqXG4gKiBQb3N0bWF0ZSBsb2dnaW5nIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB2aWEgY29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4gUG9zdG1hdGUuZGVidWcgPyBjb25zb2xlLmxvZyguLi5hcmdzKSA6IG51bGw7XG4vKipcbiAqIFRha2VzIGEgVVJMIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5cbiAqIEBwYXJhbSAge1N0cmluZ30gdXJsIFRoZSBmdWxsIFVSTCBiZWluZyByZXF1ZXN0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgIFRoZSBVUkxzIG9yaWdpblxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9yaWdpbiA9ICh1cmwpID0+IHtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBjb25zdCBwcm90b2NvbCA9IGEucHJvdG9jb2wubGVuZ3RoID4gNCA/IGEucHJvdG9jb2wgOiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7XG4gICAgY29uc3QgaG9zdCA9IGEuaG9zdC5sZW5ndGggPyAoKGEucG9ydCA9PT0gJzgwJyB8fCBhLnBvcnQgPT09ICc0NDMnKSA/IGEuaG9zdG5hbWUgOiBhLmhvc3QpIDogd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgcmV0dXJuIGEub3JpZ2luIHx8IGAke3Byb3RvY29sfS8vJHtob3N0fWA7XG59O1xuY29uc3QgbWVzc2FnZVR5cGVzID0ge1xuICAgIGhhbmRzaGFrZTogMSxcbiAgICAnaGFuZHNoYWtlLXJlcGx5JzogMSxcbiAgICBjYWxsOiAxLFxuICAgIGVtaXQ6IDEsXG4gICAgcmVwbHk6IDEsXG4gICAgcmVxdWVzdDogMSxcbn07XG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhIG1lc3NhZ2UgaXMgc2FmZSB0byBpbnRlcnByZXRcbiAqIEBwYXJhbSAge09iamVjdH0gbWVzc2FnZSBUaGUgcG9zdG1hdGUgbWVzc2FnZSBiZWluZyBzZW50XG4gKiBAcGFyYW0gIHtTdHJpbmd8Qm9vbGVhbn0gYWxsb3dlZE9yaWdpbiBUaGUgd2hpdGVsaXN0ZWQgb3JpZ2luIG9yIGZhbHNlIHRvIHNraXAgb3JpZ2luIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnQgY29uc3Qgc2FuaXRpemUgPSAobWVzc2FnZSwgYWxsb3dlZE9yaWdpbikgPT4ge1xuICAgIGlmICh0eXBlb2YgYWxsb3dlZE9yaWdpbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgbWVzc2FnZS5vcmlnaW4gIT09IGFsbG93ZWRPcmlnaW4pXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIW1lc3NhZ2UuZGF0YSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZS5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhKCdwb3N0bWF0ZScgaW4gbWVzc2FnZS5kYXRhKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChtZXNzYWdlLmRhdGEudHlwZSAhPT0gbWVzc2FnZVR5cGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIW1lc3NhZ2VUeXBlc1ttZXNzYWdlLmRhdGEucG9zdG1hdGVdKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBUYWtlcyBhIG1vZGVsLCBhbmQgc2VhcmNoZXMgZm9yIGEgdmFsdWUgYnkgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gIHtPYmplY3R9IG1vZGVsICAgICBUaGUgZGljdGlvbmFyeSB0byBzZWFyY2ggYWdhaW5zdFxuICogQHBhcmFtICB7U3RyaW5nfSBwcm9wZXJ0eSAgQSBwYXRoIHdpdGhpbiBhIGRpY3Rpb25hcnkgKGkuZS4gJ3dpbmRvdy5sb2NhdGlvbi5ocmVmJylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBmdW5jdGlvbnMgaW4gdGhlIGNoaWxkIG1vZGVsXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVZhbHVlID0gKG1vZGVsLCBwcm9wZXJ0eSkgPT4ge1xuICAgIGNvbnN0IHVud3JhcHBlZENvbnRleHQgPSB0eXBlb2YgbW9kZWxbcHJvcGVydHldID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxbcHJvcGVydHldKCkgOiBtb2RlbFtwcm9wZXJ0eV07XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bndyYXBwZWRDb250ZXh0KTtcbn07XG4vKipcbiAqIENvbXBvc2VzIGFuIEFQSSB0byBiZSB1c2VkIGJ5IHRoZSBwYXJlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIEluZm9ybWF0aW9uIG9uIHRoZSBjb25zdW1lclxuICovXG5leHBvcnQgY2xhc3MgUGFyZW50QVBJIHtcbiAgICBwYXJlbnQ7XG4gICAgZnJhbWU7XG4gICAgY2hpbGQ7XG4gICAgZXZlbnRzID0ge307XG4gICAgY2hpbGRPcmlnaW47XG4gICAgbGlzdGVuZXI7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB0aGlzLnBhcmVudCA9IGluZm8ucGFyZW50O1xuICAgICAgICB0aGlzLmZyYW1lID0gaW5mby5mcmFtZTtcbiAgICAgICAgdGhpcy5jaGlsZCA9IGluZm8uY2hpbGQ7XG4gICAgICAgIHRoaXMuY2hpbGRPcmlnaW4gPSBpbmZvLmNoaWxkT3JpZ2luO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IFJlZ2lzdGVyaW5nIEFQSScpO1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IEF3YWl0aW5nIG1lc3NhZ2VzLi4uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5lciA9IChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNhbml0aXplKGUsIHRoaXMuY2hpbGRPcmlnaW4pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogdGhlIGFzc2lnbm1lbnRzIGJlbG93IGVuc3VyZXMgdGhhdCBlLCBkYXRhLCBhbmQgdmFsdWUgYXJlIGFsbCBkZWZpbmVkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgbmFtZSB9ID0gKCgoZSB8fCB7fSkuZGF0YSB8fCB7fSkudmFsdWUgfHwge30pO1xuICAgICAgICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2VtaXQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGBQYXJlbnQ6IFJlY2VpdmVkIGV2ZW50IGVtaXNzaW9uOiAke25hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIHRoaXMuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzW25hbWVdLmZvckVhY2goY2FsbGJhY2sgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5saXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IEF3YWl0aW5nIGV2ZW50IGVtaXNzaW9ucyBmcm9tIENoaWxkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0KHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gRXh0cmFjdCBkYXRhIGZyb20gcmVzcG9uc2UgYW5kIGtpbGwgbGlzdGVuZXJzXG4gICAgICAgICAgICBjb25zdCB1aWQgPSBnZW5lcmF0ZU5ld01lc3NhZ2VJZCgpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNhY3QgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudWlkID09PSB1aWQgJiYgZS5kYXRhLnBvc3RtYXRlID09PSAncmVwbHknKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0cmFuc2FjdCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGUuZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFByZXBhcmUgZm9yIHJlc3BvbnNlIGZyb20gQ2hpbGQuLi5cbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0cmFuc2FjdCwgZmFsc2UpO1xuICAgICAgICAgICAgLy8gVGhlbiBhc2sgY2hpbGQgZm9yIGluZm9ybWF0aW9uXG4gICAgICAgICAgICB0aGlzLmNoaWxkLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBwb3N0bWF0ZTogJ3JlcXVlc3QnLFxuICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgIHVpZCxcbiAgICAgICAgICAgIH0sIHRoaXMuY2hpbGRPcmlnaW4pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FsbChwcm9wZXJ0eSwgZGF0YSkge1xuICAgICAgICAvLyBTZW5kIGluZm9ybWF0aW9uIHRvIHRoZSBjaGlsZFxuICAgICAgICB0aGlzLmNoaWxkLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHBvc3RtYXRlOiAnY2FsbCcsXG4gICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfSwgdGhpcy5jaGlsZE9yaWdpbik7XG4gICAgfVxuICAgIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudE5hbWVdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXS5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnUGFyZW50OiBEZXN0cm95aW5nIFBvc3RtYXRlIGluc3RhbmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lKTtcbiAgICB9XG59XG4vKipcbiAqIENvbXBvc2VzIGFuIEFQSSB0byBiZSB1c2VkIGJ5IHRoZSBjaGlsZFxuICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mb3JtYXRpb24gb24gdGhlIGNvbnN1bWVyXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGlsZEFQSSB7XG4gICAgbW9kZWw7XG4gICAgcGFyZW50O1xuICAgIHBhcmVudE9yaWdpbjtcbiAgICBjaGlsZDtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBpbmZvLm1vZGVsO1xuICAgICAgICB0aGlzLnBhcmVudCA9IGluZm8ucGFyZW50O1xuICAgICAgICB0aGlzLnBhcmVudE9yaWdpbiA9IGluZm8ucGFyZW50T3JpZ2luO1xuICAgICAgICB0aGlzLmNoaWxkID0gaW5mby5jaGlsZDtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFJlZ2lzdGVyaW5nIEFQSScpO1xuICAgICAgICAgICAgbG9nKCdDaGlsZDogQXdhaXRpbmcgbWVzc2FnZXMuLi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZShlLCB0aGlzLnBhcmVudE9yaWdpbikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBSZWNlaXZlZCByZXF1ZXN0JywgZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgcHJvcGVydHksIHVpZCwgZGF0YSB9ID0gZS5kYXRhO1xuICAgICAgICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2NhbGwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluIHRoaXMubW9kZWwgJiYgdHlwZW9mIHRoaXMubW9kZWxbcHJvcGVydHldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxbcHJvcGVydHldKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXBseSB0byBQYXJlbnRcbiAgICAgICAgICAgIHJlc29sdmVWYWx1ZSh0aGlzLm1vZGVsLCBwcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICAudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGUuc291cmNlLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIHBvc3RtYXRlOiAncmVwbHknLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgdWlkLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB9LCBlLm9yaWdpbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVtaXQobmFtZSwgZGF0YSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKGBDaGlsZDogRW1pdHRpbmcgRXZlbnQgXCIke25hbWV9XCJgLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBwb3N0bWF0ZTogJ2VtaXQnLFxuICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sIHRoaXMucGFyZW50T3JpZ2luKTtcbiAgICB9XG59XG4vKipcbiAqIFRoZSBlbnRyeSBwb2ludCBvZiB0aGUgUGFyZW50LlxuICovXG5leHBvcnQgY2xhc3MgUG9zdG1hdGUge1xuICAgIHN0YXRpYyBkZWJ1ZyA9IGZhbHNlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgY29udGFpbmVyO1xuICAgIHBhcmVudDtcbiAgICBmcmFtZTtcbiAgICBjaGlsZDtcbiAgICBjaGlsZE9yaWdpbjtcbiAgICB1cmw7XG4gICAgbW9kZWw7XG4gICAgc3RhdGljIE1vZGVsO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG9wdHMuY29udGFpbmVyO1xuICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJsO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHdpbmRvdztcbiAgICAgICAgdGhpcy5mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICB0aGlzLmZyYW1lLm5hbWUgPSBvcHRzLm5hbWUgfHwgJyc7XG4gICAgICAgIHRoaXMuZnJhbWUuY2xhc3NMaXN0LmFkZC5hcHBseSh0aGlzLmZyYW1lLmNsYXNzTGlzdCwgb3B0cy5jbGFzc0xpc3RBcnJheSB8fCBbXSk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpO1xuICAgICAgICB0aGlzLmNoaWxkID0gdGhpcy5mcmFtZS5jb250ZW50V2luZG93O1xuICAgICAgICB0aGlzLm1vZGVsID0gb3B0cy5tb2RlbCB8fCB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmVnaW5zIHRoZSBoYW5kc2hha2Ugc3RyYXRlZ3lcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIHNlbmQgYSBoYW5kc2hha2UgcmVxdWVzdCB0b1xuICAgICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlXG4gICAgICovXG4gICAgc2VuZEhhbmRzaGFrZSh1cmwpIHtcbiAgICAgICAgdXJsID0gdXJsIHx8IHRoaXMudXJsO1xuICAgICAgICBjb25zdCBjaGlsZE9yaWdpbiA9IHJlc29sdmVPcmlnaW4odXJsKTtcbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICBsZXQgcmVzcG9uc2VJbnRlcnZhbDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcGx5ID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNhbml0aXplKGUsIGNoaWxkT3JpZ2luKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdoYW5kc2hha2UtcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmVzcG9uc2VJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1BhcmVudDogUmVjZWl2ZWQgaGFuZHNoYWtlIHJlcGx5IGZyb20gQ2hpbGQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVwbHksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE9yaWdpbiA9IGUub3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IFNhdmluZyBDaGlsZCBvcmlnaW4nLCB0aGlzLmNoaWxkT3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgUGFyZW50QVBJKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTWlnaHQgbmVlZCB0byByZW1vdmUgc2luY2UgcGFyZW50IG1pZ2h0IGJlIHJlY2VpdmluZyBkaWZmZXJlbnQgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGRpZmZlcmVudCBob3N0c1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnUGFyZW50OiBJbnZhbGlkIGhhbmRzaGFrZSByZXBseScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdGYWlsZWQgaGFuZHNoYWtlJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlcGx5LCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBkb1NlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgUGFyZW50OiBTZW5kaW5nIGhhbmRzaGFrZSBhdHRlbXB0ICR7YXR0ZW1wdH1gLCB7IGNoaWxkT3JpZ2luIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgICAgICAgICAgfSwgY2hpbGRPcmlnaW4pO1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID09PSBtYXhIYW5kc2hha2VSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJlc3BvbnNlSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9TZW5kKCk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VJbnRlcnZhbCA9IHNldEludGVydmFsKGRvU2VuZCwgNTAwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkZWQpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsb2coJ1BhcmVudDogTG9hZGluZyBmcmFtZScsIHsgdXJsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mcmFtZS5zcmMgPSB1cmw7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGVudHJ5IHBvaW50IG9mIHRoZSBDaGlsZFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuICAgIGNoaWxkO1xuICAgIG1vZGVsO1xuICAgIHBhcmVudDtcbiAgICBwYXJlbnRPcmlnaW47XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNoaWxkLCBtb2RlbCwgcGFyZW50LCBhbmQgcmVzcG9uZHMgdG8gdGhlIFBhcmVudHMgaGFuZHNoYWtlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIEhhc2ggb2YgdmFsdWVzLCBmdW5jdGlvbnMsIG9yIHByb21pc2VzXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgVGhlIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBoYW5kc2hha2UgaGFzIGJlZW4gcmVjZWl2ZWRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbCkge1xuICAgICAgICB0aGlzLmNoaWxkID0gd2luZG93O1xuICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5jaGlsZC5wYXJlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc3BvbmRzIHRvIGEgaGFuZHNoYWtlIGluaXRpYXRlZCBieSB0aGUgUGFyZW50XG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgYW4gb2JqZWN0IHRoYXQgZXhwb3NlcyBhbiBBUEkgZm9yIHRoZSBDaGlsZFxuICAgICAqL1xuICAgIHNlbmRIYW5kc2hha2VSZXBseSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNoYWtlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWUuZGF0YS5wb3N0bWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdoYW5kc2hha2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBSZWNlaXZlZCBoYW5kc2hha2UgZnJvbSBQYXJlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzaGFrZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDaGlsZDogU2VuZGluZyBoYW5kc2hha2UgcmVwbHkgdG8gUGFyZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZS5zb3VyY2UucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdoYW5kc2hha2UtcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0sIGUub3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRPcmlnaW4gPSBlLm9yaWdpbjtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIG1vZGVsIHdpdGggdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRzID0gZS5kYXRhLm1vZGVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtrZXldID0gZGVmYXVsdHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBJbmhlcml0ZWQgYW5kIGV4dGVuZGVkIG1vZGVsIGZyb20gUGFyZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFNhdmluZyBQYXJlbnQgb3JpZ2luJywgdGhpcy5wYXJlbnRPcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG5ldyBDaGlsZEFQSSh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ0hhbmRzaGFrZSBSZXBseSBGYWlsZWQnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmNoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzaGFrZSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEEgc3RvcmFnZSBiYXNlZCBvbiBsb2NhbCBmaWxlcyB1bmRlciBzcGVjaWZpYyBjb250ZXh0XG4gKi9cbmNsYXNzIExTUGx1Z2luRmlsZVN0b3JhZ2Uge1xuICAgIGN0eDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY3R4XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY3R4KSB7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBwbHVnaW4gaWRcbiAgICAgKi9cbiAgICBnZXQgY3R4SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5iYXNlSW5mby5pZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleSBBIHN0cmluZyBhcyBmaWxlIG5hbWUgdGhhdCBzdXBwb3J0IG5lc3RlZCBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gdmFsdWUgU3RvcmFnZSB2YWx1ZVxuICAgICAqL1xuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdHguY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICd3cml0ZS1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXksIHZhbHVlXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbEFzeW5jKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlYWQtcGx1Z2luLXN0b3JhZ2UtZmlsZScsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZCwga2V5XVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICd1bmxpbmstcGx1Z2luLXN0b3JhZ2UtZmlsZScsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZCwga2V5XVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBzdG9yYWdlXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdjbGVhci1wbHVnaW4tc3RvcmFnZS1maWxlcycsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZF1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBrZXlcbiAgICAgKi9cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdHguY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdleGlzdC1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXldXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCB7IExTUGx1Z2luRmlsZVN0b3JhZ2UgfTtcbiIsImltcG9ydCB7IGRlZXBNZXJnZSwgc2FmZXR5UGF0aEpvaW4gfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTFNQbHVnaW5DYWxsZXIgfSBmcm9tICcuL0xTUGx1Z2luLmNhbGxlcic7XG5pbXBvcnQgRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnc25ha2UtY2FzZSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgTFNQbHVnaW5GaWxlU3RvcmFnZSB9IGZyb20gJy4vbW9kdWxlcy9MU1BsdWdpbi5TdG9yYWdlJztcbmNvbnN0IFBST1hZX0NPTlRJTlVFID0gU3ltYm9sLmZvcigncHJveHktY29udGludWUnKTtcbmNvbnN0IGRlYnVnID0gRGVidWcoJ0xTUGx1Z2luOnVzZXInKTtcbi8qKlxuICogQHBhcmFtIHR5cGVcbiAqIEBwYXJhbSBvcHRzXG4gKiBAcGFyYW0gYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZCh0eXBlLCBvcHRzLCBhY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHsga2V5LCBsYWJlbCB9ID0gb3B0cztcbiAgICBjb25zdCBldmVudEtleSA9IGBTaW1wbGVDb21tYW5kSG9vayR7a2V5fSR7KytyZWdpc3RlcmVkQ21kVWlkfWA7XG4gICAgdGhpcy5FZGl0b3JbJ29uJyArIGV2ZW50S2V5XShhY3Rpb24pO1xuICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgbWV0aG9kOiAncmVnaXN0ZXItcGx1Z2luLXNpbXBsZS1jb21tYW5kJyxcbiAgICAgICAgYXJnczogW3RoaXMuYmFzZUluZm8uaWQsIFt7IGtleSwgbGFiZWwsIHR5cGUgfSwgWydlZGl0b3IvaG9vaycsIGV2ZW50S2V5XV1dXG4gICAgfSk7XG59XG5jb25zdCBhcHAgPSB7XG4gICAgcmVnaXN0ZXJVSUl0ZW0odHlwZSwgb3B0cykge1xuICAgICAgICBjb25zdCBwaWQgPSB0aGlzLmJhc2VJbmZvLmlkO1xuICAgICAgICAvLyBvcHRzLmtleSA9IGAke3BpZH1fJHtvcHRzLmtleX1gXG4gICAgICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlZ2lzdGVyLXBsdWdpbi11aS1pdGVtJyxcbiAgICAgICAgICAgIGFyZ3M6IFtwaWQsIHR5cGUsIG9wdHNdXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJQYWdlTWVudUl0ZW0odGFnLCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSB0YWcgKyAnXycgKyB0aGlzLmJhc2VJbmZvLmlkO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRhZztcbiAgICAgICAgY29uc3QgdHlwZSA9ICdwYWdlLW1lbnUtaXRlbSc7XG4gICAgICAgIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZC5jYWxsKHRoaXMsIHR5cGUsIHtcbiAgICAgICAgICAgIGtleSwgbGFiZWxcbiAgICAgICAgfSwgYWN0aW9uKTtcbiAgICB9XG59O1xubGV0IHJlZ2lzdGVyZWRDbWRVaWQgPSAwO1xuY29uc3QgZWRpdG9yID0ge1xuICAgIHJlZ2lzdGVyU2xhc2hDb21tYW5kKHRhZywgYWN0aW9ucykge1xuICAgICAgICBkZWJ1ZygnUmVnaXN0ZXIgc2xhc2ggY29tbWFuZCAjJywgdGhpcy5iYXNlSW5mby5pZCwgdGFnLCBhY3Rpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBhY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgIFsnZWRpdG9yL2NsZWFyLWN1cnJlbnQtc2xhc2gnLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgWydlZGl0b3IvcmVzdG9yZS1zYXZlZC1jdXJzb3InXSxcbiAgICAgICAgICAgICAgICBbJ2VkaXRvci9ob29rJywgYWN0aW9uc11cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgYWN0aW9ucyA9IGFjdGlvbnMubWFwKChpdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3RhZywgLi4uYXJnc10gPSBpdDtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZWRpdG9yL2hvb2snOlxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsZXI/LmNhbGxVc2VyTW9kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50S2V5ID0gYFNsYXNoQ29tbWFuZEhvb2ske3RhZ30keysrcmVnaXN0ZXJlZENtZFVpZH1gO1xuICAgICAgICAgICAgICAgICAgICBpdFsxXSA9IGV2ZW50S2V5O1xuICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBjb21tYW5kIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRWRpdG9yWydvbicgKyBldmVudEtleV0oZm4pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYWxsZXI/LmNhbGwoYGFwaTpjYWxsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncmVnaXN0ZXItcGx1Z2luLXNsYXNoLWNvbW1hbmQnLFxuICAgICAgICAgICAgYXJnczogW3RoaXMuYmFzZUluZm8uaWQsIFt0YWcsIGFjdGlvbnNdXVxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyQmxvY2tDb250ZXh0TWVudUl0ZW0odGFnLCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSB0YWcgKyAnXycgKyB0aGlzLmJhc2VJbmZvLmlkO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRhZztcbiAgICAgICAgY29uc3QgdHlwZSA9ICdibG9jay1jb250ZXh0LW1lbnUtaXRlbSc7XG4gICAgICAgIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZC5jYWxsKHRoaXMsIHR5cGUsIHtcbiAgICAgICAgICAgIGtleSwgbGFiZWxcbiAgICAgICAgfSwgYWN0aW9uKTtcbiAgICB9LFxuICAgIHNjcm9sbFRvQmxvY2tJblBhZ2UocGFnZU5hbWUsIGJsb2NrSWQpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gYGJsb2NrLWNvbnRlbnQtYCArIGJsb2NrSWQ7XG4gICAgICAgIHRoaXMuQXBwLnB1c2hTdGF0ZSgncGFnZScsIHsgbmFtZTogcGFnZU5hbWUgfSwgeyBhbmNob3IgfSk7XG4gICAgfVxufTtcbmNvbnN0IGRiID0ge307XG5jb25zdCBLRVlfTUFJTl9VSSA9IDA7XG4vKipcbiAqIFVzZXIgcGx1Z2luIGluc3RhbmNlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBMU1BsdWdpblVzZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIF9iYXNlSW5mbztcbiAgICBfY2FsbGVyO1xuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIHVpIGZyYW1lIGlkZW50aXRpZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91aSA9IG5ldyBNYXAoKTtcbiAgICBfZmlsZVN0b3JhZ2U7XG4gICAgLyoqXG4gICAgICogaGFuZGxlciBvZiBiZWZvcmUgdW5sb2FkIHBsdWdpblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2JlZm9yZXVubG9hZENhbGxiYWNrO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBfYmFzZUluZm9cbiAgICAgKiBAcGFyYW0gX2NhbGxlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9iYXNlSW5mbywgX2NhbGxlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9iYXNlSW5mbyA9IF9iYXNlSW5mbztcbiAgICAgICAgdGhpcy5fY2FsbGVyID0gX2NhbGxlcjtcbiAgICAgICAgX2NhbGxlci5vbignc2V0dGluZ3M6Y2hhbmdlZCcsIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBjb25zdCBhID0gT2JqZWN0LmFzc2lnbih0aGlzLl9iYXNlSW5mby5zZXR0aW5ncywgcGF5bG9hZCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3NldHRpbmdzOmNoYW5nZWQnLCB7IC4uLmEgfSwgYik7XG4gICAgICAgIH0pO1xuICAgICAgICBfY2FsbGVyLm9uKCdiZWZvcmV1bmxvYWQnLCBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhY3RvciwgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gdGhpcy5fYmVmb3JldW5sb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNiICYmIGF3YWl0IGNiKHJlc3QpO1xuICAgICAgICAgICAgICAgIGFjdG9yPy5yZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGAke19jYWxsZXIuZGVidWdUYWd9IFtiZWZvcmV1bmxvYWRdIGAsIGUpO1xuICAgICAgICAgICAgICAgIGFjdG9yPy5yZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBtb2R1bGVzXG4gICAgICAgIHRoaXMuX2ZpbGVTdG9yYWdlID0gbmV3IExTUGx1Z2luRmlsZVN0b3JhZ2UodGhpcyk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWR5KG1vZGVsLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5fY29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbW9kZWw7XG4gICAgICAgICAgICAgICAgbW9kZWwgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYXNlSW5mbyA9IGF3YWl0IHRoaXMuX2NhbGxlci5jb25uZWN0VG9QYXJlbnQobW9kZWwpO1xuICAgICAgICAgICAgYmFzZUluZm8gPSBkZWVwTWVyZ2UodGhpcy5fYmFzZUluZm8sIGJhc2VJbmZvKTtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoYmFzZUluZm8/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbGVyLmRlYnVnVGFnID0gYCMke2Jhc2VJbmZvLmlkfSBbJHtiYXNlSW5mby5uYW1lfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2suY2FsbCh0aGlzLCBiYXNlSW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tMU1BsdWdpbiBSZWFkeSBFcnJvcl0nLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnN1cmVDb25uZWN0ZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiZWZvcmV1bmxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fYmVmb3JldW5sb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgcHJvdmlkZU1vZGVsKG1vZGVsKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLl9leHRlbmRVc2VyTW9kZWwobW9kZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHJvdmlkZVRoZW1lKHRoZW1lKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3Byb3ZpZGVyOnRoZW1lJywgdGhlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHJvdmlkZVN0eWxlKHN0eWxlKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3Byb3ZpZGVyOnN0eWxlJywgc3R5bGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHJvdmlkZVVJKHVpKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3Byb3ZpZGVyOnVpJywgdWkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdXBkYXRlU2V0dGluZ3MoYXR0cnMpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnc2V0dGluZ3M6dXBkYXRlJywgYXR0cnMpO1xuICAgICAgICAvLyBUT0RPOiB1cGRhdGUgYXNzb2NpYXRlZCBiYXNlSW5mbyBzZXR0aW5nc1xuICAgIH1cbiAgICBzZXRNYWluVUlBdHRycyhhdHRycykge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdtYWluLXVpOmF0dHJzJywgYXR0cnMpO1xuICAgIH1cbiAgICBzZXRNYWluVUlJbmxpbmVTdHlsZShzdHlsZSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdtYWluLXVpOnN0eWxlJywgc3R5bGUpO1xuICAgIH1cbiAgICBoaWRlTWFpblVJKG9wdHMpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsga2V5OiBLRVlfTUFJTl9VSSwgdmlzaWJsZTogZmFsc2UsIGN1cnNvcjogb3B0cz8ucmVzdG9yZUVkaXRpbmdDdXJzb3IgfTtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTp2aXNpYmxlJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdCgndWk6dmlzaWJsZTpjaGFuZ2VkJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuX3VpLnNldChwYXlsb2FkLmtleSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIHNob3dNYWluVUkoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IGtleTogS0VZX01BSU5fVUksIHZpc2libGU6IHRydWUgfTtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTp2aXNpYmxlJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdCgndWk6dmlzaWJsZTpjaGFuZ2VkJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuX3VpLnNldChwYXlsb2FkLmtleSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIHRvZ2dsZU1haW5VSSgpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsga2V5OiBLRVlfTUFJTl9VSSwgdG9nZ2xlOiB0cnVlIH07XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fdWkuZ2V0KHBheWxvYWQua2V5KTtcbiAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU1haW5VSSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93TWFpblVJKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzTWFpblVJVmlzaWJsZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl91aS5nZXQoMCk7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHN0YXRlICYmIHN0YXRlLnZpc2libGUpO1xuICAgIH1cbiAgICBnZXQgY29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGVkO1xuICAgIH1cbiAgICBnZXQgYmFzZUluZm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlSW5mbztcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlSW5mbz8uc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBjYWxsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsZXI7XG4gICAgfVxuICAgIHJlc29sdmVSZXNvdXJjZUZ1bGxVcmwoZmlsZVBhdGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVDb25uZWN0ZWQoKTtcbiAgICAgICAgaWYgKCFmaWxlUGF0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9eWy5cXFxcL10rLywgJycpO1xuICAgICAgICByZXR1cm4gc2FmZXR5UGF0aEpvaW4odGhpcy5fYmFzZUluZm8ubHNyLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9tYWtlVXNlclByb3h5KHRhcmdldCwgdGFnKSB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICBjb25zdCBjYWxsZXIgPSB0aGlzLmNhbGxlcjtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3BLZXksIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ01ldGhvZCA9IHRhcmdldFtwcm9wS2V5XTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdNZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IG9yaWdNZXRob2QuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9PSBQUk9YWV9DT05USU5VRSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9va01hdGNoZXIgPSBwcm9wS2V5LnRvU3RyaW5nKCkubWF0Y2goL14ob25jZXxvZmZ8b24pL2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvb2tNYXRjaGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmID0gaG9va01hdGNoZXJbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaG9va01hdGNoZXIuaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHMuc2xpY2UoZi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBgaG9vazoke3RhZ306JHtzbmFrZUNhc2UoZSl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJbZl0odHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYgIT09ICdvZmYnID8gKCkgPT4gKGNhbGxlci5vZmYodHlwZSwgaGFuZGxlcikpIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgaG9zdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJmYWNlIG1ldGhvZHMgb2Yge0BsaW5rIElBcHBQcm94eX1cbiAgICAgKi9cbiAgICBnZXQgQXBwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVVzZXJQcm94eShhcHAsICdhcHAnKTtcbiAgICB9XG4gICAgZ2V0IEVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VVc2VyUHJveHkoZWRpdG9yLCAnZWRpdG9yJyk7XG4gICAgfVxuICAgIGdldCBEQigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VVc2VyUHJveHkoZGIpO1xuICAgIH1cbiAgICBnZXQgRmlsZVN0b3JhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlU3RvcmFnZTtcbiAgICB9XG59XG5leHBvcnQgKiBmcm9tICcuL0xTUGx1Z2luJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFBsdWdpblVzZXJJbnN0YW5jZShwbHVnaW5CYXNlSW5mbywgcGx1Z2luQ2FsbGVyKSB7XG4gICAgcmV0dXJuIG5ldyBMU1BsdWdpblVzZXIocGx1Z2luQmFzZUluZm8sIHBsdWdpbkNhbGxlcik7XG59XG5pZiAod2luZG93Ll9fTFNQX19IT1NUX18gPT0gbnVsbCkgeyAvLyBFbnRyeSBvZiBpZnJhbWUgbW9kZVxuICAgIGNvbnN0IGNhbGxlciA9IG5ldyBMU1BsdWdpbkNhbGxlcihudWxsKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93LmxvZ3NlcSA9IHNldHVwUGx1Z2luVXNlckluc3RhbmNlKHt9LCBjYWxsZXIpO1xufVxuIiwiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IExTUGx1Z2luVXNlciB9IGZyb20gJy4vTFNQbHVnaW4udXNlcic7XG4vLyBAdHMtaWdub3JlXG5jb25zdCB7IGltcG9ydEhUTUwsIGNyZWF0ZVNhbmRib3hDb250YWluZXIgfSA9IHdpbmRvdy5RU2FuZGJveCB8fCB7fTtcbmZ1bmN0aW9uIHVzZXJGZXRjaCh1cmwsIG9wdHMpIHtcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJ2ZpbGU6Ly8nLCAnJyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB3aW5kb3cuYXBpcy5kb0FjdGlvbihbJ3JlYWRGaWxlJywgdXJsXSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaCh1cmwsIG9wdHMpO1xufVxuY2xhc3MgTFNQbHVnaW5TaGFkb3dGcmFtZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3BsdWdpbkxvY2FsO1xuICAgIF9mcmFtZTtcbiAgICBfcm9vdDtcbiAgICBfbG9hZGVkID0gZmFsc2U7XG4gICAgX3VubW91bnRGbnMgPSBbXTtcbiAgICBjb25zdHJ1Y3RvcihfcGx1Z2luTG9jYWwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcGx1Z2luTG9jYWwgPSBfcGx1Z2luTG9jYWw7XG4gICAgICAgIF9wbHVnaW5Mb2NhbC5fZGlzcG9zZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91bm1vdW50KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIGVudHJ5IH0gPSB0aGlzLl9wbHVnaW5Mb2NhbC5vcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5sb2FkZWQgfHwgIWVudHJ5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IHRlbXBsYXRlLCBleGVjU2NyaXB0cyB9ID0gYXdhaXQgaW1wb3J0SFRNTChlbnRyeSwgeyBmZXRjaDogdXNlckZldGNoIH0pO1xuICAgICAgICB0aGlzLl9tb3VudCh0ZW1wbGF0ZSwgZG9jdW1lbnQuYm9keSk7XG4gICAgICAgIGNvbnN0IHNhbmRib3ggPSBjcmVhdGVTYW5kYm94Q29udGFpbmVyKG5hbWUsIHtcbiAgICAgICAgICAgIGVsZW1lbnRHZXR0ZXI6ICgpID0+IHRoaXMuX3Jvb3Q/LmZpcnN0Q2hpbGQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBnbG9iYWwgPSBzYW5kYm94Lmluc3RhbmNlLnByb3h5O1xuICAgICAgICBnbG9iYWwuX19zaGFkb3dfbW9kZV9fID0gdHJ1ZTtcbiAgICAgICAgZ2xvYmFsLkxTUGx1Z2luTG9jYWwgPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgZ2xvYmFsLkxTUGx1Z2luU2hhZG93ID0gdGhpcztcbiAgICAgICAgZ2xvYmFsLkxTUGx1Z2luVXNlciA9IGdsb2JhbC5sb2dzZXEgPSBuZXcgTFNQbHVnaW5Vc2VyKHRoaXMuX3BsdWdpbkxvY2FsLnRvSlNPTigpLCB0aGlzLl9wbHVnaW5Mb2NhbC5jYWxsZXIpO1xuICAgICAgICAvLyBUT0RPOiB7bW91bnQsIHVubW91bnR9XG4gICAgICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjU2NyaXB0cyhnbG9iYWwsIHRydWUpO1xuICAgICAgICB0aGlzLl91bm1vdW50Rm5zLnB1c2goZXhlY1Jlc3VsdC51bm1vdW50KTtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgX21vdW50KGNvbnRlbnQsIGNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuX2ZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZyYW1lLmNsYXNzTGlzdC5hZGQoJ2xzcC1zaGFkb3ctc2FuZGJveCcpO1xuICAgICAgICBmcmFtZS5pZCA9IHRoaXMuX3BsdWdpbkxvY2FsLmlkO1xuICAgICAgICB0aGlzLl9yb290ID0gZnJhbWUuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICB0aGlzLl9yb290LmlubmVySFRNTCA9IGA8ZGl2PiR7Y29udGVudH08L2Rpdj5gO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhbWUpO1xuICAgICAgICB0aGlzLmVtaXQoJ21vdW50ZWQnKTtcbiAgICB9XG4gICAgX3VubW91bnQoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5fdW5tb3VudEZucykge1xuICAgICAgICAgICAgZm4gJiYgZm4uY2FsbChudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmZyYW1lPy5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lKTtcbiAgICB9XG4gICAgZ2V0IGxvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZDtcbiAgICB9XG4gICAgZ2V0IGRvY3VtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdD8uZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgZ2V0IGZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWU7XG4gICAgfVxufVxuZXhwb3J0IHsgTFNQbHVnaW5TaGFkb3dGcmFtZSB9O1xuIiwiaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IFBvc3RtYXRlLCBNb2RlbCB9IGZyb20gJy4vcG9zdG1hdGUnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IGRlZmVycmVkLCBJU19ERVYgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTFNQbHVnaW5TaGFkb3dGcmFtZSB9IGZyb20gJy4vTFNQbHVnaW4uc2hhZG93JztcbmNvbnN0IGRlYnVnID0gRGVidWcoJ0xTUGx1Z2luOmNhbGxlcicpO1xuZXhwb3J0IGNvbnN0IEZMQUdfQVdBSVQgPSAnI2F3YWl0I3Jlc3BvbnNlIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHID0gJyNsc3Btc2cjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfRVJST1JfVEFHID0gJyNsc3Btc2cjZXJyb3IjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfU0VUVElOR1MgPSAnI2xzcG1zZyNzZXR0aW5ncyMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19CRUZPUkVfVU5MT0FEID0gJyNsc3Btc2cjYmVmb3JldW5sb2FkIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX1NZTkMgPSAnI2xzcG1zZyNyZXBseSMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19SRUFEWSA9ICcjbHNwbXNnI3JlYWR5Iyc7XG5leHBvcnQgY29uc3QgTFNQTVNHRm4gPSAoaWQpID0+IGAke0xTUE1TR30ke2lkfWA7XG5leHBvcnQgY29uc3QgQVdBSVRfTFNQTVNHRm4gPSAoaWQpID0+IGAke0ZMQUdfQVdBSVR9JHtpZH1gO1xuLyoqXG4gKiBDYWxsIGJldHdlZW4gY29yZSBhbmQgdXNlclxuICovXG5jbGFzcyBMU1BsdWdpbkNhbGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3BsdWdpbkxvY2FsO1xuICAgIF9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBfcGFyZW50O1xuICAgIF9jaGlsZDtcbiAgICBfc2hhZG93O1xuICAgIF9zdGF0dXM7XG4gICAgX3VzZXJNb2RlbCA9IHt9O1xuICAgIF9jYWxsO1xuICAgIF9jYWxsVXNlck1vZGVsO1xuICAgIF9kZWJ1Z1RhZyA9ICcnO1xuICAgIGNvbnN0cnVjdG9yKF9wbHVnaW5Mb2NhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbCA9IF9wbHVnaW5Mb2NhbDtcbiAgICAgICAgaWYgKF9wbHVnaW5Mb2NhbCkge1xuICAgICAgICAgICAgdGhpcy5fZGVidWdUYWcgPSBfcGx1Z2luTG9jYWwuZGVidWdUYWc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY29ubmVjdFRvQ2hpbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHsgc2hhZG93IH0gPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgaWYgKHNoYWRvdykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0dXBTaGFkb3dTYW5kYm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXR1cElmcmFtZVNhbmRib3goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBjb25uZWN0VG9QYXJlbnQodXNlck1vZGVsID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgY2FsbGVyID0gdGhpcztcbiAgICAgICAgY29uc3QgaXNTaGFkb3dNb2RlID0gdGhpcy5fcGx1Z2luTG9jYWwgIT0gbnVsbDtcbiAgICAgICAgbGV0IHN5bmNHQ1RpbWVyID0gMDtcbiAgICAgICAgbGV0IHN5bmNUYWcgPSAwO1xuICAgICAgICBjb25zdCBzeW5jQWN0b3JzID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCByZWFkeURlZmVycmVkID0gZGVmZXJyZWQoMTAwMCAqIDUpO1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2V4dGVuZFVzZXJNb2RlbCh7XG4gICAgICAgICAgICBbTFNQTVNHX1JFQURZXTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtMU1BNU0dfQkVGT1JFX1VOTE9BRF06IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0b3IgPSBkZWZlcnJlZCgxMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KCdiZWZvcmV1bmxvYWQnLCBPYmplY3QuYXNzaWduKHsgYWN0b3IgfSwgZSkpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFjdG9yLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR19TRVRUSU5HU106IGFzeW5jICh7IHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KCdzZXR0aW5nczpjaGFuZ2VkJywgcGF5bG9hZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR106IGFzeW5jICh7IG5zLCB0eXBlLCBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhgW2NhbGwgZnJvbSBob3N0XSAke3RoaXMuX2RlYnVnVGFnfWAsIG5zLCB0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBpZiAobnMgJiYgbnMuc3RhcnRzV2l0aCgnaG9vaycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KGAke25zfToke3R5cGV9YCwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQodHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR19TWU5DXTogKHsgX3N5bmMsIHJlc3VsdCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgZGVidWcoYFtzeW5jIHJlcGx5XSAjJHtfc3luY31gLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzeW5jQWN0b3JzLmhhcyhfc3luYykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0b3IgPSBzeW5jQWN0b3JzLmdldChfc3luYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8uaGFzT3duUHJvcGVydHkoTFNQTVNHX0VSUk9SX1RBRykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rvci5yZWplY3QocmVzdWx0W0xTUE1TR19FUlJPUl9UQUddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdG9yLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNBY3RvcnMuZGVsZXRlKF9zeW5jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi51c2VyTW9kZWxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc1NoYWRvd01vZGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX3BsdWdpbkxvY2FsPy50b0pTT04oKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBtID0gbmV3IE1vZGVsKG1vZGVsKTtcbiAgICAgICAgY29uc3QgaGFuZHNoYWtlID0gcG0uc2VuZEhhbmRzaGFrZVJlcGx5KCk7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9ICdwZW5kaW5nJztcbiAgICAgICAgYXdhaXQgaGFuZHNoYWtlLnRoZW4oKHJlZlBhcmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGQgPSByZWZQYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY2FsbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkID0ge30sIGFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9ICsrc3luY1RhZztcbiAgICAgICAgICAgICAgICAgICAgc3luY0FjdG9ycy5zZXQodGFnLCBhY3Rvcik7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuX3N5bmMgPSB0YWc7XG4gICAgICAgICAgICAgICAgICAgIGFjdG9yLnNldFRhZyhgYXN5bmMgY2FsbCAjJHt0YWd9YCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKCdhc3luYyBjYWxsICMnLCB0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWZQYXJlbnQuZW1pdChMU1BNU0dGbihtb2RlbC5iYXNlSW5mby5pZCksIHsgdHlwZSwgcGF5bG9hZCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0b3I/LnByb21pc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJNb2RlbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxbdHlwZV0ocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbbW9kZWwgbWV0aG9kXSAjJHt0eXBlfSBub3QgZXhpc3RlZGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBhY3RvcnMgR0NcbiAgICAgICAgICAgIHN5bmNHQ1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzeW5jQWN0b3JzLnNpemUgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2Ygc3luY0FjdG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuc2V0dGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNBY3RvcnMuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMTAwMCAqIDYwICogMzApO1xuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIG1vZGVsLmJhc2VJbmZvO1xuICAgIH1cbiAgICBhc3luYyBjYWxsKHR5cGUsIHBheWxvYWQgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbD8uY2FsbCh0aGlzLCB0eXBlLCBwYXlsb2FkKTtcbiAgICB9XG4gICAgYXN5bmMgY2FsbEFzeW5jKHR5cGUsIHBheWxvYWQgPSB7fSkge1xuICAgICAgICBjb25zdCBhY3RvciA9IGRlZmVycmVkKDEwMDAgKiAxMCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsPy5jYWxsKHRoaXMsIHR5cGUsIHBheWxvYWQsIGFjdG9yKTtcbiAgICB9XG4gICAgYXN5bmMgY2FsbFVzZXJNb2RlbCh0eXBlLCBwYXlsb2FkID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxVc2VyTW9kZWw/LmNhbGwodGhpcywgdHlwZSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIGFzeW5jIF9zZXR1cElmcmFtZVNhbmRib3goKSB7XG4gICAgICAgIGNvbnN0IGNudCA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy5fcGx1Z2luTG9jYWw7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGwub3B0aW9ucy5lbnRyeSk7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXNcbiAgICAgICAgICAgIC5zZXQoYF9fdl9fYCwgSVNfREVWID8gRGF0ZS5ub3coKS50b1N0cmluZygpIDogcGwub3B0aW9ucy52ZXJzaW9uKTtcbiAgICAgICAgY29uc3QgcHQgPSBuZXcgUG9zdG1hdGUoe1xuICAgICAgICAgICAgY29udGFpbmVyOiBjbnQsIHVybDogdXJsLmhyZWYsXG4gICAgICAgICAgICBjbGFzc0xpc3RBcnJheTogWydsc3AtaWZyYW1lLXNhbmRib3gnXSxcbiAgICAgICAgICAgIG1vZGVsOiB7IGJhc2VJbmZvOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBsLnRvSlNPTigpKSkgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGhhbmRzaGFrZSA9IHB0LnNlbmRIYW5kc2hha2UoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAvLyB0aW1lb3V0IGZvciBoYW5kc2hha2VcbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBoYW5kc2hha2UgVGltZW91dGApKTtcbiAgICAgICAgICAgIH0sIDMgKiAxMDAwKTsgLy8gM3NlY3NcbiAgICAgICAgICAgIGhhbmRzaGFrZS50aGVuKChyZWZDaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHJlZkNoaWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICByZWZDaGlsZC5mcmFtZS5zZXRBdHRyaWJ1dGUoJ2lkJywgcGwuaWQpO1xuICAgICAgICAgICAgICAgIHJlZkNoaWxkLm9uKExTUE1TR0ZuKHBsLmlkKSwgKHsgdHlwZSwgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbY2FsbCBmcm9tIHBsdWdpbl0gYCwgdHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsPy5lbWl0KHR5cGUsIHBheWxvYWQgfHwge30pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGwgPSBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgYWxsIHdpbGwgZ2V0IG1lc3NhZ2UgYmVmb3JlIGhhbmRzaGFrZWRcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVmQ2hpbGQuY2FsbChMU1BNU0dGbihwbC5pZCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFyZ3NbMF0sIHBheWxvYWQ6IE9iamVjdC5hc3NpZ24oYXJnc1sxXSB8fCB7fSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkcGlkOiBwbC5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsVXNlck1vZGVsID0gYXN5bmMgKHR5cGUsIHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aChGTEFHX0FXQUlUKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYXR0YWNoIHBheWxvYWQgd2l0aCBtZXRob2QgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlZkNoaWxkLmdldCh0eXBlLnJlcGxhY2UoRkxBR19BV0FJVCwgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNoaWxkLmNhbGwodHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgZGVidWcoJ1tpZnJhbWUgc2FuZGJveF0gZXJyb3InLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3NldHVwU2hhZG93U2FuZGJveCgpIHtcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5fc2hhZG93ID0gbmV3IExTUGx1Z2luU2hhZG93RnJhbWUocGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgYXdhaXQgc2hhZG93LmxvYWQoKTtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkID0ge30sIGFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgYWN0b3IgJiYgKHBheWxvYWQuYWN0b3IgPSBhY3Rvcik7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBDYWxsIGluIHNhbWUgdGhyZWFkXG4gICAgICAgICAgICAgICAgdGhpcy5fcGx1Z2luTG9jYWw/LmVtaXQodHlwZSwgT2JqZWN0LmFzc2lnbihwYXlsb2FkLCB7XG4gICAgICAgICAgICAgICAgICAgICQkcGlkOiBwbC5pZFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0b3I/LnByb21pc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJNb2RlbCA9IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlPy5zdGFydHNXaXRoKEZMQUdfQVdBSVQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnJlcGxhY2UoRkxBR19BV0FJVCwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXJnc1sxXSB8fCB7fTtcbiAgICAgICAgICAgICAgICBjb25zdCBmbiA9IHRoaXMuX3VzZXJNb2RlbFt0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZuLmNhbGwobnVsbCwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tzaGFkb3cgc2FuZGJveF0gZXJyb3InLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2V4dGVuZFVzZXJNb2RlbChtb2RlbCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLl91c2VyTW9kZWwsIG1vZGVsKTtcbiAgICB9XG4gICAgX2dldFNhbmRib3hJZnJhbWVDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ/LmZyYW1lO1xuICAgIH1cbiAgICBfZ2V0U2FuZGJveFNoYWRvd0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRvdz8uZnJhbWU7XG4gICAgfVxuICAgIHNldCBkZWJ1Z1RhZyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9kZWJ1Z1RhZyA9IHZhbHVlO1xuICAgIH1cbiAgICBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9wYXJlbnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zaGFkb3cpIHtcbiAgICAgICAgICAgIHRoaXMuX3NoYWRvdy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgeyBMU1BsdWdpbkNhbGxlciB9O1xuIiwiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IGRlZXBNZXJnZSwgc2V0dXBJbmplY3RlZFN0eWxlLCBnZW5JRCwgc2V0dXBJbmplY3RlZFRoZW1lLCBzZXR1cEluamVjdGVkVUksIGRlZmVycmVkLCBpbnZva2VIb3N0RXhwb3J0ZWRBcGksIGlzT2JqZWN0LCB3aXRoRmlsZVByb3RvY29sLCBnZXRTREtQYXRoUm9vdCwgUFJPVE9DT0xfRklMRSwgVVJMX0xTUCwgc2FmZXR5UGF0aEpvaW4sIHBhdGgsIHNhZmV0eVBhdGhOb3JtYWxpemUgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgcGx1Z2luSGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IExTUGx1Z2luQ2FsbGVyLCBMU1BNU0dfUkVBRFksIExTUE1TR19TWU5DLCBMU1BNU0csIExTUE1TR19TRVRUSU5HUywgTFNQTVNHX0VSUk9SX1RBRywgTFNQTVNHX0JFRk9SRV9VTkxPQUQsIEFXQUlUX0xTUE1TR0ZuIH0gZnJvbSAnLi9MU1BsdWdpbi5jYWxsZXInO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnc25ha2UtY2FzZSc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdMU1BsdWdpbjpjb3JlJyk7XG5jb25zdCBESVJfUExVR0lOUyA9ICdwbHVnaW5zJztcbi8qKlxuICogVXNlciBzZXR0aW5nc1xuICovXG5jbGFzcyBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3VzZXJQbHVnaW5TZXR0aW5ncztcbiAgICBfc2V0dGluZ3MgPSB7XG4gICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoX3VzZXJQbHVnaW5TZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl91c2VyUGx1Z2luU2V0dGluZ3MgPSBfdXNlclBsdWdpblNldHRpbmdzO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3NldHRpbmdzLCBfdXNlclBsdWdpblNldHRpbmdzKTtcbiAgICB9XG4gICAgZ2V0KGspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzW2tdO1xuICAgIH1cbiAgICBzZXQoaywgdikge1xuICAgICAgICBjb25zdCBvID0gZGVlcE1lcmdlKHt9LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIGlmICh0eXBlb2YgayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5nc1trXSA9PSB2KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzW2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChrKSkge1xuICAgICAgICAgICAgZGVlcE1lcmdlKHRoaXMuX3NldHRpbmdzLCBrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3NldHRpbmdzKSwgbyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbn1cbmNsYXNzIFBsdWdpbkxvZ2dlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3RhZztcbiAgICBfbG9ncyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKF90YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdGFnID0gX3RhZztcbiAgICB9XG4gICAgd3JpdGUodHlwZSwgcGF5bG9hZCkge1xuICAgICAgICBsZXQgbXNnID0gcGF5bG9hZC5yZWR1Y2UoKGFjLCBpdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ICYmIGl0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhYyArPSBgJHtpdC5tZXNzYWdlfSAke2l0LnN0YWNrfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhYyArPSBpdC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjO1xuICAgICAgICB9LCBgWyR7dGhpcy5fdGFnfV1bJHtuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpfV0gYCk7XG4gICAgICAgIHRoaXMuX2xvZ3MucHVzaChbdHlwZSwgbXNnXSk7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9sb2dzID0gW107XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyk7XG4gICAgfVxuICAgIGluZm8oLi4uYXJncykge1xuICAgICAgICB0aGlzLndyaXRlKCdJTkZPJywgYXJncyk7XG4gICAgfVxuICAgIGVycm9yKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZSgnRVJST1InLCBhcmdzKTtcbiAgICB9XG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGUoJ1dBUk4nLCBhcmdzKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9ncztcbiAgICB9XG59XG52YXIgUGx1Z2luTG9jYWxMb2FkU3RhdHVzO1xuKGZ1bmN0aW9uIChQbHVnaW5Mb2NhbExvYWRTdGF0dXMpIHtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJMT0FESU5HXCJdID0gXCJsb2FkaW5nXCI7XG4gICAgUGx1Z2luTG9jYWxMb2FkU3RhdHVzW1wiVU5MT0FESU5HXCJdID0gXCJ1bmxvYWRpbmdcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJMT0FERURcIl0gPSBcImxvYWRlZFwiO1xuICAgIFBsdWdpbkxvY2FsTG9hZFN0YXR1c1tcIlVOTE9BREVEXCJdID0gXCJ1bmxvYWRcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJFUlJPUlwiXSA9IFwiZXJyb3JcIjtcbn0pKFBsdWdpbkxvY2FsTG9hZFN0YXR1cyB8fCAoUGx1Z2luTG9jYWxMb2FkU3RhdHVzID0ge30pKTtcbmZ1bmN0aW9uIGluaXRVc2VyU2V0dGluZ3NIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGNvbnN0IF8gPSAobGFiZWwpID0+IGBzZXR0aW5nczoke2xhYmVsfWA7XG4gICAgcGx1Z2luTG9jYWwub24oXygndXBkYXRlJyksIChhdHRycykgPT4ge1xuICAgICAgICBpZiAoIWF0dHJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBwbHVnaW5Mb2NhbC5zZXR0aW5ncz8uc2V0KGF0dHJzKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRNYWluVUlIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGNvbnN0IF8gPSAobGFiZWwpID0+IGBtYWluLXVpOiR7bGFiZWx9YDtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd2aXNpYmxlJyksICh7IHZpc2libGUsIHRvZ2dsZSwgY3Vyc29yIH0pID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBwbHVnaW5Mb2NhbC5nZXRNYWluVUkoKTtcbiAgICAgICAgZWw/LmNsYXNzTGlzdFt0b2dnbGUgPyAndG9nZ2xlJyA6ICh2aXNpYmxlID8gJ2FkZCcgOiAncmVtb3ZlJyldKCd2aXNpYmxlJyk7XG4gICAgICAgIC8vIHBsdWdpbkxvY2FsLmNhbGxlciEuY2FsbFVzZXJNb2RlbChMU1BNU0csIHsgdHlwZTogXygndmlzaWJsZScpLCBwYXlsb2FkOiB2aXNpYmxlIH0pXG4gICAgICAgIC8vIGF1dG8gZm9jdXMgZnJhbWVcbiAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgIGlmICghcGx1Z2luTG9jYWwuc2hhZG93ICYmIGVsKSB7XG4gICAgICAgICAgICAgICAgZWwuY29udGVudFdpbmRvdz8uZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ3Jlc3RvcmVfZWRpdGluZ19jdXJzb3InKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ2F0dHJzJyksIChhdHRycykgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHBsdWdpbkxvY2FsLmdldE1haW5VSSgpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhhdHRycykuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBlbD8uc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCdzdHlsZScpLCAoc3R5bGUpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBwbHVnaW5Mb2NhbC5nZXRNYWluVUkoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc3R5bGUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGVba10gPSB2O1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRQcm92aWRlckhhbmRsZXJzKHBsdWdpbkxvY2FsKSB7XG4gICAgbGV0IF8gPSAobGFiZWwpID0+IGBwcm92aWRlcjoke2xhYmVsfWA7XG4gICAgbGV0IHRoZW1lZCA9IGZhbHNlO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3RoZW1lJyksICh0aGVtZSkgPT4ge1xuICAgICAgICBwbHVnaW5Mb2NhbC50aGVtZU1nci5yZWdpc3RlclRoZW1lKHBsdWdpbkxvY2FsLmlkLCB0aGVtZSk7XG4gICAgICAgIGlmICghdGhlbWVkKSB7XG4gICAgICAgICAgICBwbHVnaW5Mb2NhbC5fZGlzcG9zZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwudGhlbWVNZ3IudW5yZWdpc3RlclRoZW1lKHBsdWdpbkxvY2FsLmlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhlbWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3N0eWxlJyksIChzdHlsZSkgPT4ge1xuICAgICAgICBsZXQga2V5O1xuICAgICAgICBpZiAodHlwZW9mIHN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAga2V5ID0gc3R5bGUua2V5O1xuICAgICAgICAgICAgc3R5bGUgPSBzdHlsZS5zdHlsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0eWxlIHx8ICFzdHlsZS50cmltKCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHBsdWdpbkxvY2FsLl9kaXNwb3NlKHNldHVwSW5qZWN0ZWRTdHlsZShzdHlsZSwge1xuICAgICAgICAgICAgJ2RhdGEtaW5qZWN0ZWQtc3R5bGUnOiBrZXkgPyBgJHtrZXl9LSR7cGx1Z2luTG9jYWwuaWR9YCA6ICcnLFxuICAgICAgICAgICAgJ2RhdGEtcmVmJzogcGx1Z2luTG9jYWwuaWRcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3VpJyksICh1aSkgPT4ge1xuICAgICAgICBwbHVnaW5Mb2NhbC5fb25Ib3N0TW91bnRlZCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBzYWZlIHRlbXBsYXRlXG4gICAgICAgICAgICB1aS50ZW1wbGF0ZSA9IERPTVB1cmlmeS5zYW5pdGl6ZSh1aS50ZW1wbGF0ZSwge1xuICAgICAgICAgICAgICAgIEFERF9UQUdTOiBbJ2lmcmFtZSddLFxuICAgICAgICAgICAgICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTOiB0cnVlLFxuICAgICAgICAgICAgICAgIEFERF9BVFRSOiBbJ2FsbG93JywgJ3NyYycsICdhbGxvd2Z1bGxzY3JlZW4nLCAnZnJhbWVib3JkZXInLCAnc2Nyb2xsaW5nJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGx1Z2luTG9jYWwuX2Rpc3Bvc2Uoc2V0dXBJbmplY3RlZFVJLmNhbGwocGx1Z2luTG9jYWwsIHVpLCB7XG4gICAgICAgICAgICAgICAgJ2RhdGEtcmVmJzogcGx1Z2luTG9jYWwuaWRcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpbml0QXBpUHJveHlIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGxldCBfID0gKGxhYmVsKSA9PiBgYXBpOiR7bGFiZWx9YDtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCdjYWxsJyksIGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGxldCByZXQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXQgPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkocGF5bG9hZC5tZXRob2QsIC4uLnBheWxvYWQuYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldCA9IHtcbiAgICAgICAgICAgICAgICBbTFNQTVNHX0VSUk9SX1RBR106IGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgX3N5bmMgfSA9IHBheWxvYWQ7XG4gICAgICAgIGlmIChwbHVnaW5Mb2NhbC5zaGFkb3cpIHtcbiAgICAgICAgICAgIGlmIChwYXlsb2FkLmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5hY3Rvci5yZXNvbHZlKHJldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9zeW5jICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcGx5ID0gKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHBsdWdpbkxvY2FsLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0dfU1lOQywge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQsIF9zeW5jXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJldCkudGhlbihyZXBseSwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9MU1BSZXNvdXJjZShmdWxsVXJsLCBkb3RQbHVnaW5Sb290KSB7XG4gICAgaWYgKGRvdFBsdWdpblJvb3QgJiZcbiAgICAgICAgZnVsbFVybC5zdGFydHNXaXRoKFBST1RPQ09MX0ZJTEUgKyBkb3RQbHVnaW5Sb290KSkge1xuICAgICAgICBmdWxsVXJsID0gc2FmZXR5UGF0aEpvaW4oVVJMX0xTUCwgZnVsbFVybC5zdWJzdHIoUFJPVE9DT0xfRklMRS5sZW5ndGggKyBkb3RQbHVnaW5Sb290Lmxlbmd0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gZnVsbFVybDtcbn1cbmNsYXNzIElsbGVnYWxQbHVnaW5QYWNrYWdlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvci5uYW1lO1xuICAgIH1cbn1cbmNsYXNzIEV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBFeGlzdGVkSW1wb3J0ZWRQbHVnaW5QYWNrYWdlRXJyb3IubmFtZTtcbiAgICB9XG59XG4vKipcbiAqIEhvc3QgcGx1Z2luIGZvciBsb2NhbFxuICovXG5jbGFzcyBQbHVnaW5Mb2NhbCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX29wdGlvbnM7XG4gICAgX3RoZW1lTWdyO1xuICAgIF9jdHg7XG4gICAgX2Rpc3Bvc2VzID0gW107XG4gICAgX2lkO1xuICAgIF9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FERUQ7XG4gICAgX2xvYWRFcnI7XG4gICAgX2xvY2FsUm9vdDtcbiAgICBfZG90U2V0dGluZ3NGaWxlO1xuICAgIF9jYWxsZXI7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIF9vcHRpb25zXG4gICAgICogQHBhcmFtIF90aGVtZU1nclxuICAgICAqIEBwYXJhbSBfY3R4XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMsIF90aGVtZU1nciwgX2N0eCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuX3RoZW1lTWdyID0gX3RoZW1lTWdyO1xuICAgICAgICB0aGlzLl9jdHggPSBfY3R4O1xuICAgICAgICB0aGlzLl9pZCA9IF9vcHRpb25zLmtleSB8fCBnZW5JRCgpO1xuICAgICAgICBpbml0VXNlclNldHRpbmdzSGFuZGxlcnModGhpcyk7XG4gICAgICAgIGluaXRNYWluVUlIYW5kbGVycyh0aGlzKTtcbiAgICAgICAgaW5pdFByb3ZpZGVySGFuZGxlcnModGhpcyk7XG4gICAgICAgIGluaXRBcGlQcm94eUhhbmRsZXJzKHRoaXMpO1xuICAgIH1cbiAgICBhc3luYyBfc2V0dXBVc2VyU2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IHsgX29wdGlvbnMgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGtleSA9IF9vcHRpb25zLm5hbWUucmVwbGFjZSgvW15hLXowLTldL2dpLCAnXycpLnRvTG93ZXJDYXNlKCkgKyAnXycgKyB0aGlzLmlkO1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBfb3B0aW9ucy5sb2dnZXIgPSBuZXcgUGx1Z2luTG9nZ2VyKCdMb2FkZXInKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IFt1c2VyU2V0dGluZ3NGaWxlUGF0aCwgdXNlclNldHRpbmdzXSA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSgnbG9hZF9wbHVnaW5fdXNlcl9zZXR0aW5ncycsIGtleSk7XG4gICAgICAgICAgICB0aGlzLl9kb3RTZXR0aW5nc0ZpbGUgPSB1c2VyU2V0dGluZ3NGaWxlUGF0aDtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gX29wdGlvbnMuc2V0dGluZ3MgPSBuZXcgUGx1Z2luU2V0dGluZ3ModXNlclNldHRpbmdzKTtcbiAgICAgICAgICAgIC8vIG9ic2VydmUgc2V0dGluZ3NcbiAgICAgICAgICAgIHNldHRpbmdzLm9uKCdjaGFuZ2UnLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdsaW5rZWQgc2V0dGluZ3MgY2hhbmdlJywgYSk7XG4gICAgICAgICAgICAgICAgaWYgKCFhLmRpc2FibGVkICYmIGIuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5hYmxlIHBsdWdpblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGEuZGlzYWJsZWQgJiYgIWIuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBwbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bmxvYWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlSG9zdEV4cG9ydGVkQXBpKGBzYXZlX3BsdWdpbl91c2VyX3NldHRpbmdzYCwga2V5LCBhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tsb2FkIHBsdWdpbiB1c2VyIHNldHRpbmdzIEVycm9yXScsIGUpO1xuICAgICAgICAgICAgbG9nZ2VyPy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRNYWluVUkoKSB7XG4gICAgICAgIGlmICh0aGlzLnNoYWRvdykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGVyPy5fZ2V0U2FuZGJveFNoYWRvd0NvbnRhaW5lcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxlcj8uX2dldFNhbmRib3hJZnJhbWVDb250YWluZXIoKTtcbiAgICB9XG4gICAgX3Jlc29sdmVSZXNvdXJjZUZ1bGxVcmwoZmlsZVBhdGgsIGxvY2FsUm9vdCkge1xuICAgICAgICBsb2NhbFJvb3QgPSBsb2NhbFJvb3QgfHwgdGhpcy5fbG9jYWxSb290O1xuICAgICAgICBjb25zdCByZWcgPSAvXihodHRwfGZpbGUpLztcbiAgICAgICAgaWYgKCFyZWcudGVzdChmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHBhdGguam9pbihsb2NhbFJvb3QsIGZpbGVQYXRoKTtcbiAgICAgICAgICAgIGZpbGVQYXRoID0gcmVnLnRlc3QodXJsKSA/IHVybCA6IChQUk9UT0NPTF9GSUxFICsgdXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCA/XG4gICAgICAgICAgICBjb252ZXJ0VG9MU1BSZXNvdXJjZShmaWxlUGF0aCwgdGhpcy5kb3RQbHVnaW5zUm9vdCkgOiBmaWxlUGF0aDtcbiAgICB9XG4gICAgYXN5bmMgX3ByZXBhcmVQYWNrYWdlQ29uZmlncygpIHtcbiAgICAgICAgY29uc3QgeyB1cmwgfSA9IHRoaXMuX29wdGlvbnM7XG4gICAgICAgIGxldCBwa2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCByZXNvbHZlIHBhY2thZ2UgY29uZmlnIGxvY2F0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1ZygncHJlcGFyZSBwYWNrYWdlIHJvb3QnLCB1cmwpO1xuICAgICAgICAgICAgcGtnID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdsb2FkX3BsdWdpbl9jb25maWcnLCB1cmwpO1xuICAgICAgICAgICAgaWYgKCFwa2cgfHwgKHBrZyA9IEpTT04ucGFyc2UocGtnKSwgIXBrZykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcnNlIHBhY2thZ2UgY29uZmlnIGVycm9yICMke3VybH0vcGFja2FnZS5qc29uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGljayBsZWdhbCBhdHRyc1xuICAgICAgICBbJ25hbWUnLCAnYXV0aG9yJywgJ3JlcG9zaXRvcnknLCAndmVyc2lvbicsICdkZXNjcmlwdGlvbiddLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zW2tdID0gcGtnW2tdO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbG9jYWxSb290ID0gdGhpcy5fbG9jYWxSb290ID0gc2FmZXR5UGF0aE5vcm1hbGl6ZSh1cmwpO1xuICAgICAgICBjb25zdCBsb2dzZXEgPSBwa2cubG9nc2VxIHx8IHt9O1xuICAgICAgICBjb25zdCB2YWxpZGF0ZU1haW4gPSAobWFpbikgPT4gbWFpbiAmJiAvXFwuKGpzfGh0bWwpJC8udGVzdChtYWluKTtcbiAgICAgICAgLy8gRW50cnkgZnJvbSBtYWluXG4gICAgICAgIGlmICh2YWxpZGF0ZU1haW4ocGtnLm1haW4pKSB7IC8vIFRoZW1lIGhhcyBubyBtYWluXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmVudHJ5ID0gdGhpcy5fcmVzb2x2ZVJlc291cmNlRnVsbFVybChwa2cubWFpbiwgbG9jYWxSb290KTtcbiAgICAgICAgICAgIGlmIChsb2dzZXEubW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMubW9kZSA9IGxvZ3NlcS5tb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGljb24gPSBsb2dzZXEuaWNvbiB8fCBwa2cuaWNvbjtcbiAgICAgICAgaWYgKGljb24pIHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuaWNvbiA9IHRoaXMuX3Jlc29sdmVSZXNvdXJjZUZ1bGxVcmwoaWNvbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogc3RyYXRlZ3kgZm9yIExvZ3NlcSBwbHVnaW5zIGNlbnRlclxuICAgICAgICBpZiAobG9nc2VxLmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9pZCA9IGxvZ3NlcS5pZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZ3NlcS5pZCA9IHRoaXMuaWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSgnc2F2ZV9wbHVnaW5fY29uZmlnJywgdXJsLCB7IC4uLnBrZywgbG9nc2VxIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnW3NhdmUgcGx1Z2luIElEIEVycm9yXSAnLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSBpZFxuICAgICAgICBjb25zdCB7IHJlZ2lzdGVyZWRQbHVnaW5zLCBpc1JlZ2lzdGVyaW5nIH0gPSB0aGlzLl9jdHg7XG4gICAgICAgIGlmIChpc1JlZ2lzdGVyaW5nICYmIHJlZ2lzdGVyZWRQbHVnaW5zLmhhcyhsb2dzZXEuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yKCdwcmVwYXJlIHBhY2thZ2UgRXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyAwLiBJbnN0YWxsIFRoZW1lc1xuICAgICAgICAgICAgICAgIGxldCB0aGVtZXMgPSBsb2dzZXEudGhlbWVzO1xuICAgICAgICAgICAgICAgIGlmICh0aGVtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZENvbmZpZ1RoZW1lcyhBcnJheS5pc0FycmF5KHRoZW1lcykgPyB0aGVtZXMgOiBbdGhlbWVzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnW3ByZXBhcmUgcGFja2FnZSBlZmZlY3QgRXJyb3JdJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGFzeW5jIF90cnlUb05vcm1hbGl6ZUVudHJ5KCkge1xuICAgICAgICBsZXQgeyBlbnRyeSwgc2V0dGluZ3MgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgbGV0IGRldkVudHJ5ID0gc2V0dGluZ3M/LmdldCgnX2RldkVudHJ5Jyk7XG4gICAgICAgIGlmIChkZXZFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5lbnRyeSA9IGRldkVudHJ5O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50cnkuZW5kc1dpdGgoJy5qcycpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZGlyUGF0aEluc3RhbGxlZCA9IG51bGw7XG4gICAgICAgIGxldCB0bXBfZmlsZV9tZXRob2QgPSAnd3JpdGVfdXNlcl90bXBfZmlsZSc7XG4gICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGVkSW5Eb3RSb290KSB7XG4gICAgICAgICAgICB0bXBfZmlsZV9tZXRob2QgPSAnd3JpdGVfZG90ZGlyX2ZpbGUnO1xuICAgICAgICAgICAgZGlyUGF0aEluc3RhbGxlZCA9IHRoaXMuX2xvY2FsUm9vdC5yZXBsYWNlKHRoaXMuZG90UGx1Z2luc1Jvb3QsICcnKTtcbiAgICAgICAgICAgIGRpclBhdGhJbnN0YWxsZWQgPSBwYXRoLmpvaW4oRElSX1BMVUdJTlMsIGRpclBhdGhJbnN0YWxsZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZGtQYXRoUm9vdCA9IGF3YWl0IGdldFNES1BhdGhSb290KCk7XG4gICAgICAgIGxldCBlbnRyeVBhdGggPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkodG1wX2ZpbGVfbWV0aG9kLCBgJHt0aGlzLl9pZH1faW5kZXguaHRtbGAsIGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICA8dGl0bGU+bG9nc2VxIHBsdWdpbiBlbnRyeTwvdGl0bGU+XG4gICAgPHNjcmlwdCBzcmM9XCIke3Nka1BhdGhSb290fS9sc3BsdWdpbi51c2VyLmpzXCI+PC9zY3JpcHQ+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gIDxkaXYgaWQ9XCJhcHBcIj48L2Rpdj5cbiAgPHNjcmlwdCBzcmM9XCIke2VudHJ5fVwiPjwvc2NyaXB0PlxuICA8L2JvZHk+XG48L2h0bWw+YCwgZGlyUGF0aEluc3RhbGxlZCk7XG4gICAgICAgIGVudHJ5ID0gY29udmVydFRvTFNQUmVzb3VyY2Uod2l0aEZpbGVQcm90b2NvbChwYXRoLm5vcm1hbGl6ZShlbnRyeVBhdGgpKSwgdGhpcy5kb3RQbHVnaW5zUm9vdCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMuZW50cnkgPSBlbnRyeTtcbiAgICB9XG4gICAgYXN5bmMgX2xvYWRDb25maWdUaGVtZXModGhlbWVzKSB7XG4gICAgICAgIHRoZW1lcy5mb3JFYWNoKChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy51cmwuc3RhcnRzV2l0aCgnaHR0cCcpICYmIHRoaXMuX2xvY2FsUm9vdCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gcGF0aC5qb2luKHRoaXMuX2xvY2FsUm9vdCwgb3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgICAgIC8vIGZpbGU6Ly8gZm9yIG5hdGl2ZVxuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy51cmwuc3RhcnRzV2l0aCgnZmlsZTonKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9ICdhc3NldHM6Ly8nICsgb3B0aW9ucy51cmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdwcm92aWRlcjp0aGVtZScsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgbG9hZChyZWFkeUluZGljYXRvcikge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLkxPQURJTkc7XG4gICAgICAgIHRoaXMuX2xvYWRFcnIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMub3B0aW9ucy5lbnRyeSkgeyAvLyBUaGVtZXMgcGFja2FnZSBubyBlbnRyeSBmaWVsZFxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgbGV0IGluc3RhbGxQYWNrYWdlVGhlbWVzID0gYXdhaXQgdGhpcy5fcHJlcGFyZVBhY2thZ2VDb25maWdzKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXR1cFVzZXJTZXR0aW5ncygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaW5zdGFsbFBhY2thZ2VUaGVtZXMuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLm9wdGlvbnMuZW50cnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl90cnlUb05vcm1hbGl6ZUVudHJ5KCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsZXIgPSBuZXcgTFNQbHVnaW5DYWxsZXIodGhpcyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9jYWxsZXIuY29ubmVjdFRvQ2hpbGQoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlYWR5Rm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbGVyPy5jYWxsVXNlck1vZGVsKExTUE1TR19SRUFEWSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlYWR5SW5kaWNhdG9yKSB7XG4gICAgICAgICAgICAgICAgcmVhZHlJbmRpY2F0b3IucHJvbWlzZS50aGVuKHJlYWR5Rm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVhZHlGbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGlzcG9zZXMucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2FsbGVyPy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tMb2FkIFBsdWdpbiBFcnJvcl0gJywgZSk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlcj8uZXJyb3IoZSk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuRVJST1I7XG4gICAgICAgICAgICB0aGlzLl9sb2FkRXJyID0gZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fbG9hZEVycikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5MT0FERUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlbG9hZCgpIHtcbiAgICAgICAgZGVidWcoJ1RPRE86IHJlbG9hZCBwbHVnaW4nLCB0aGlzLmlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHVucmVnaXN0ZXIgSWYgdHJ1ZSBkZWxldGUgcGx1Z2luIGZpbGVzXG4gICAgICovXG4gICAgYXN5bmMgdW5sb2FkKHVucmVnaXN0ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVucmVnaXN0ZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCkge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdUT0RPOiByZW1vdmUgcGx1Z2luIGxvY2FsIGZpbGVzIGZyb20gdXNlciBob21lIHJvb3QgOiknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLlVOTE9BRElORztcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50QmVmb3JlVW5sb2FkID0geyB1bnJlZ2lzdGVyIH07XG4gICAgICAgICAgICAvLyBzeW5jIGNhbGxcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2FsbGVyPy5jYWxsVXNlck1vZGVsKEFXQUlUX0xTUE1TR0ZuKExTUE1TR19CRUZPUkVfVU5MT0FEKSwgZXZlbnRCZWZvcmVVbmxvYWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYmVmb3JldW5sb2FkJywgZXZlbnRCZWZvcmVVbmxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbYmVmb3JldW5sb2FkIEVycm9yXScsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VubG9hZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbcGx1Z2luIHVubG9hZCBFcnJvcl0nLCBlKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURFRDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBkaXNwb3NlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIHRoaXMuX2Rpc3Bvc2VzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZuICYmIChhd2FpdCBmbigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih0aGlzLmRlYnVnVGFnLCAnZGlzcG9zZSBFcnJvcicsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFyXG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VzID0gW107XG4gICAgfVxuICAgIF9kaXNwb3NlKGZuKSB7XG4gICAgICAgIGlmICghZm4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VzLnB1c2goZm4pO1xuICAgIH1cbiAgICBfb25Ib3N0TW91bnRlZChjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBhY3RvciA9IHRoaXMuX2N0eC5ob3N0TW91bnRlZEFjdG9yO1xuICAgICAgICBpZiAoIWFjdG9yIHx8IGFjdG9yLnNldHRsZWQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhY3Rvcj8ucHJvbWlzZS50aGVuKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNJbnN0YWxsZWRJbkRvdFJvb3QoKSB7XG4gICAgICAgIGNvbnN0IGRvdFJvb3QgPSB0aGlzLmRvdENvbmZpZ1Jvb3Q7XG4gICAgICAgIGNvbnN0IHBsZ1Jvb3QgPSB0aGlzLmxvY2FsUm9vdDtcbiAgICAgICAgcmV0dXJuIGRvdFJvb3QgJiYgcGxnUm9vdCAmJiBwbGdSb290LnN0YXJ0c1dpdGgoZG90Um9vdCk7XG4gICAgfVxuICAgIGdldCBsb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMgPT09IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5MT0FERUQ7XG4gICAgfVxuICAgIGdldCBwZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gW1BsdWdpbkxvY2FsTG9hZFN0YXR1cy5MT0FESU5HLCBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FESU5HXVxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuX3N0YXR1cyk7XG4gICAgfVxuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gICAgfVxuICAgIGdldCBzZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZXR0aW5ncztcbiAgICB9XG4gICAgZ2V0IGxvZ2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2dnZXI7XG4gICAgfVxuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M/LmdldCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgZ2V0IGNhbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxlcjtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICAgIGdldCBzaGFkb3coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubW9kZSA9PT0gJ3NoYWRvdyc7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IHRoZW1lTWdyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhlbWVNZ3I7XG4gICAgfVxuICAgIGdldCBkZWJ1Z1RhZygpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuX29wdGlvbnM/Lm5hbWU7XG4gICAgICAgIHJldHVybiBgIyR7dGhpcy5faWR9ICR7bmFtZSA/PyAnJ31gO1xuICAgIH1cbiAgICBnZXQgbG9jYWxSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX29wdGlvbnMudXJsO1xuICAgIH1cbiAgICBnZXQgbG9hZEVycigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRFcnI7XG4gICAgfVxuICAgIGdldCBkb3RDb25maWdSb290KCkge1xuICAgICAgICByZXR1cm4gcGF0aC5ub3JtYWxpemUodGhpcy5fY3R4Lm9wdGlvbnMuZG90Q29uZmlnUm9vdCk7XG4gICAgfVxuICAgIGdldCBkb3RTZXR0aW5nc0ZpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb3RTZXR0aW5nc0ZpbGU7XG4gICAgfVxuICAgIGdldCBkb3RQbHVnaW5zUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRvdENvbmZpZ1Jvb3QsIERJUl9QTFVHSU5TKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBqc29uID0geyAuLi50aGlzLm9wdGlvbnMgfTtcbiAgICAgICAganNvbi5pZCA9IHRoaXMuaWQ7XG4gICAgICAgIGpzb24uZXJyID0gdGhpcy5sb2FkRXJyO1xuICAgICAgICBqc29uLnVzZiA9IHRoaXMuZG90U2V0dGluZ3NGaWxlO1xuICAgICAgICBqc29uLmlpciA9IHRoaXMuaXNJbnN0YWxsZWRJbkRvdFJvb3Q7XG4gICAgICAgIGpzb24ubHNyID0gdGhpcy5fcmVzb2x2ZVJlc291cmNlRnVsbFVybCgnJyk7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cbi8qKlxuICogSG9zdCBwbHVnaW4gY29yZVxuICovXG5jbGFzcyBMU1BsdWdpbkNvcmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIF9vcHRpb25zO1xuICAgIF9pc1JlZ2lzdGVyaW5nID0gZmFsc2U7XG4gICAgX3JlYWR5SW5kaWNhdG9yO1xuICAgIF9ob3N0TW91bnRlZEFjdG9yID0gZGVmZXJyZWQoKTtcbiAgICBfdXNlclByZWZlcmVuY2VzID0ge307XG4gICAgX3JlZ2lzdGVyZWRUaGVtZXMgPSBuZXcgTWFwKCk7XG4gICAgX3JlZ2lzdGVyZWRQbHVnaW5zID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBfb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICB9XG4gICAgYXN5bmMgbG9hZFVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKGBsb2FkX3VzZXJfcHJlZmVyZW5jZXNgKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlclByZWZlcmVuY2VzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbbG9hZCB1c2VyIHByZWZlcmVuY2VzIEVycm9yXScsIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNhdmVVc2VyUHJlZmVyZW5jZXMoc2V0dGluZ3MpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlclByZWZlcmVuY2VzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoYHNhdmVfdXNlcl9wcmVmZXJlbmNlc2AsIHRoaXMuX3VzZXJQcmVmZXJlbmNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbc2F2ZSB1c2VyIHByZWZlcmVuY2VzIEVycm9yXScsIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGFjdGl2YXRlVXNlclByZWZlcmVuY2VzKCkge1xuICAgICAgICBjb25zdCB7IHRoZW1lIH0gPSB0aGlzLl91c2VyUHJlZmVyZW5jZXM7XG4gICAgICAgIC8vIDAuIHRoZW1lXG4gICAgICAgIGlmICh0aGVtZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RUaGVtZSh0aGVtZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwbHVnaW5zXG4gICAgICogQHBhcmFtIGluaXRpYWxcbiAgICAgKi9cbiAgICBhc3luYyByZWdpc3RlcihwbHVnaW5zLCBpbml0aWFsID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyKFtwbHVnaW5zXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGVyZlRhYmxlID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBkZWJ1Z1BlcmZJbmZvID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEFycmF5LmZyb20ocGVyZlRhYmxlLnZhbHVlcygpKS5yZWR1Y2UoKGFjLCBpdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgb3B0aW9ucywgc3RhdHVzLCBkaXNhYmxlZCB9ID0gaXQubztcbiAgICAgICAgICAgICAgICBhY1tpdC5vLmlkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBlbnRyeTogb3B0aW9ucy5lbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHR5cGVvZiBkaXNhYmxlZCA9PT0gJ2Jvb2xlYW4nID8gKCFkaXNhYmxlZCA/ICfwn5+iJyA6ICfimqvvuI8nKSA6ICfwn5S0JyxcbiAgICAgICAgICAgICAgICAgICAgcGVyZjogIWl0LmUgPyBpdC5vLmxvYWRFcnIgOiBgJHsoaXQuZSAtIGl0LnMpLnRvRml4ZWQoMil9bXNgXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5fX2RlYnVnUGx1Z2luc1BlcmZJbmZvID0gZGVidWdQZXJmSW5mbztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVnaXN0ZXJpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdXNlckNvbmZpZ1Jvb3QgPSB0aGlzLl9vcHRpb25zLmRvdENvbmZpZ1Jvb3Q7XG4gICAgICAgICAgICBjb25zdCByZWFkeUluZGljYXRvciA9IHRoaXMuX3JlYWR5SW5kaWNhdG9yID0gZGVmZXJyZWQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFVzZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICAgICAgY29uc3QgZXh0ZXJuYWxzID0gbmV3IFNldCh0aGlzLl91c2VyUHJlZmVyZW5jZXMuZXh0ZXJuYWxzIHx8IFtdKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2lucyA9IHBsdWdpbnMuY29uY2F0KFsuLi5leHRlcm5hbHNdLmZpbHRlcih1cmwgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXBsdWdpbnMubGVuZ3RoIHx8IHBsdWdpbnMuZXZlcnkoKHApID0+ICFwLmVudHJ5ICYmIChwLnVybCAhPT0gdXJsKSk7XG4gICAgICAgICAgICAgICAgfSkubWFwKHVybCA9PiAoeyB1cmwgfSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luT3B0aW9ucyBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IHBsdWdpbk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTG9jYWwgPSBuZXcgUGx1Z2luTG9jYWwocGx1Z2luT3B0aW9ucywgdGhpcywgdGhpcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZkluZm8gPSB7IG86IHBsdWdpbkxvY2FsLCBzOiBwZXJmb3JtYW5jZS5ub3coKSwgZTogMCB9O1xuICAgICAgICAgICAgICAgIHBlcmZUYWJsZS5zZXQocGx1Z2luTG9jYWwuaWQsIHBlcmZJbmZvKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW5Mb2NhbC5sb2FkKHJlYWR5SW5kaWNhdG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxvYWRFcnIgfSA9IHBsdWdpbkxvY2FsO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbRmFpbGVkIExPQUQgUGx1Z2luXSAjYCwgcGx1Z2luT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBsb2FkRXJyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRFcnIgaW5zdGFuY2VvZiBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkRXJyIGluc3RhbmNlb2YgRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkgZ2xvYmFsIGxvZyBzeXN0ZW0/XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwZXJmSW5mby5lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuc2V0dGluZ3M/Lm9uKCdjaGFuZ2UnLCAoYSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NldHRpbmdzLWNoYW5nZWQnLCBwbHVnaW5Mb2NhbC5pZCwgYSk7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbkxvY2FsLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0dfU0VUVElOR1MsIHsgcGF5bG9hZDogYSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucy5zZXQocGx1Z2luTG9jYWwuaWQsIHBsdWdpbkxvY2FsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCBwbHVnaW5Mb2NhbCk7XG4gICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgcGx1Z2luc1xuICAgICAgICAgICAgICAgIGlmICghcGx1Z2luTG9jYWwuaXNJbnN0YWxsZWRJbkRvdFJvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxzLmFkZCh1cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVVzZXJQcmVmZXJlbmNlcyh7IGV4dGVybmFsczogQXJyYXkuZnJvbShleHRlcm5hbHMpIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZVVzZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICAgICAgcmVhZHlJbmRpY2F0b3IucmVzb2x2ZSgncmVhZHknKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVnaXN0ZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRlYnVnUGVyZkluZm8oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWxvYWQocGx1Z2lucykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGx1Z2lucykpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkKFtwbHVnaW5zXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5lbnN1cmVQbHVnaW4oaWRlbnRpdHkpO1xuICAgICAgICAgICAgYXdhaXQgcC5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyB1bnJlZ2lzdGVyKHBsdWdpbnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXIoW3BsdWdpbnNdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bnJlZ2lzdGVyZWRFeHRlcm5hbHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5lbnN1cmVQbHVnaW4oaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKCFwLmlzSW5zdGFsbGVkSW5Eb3RSb290KSB7XG4gICAgICAgICAgICAgICAgdW5yZWdpc3RlcmVkRXh0ZXJuYWxzLnB1c2gocC5vcHRpb25zLnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBwLnVubG9hZCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zLmRlbGV0ZShpZGVudGl0eSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIGlkZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXh0ZXJuYWxzID0gdGhpcy5fdXNlclByZWZlcmVuY2VzLmV4dGVybmFscyB8fCBbXTtcbiAgICAgICAgaWYgKGV4dGVybmFscy5sZW5ndGggJiYgdW5yZWdpc3RlcmVkRXh0ZXJuYWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlVXNlclByZWZlcmVuY2VzKHtcbiAgICAgICAgICAgICAgICBleHRlcm5hbHM6IGV4dGVybmFscy5maWx0ZXIoKGl0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhdW5yZWdpc3RlcmVkRXh0ZXJuYWxzLmluY2x1ZGVzKGl0KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZW5hYmxlKHBsdWdpbikge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5lbnN1cmVQbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgaWYgKHAucGVuZGluZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5lbWl0KCdiZWZvcmVlbmFibGUnKTtcbiAgICAgICAgcC5zZXR0aW5ncz8uc2V0KCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmFibGVkJywgcC5pZCk7XG4gICAgfVxuICAgIGFzeW5jIGRpc2FibGUocGx1Z2luKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuc3VyZVBsdWdpbihwbHVnaW4pO1xuICAgICAgICBpZiAocC5wZW5kaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZWRpc2FibGUnKTtcbiAgICAgICAgcC5zZXR0aW5ncz8uc2V0KCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICB0aGlzLmVtaXQoJ2Rpc2FibGVkJywgcC5pZCk7XG4gICAgfVxuICAgIGFzeW5jIF9ob29rKG5zLCB0eXBlLCBwYXlsb2FkLCBwaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbXywgcF0gb2YgdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnMpIHtcbiAgICAgICAgICAgIGlmICghcGlkIHx8IHBpZCA9PT0gcC5pZCkge1xuICAgICAgICAgICAgICAgIHAuY2FsbGVyPy5jYWxsVXNlck1vZGVsKExTUE1TRywge1xuICAgICAgICAgICAgICAgICAgICBucywgdHlwZTogc25ha2VDYXNlKHR5cGUpLCBwYXlsb2FkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaG9va0FwcCh0eXBlLCBwYXlsb2FkLCBwaWQpIHtcbiAgICAgICAgdGhpcy5faG9vayhgaG9vazphcHBgLCB0eXBlLCBwYXlsb2FkLCBwaWQpO1xuICAgIH1cbiAgICBob29rRWRpdG9yKHR5cGUsIHBheWxvYWQsIHBpZCkge1xuICAgICAgICB0aGlzLl9ob29rKGBob29rOmVkaXRvcmAsIHR5cGUsIHBheWxvYWQsIHBpZCk7XG4gICAgfVxuICAgIF9leGVjRGlyZWN0aXZlKHRhZywgLi4ucGFyYW1zKSB7XG4gICAgfVxuICAgIGVuc3VyZVBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgaWYgKHBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbkxvY2FsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGx1Z2luO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucy5nZXQocGx1Z2luKTtcbiAgICAgICAgaWYgKCFwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBsdWdpbiAjJHtwbHVnaW59IG5vdCBleGlzdGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICBob3N0TW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5faG9zdE1vdW50ZWRBY3Rvci5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldCByZWdpc3RlcmVkUGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIGdldCByZWFkeUluZGljYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWR5SW5kaWNhdG9yO1xuICAgIH1cbiAgICBnZXQgaG9zdE1vdW50ZWRBY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3RNb3VudGVkQWN0b3I7XG4gICAgfVxuICAgIGdldCBpc1JlZ2lzdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNSZWdpc3RlcmluZztcbiAgICB9XG4gICAgZ2V0IHRoZW1lcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXM7XG4gICAgfVxuICAgIGFzeW5jIHJlZ2lzdGVyVGhlbWUoaWQsIG9wdCkge1xuICAgICAgICBkZWJ1ZygncmVnaXN0ZXJlZCBUaGVtZSAjJywgaWQsIG9wdCk7XG4gICAgICAgIGlmICghaWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB0aGVtZXMgPSB0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLmdldChpZCk7XG4gICAgICAgIGlmICghdGhlbWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLnNldChpZCwgdGhlbWVzID0gW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoZW1lcy5wdXNoKG9wdCk7XG4gICAgICAgIHRoaXMuZW1pdCgndGhlbWUtY2hhbmdlZCcsIHRoaXMudGhlbWVzLCB7IGlkLCAuLi5vcHQgfSk7XG4gICAgfVxuICAgIGFzeW5jIHNlbGVjdFRoZW1lKG9wdCwgZWZmZWN0ID0gdHJ1ZSkge1xuICAgICAgICBzZXR1cEluamVjdGVkVGhlbWUob3B0Py51cmwpO1xuICAgICAgICB0aGlzLmVtaXQoJ3RoZW1lLXNlbGVjdGVkJywgb3B0KTtcbiAgICAgICAgZWZmZWN0ICYmIHRoaXMuc2F2ZVVzZXJQcmVmZXJlbmNlcyh7IHRoZW1lOiBvcHQgfSk7XG4gICAgfVxuICAgIGFzeW5jIHVucmVnaXN0ZXJUaGVtZShpZCkge1xuICAgICAgICBkZWJ1ZygndW5yZWdpc3RlcmVkIFRoZW1lICMnLCBpZCk7XG4gICAgICAgIGlmICghdGhpcy5fcmVnaXN0ZXJlZFRoZW1lcy5oYXMoaWQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLmRlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMuZW1pdCgndGhlbWUtY2hhbmdlZCcsIHRoaXMudGhlbWVzLCB7IGlkIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldHVwUGx1Z2luQ29yZShvcHRpb25zKSB7XG4gICAgY29uc3QgcGx1Z2luQ29yZSA9IG5ldyBMU1BsdWdpbkNvcmUob3B0aW9ucyk7XG4gICAgZGVidWcoJz09PSDwn5SXIFNldHVwIExvZ3NlcSBQbHVnaW4gU3lzdGVtIPCflJcgPT09Jyk7XG4gICAgd2luZG93LkxTUGx1Z2luQ29yZSA9IHBsdWdpbkNvcmU7XG59XG5leHBvcnQgeyBQbHVnaW5Mb2NhbCwgcGx1Z2luSGVscGVycywgc2V0dXBQbHVnaW5Db3JlIH07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsImZvcm1hdEFyZ3MiLCJhcmdzIiwidGhpcyIsInVzZUNvbG9ycyIsIm5hbWVzcGFjZSIsImh1bWFuaXplIiwiZGlmZiIsImMiLCJjb2xvciIsInNwbGljZSIsImluZGV4IiwibGFzdEMiLCJyZXBsYWNlIiwibWF0Y2giLCJzYXZlIiwibmFtZXNwYWNlcyIsInN0b3JhZ2UiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVycm9yIiwibG9hZCIsInIiLCJnZXRJdGVtIiwicHJvY2VzcyIsImVudiIsIkRFQlVHIiwid2luZG93IiwidHlwZSIsIl9fbndqcyIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInRvTG93ZXJDYXNlIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzdHlsZSIsIldlYmtpdEFwcGVhcmFuY2UiLCJjb25zb2xlIiwiZmlyZWJ1ZyIsImV4Y2VwdGlvbiIsInRhYmxlIiwicGFyc2VJbnQiLCJSZWdFeHAiLCIkMSIsImxvY2FsU3RvcmFnZSIsImxvY2Fsc3RvcmFnZSIsImRlc3Ryb3kiLCJ3YXJuZWQiLCJ3YXJuIiwiY29sb3JzIiwibG9nIiwiZGVidWciLCJmb3JtYXR0ZXJzIiwiaiIsInYiLCJKU09OIiwic3RyaW5naWZ5IiwibWVzc2FnZSIsImNyZWF0ZURlYnVnIiwicHJldlRpbWUiLCJuYW1lc3BhY2VzQ2FjaGUiLCJlbmFibGVkQ2FjaGUiLCJlbmFibGVPdmVycmlkZSIsImVuYWJsZWQiLCJjdXJyIiwiTnVtYmVyIiwiRGF0ZSIsIm1zIiwicHJldiIsImNvZXJjZSIsInVuc2hpZnQiLCJmb3JtYXQiLCJmb3JtYXR0ZXIiLCJ2YWwiLCJjYWxsIiwiYXBwbHkiLCJzZWxlY3RDb2xvciIsImV4dGVuZCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsImdldCIsInNldCIsImluaXQiLCJkZWxpbWl0ZXIiLCJuZXdEZWJ1ZyIsInRvTmFtZXNwYWNlIiwicmVnZXhwIiwidG9TdHJpbmciLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJkZWZhdWx0IiwiRXJyb3IiLCJzdGFjayIsImRpc2FibGUiLCJuYW1lcyIsIm1hcCIsInNraXBzIiwiam9pbiIsImVuYWJsZSIsImkiLCJzcGxpdCIsImxlbiIsInB1c2giLCJzdWJzdHIiLCJuYW1lIiwidGVzdCIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwiaGFzaCIsImNoYXJDb2RlQXQiLCJNYXRoIiwiYWJzIiwiaGFzT3duUHJvcGVydHkiLCJzZXRQcm90b3R5cGVPZiIsImlzRnJvemVuIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJmcmVlemUiLCJzZWFsIiwiY3JlYXRlIiwiX3JlZiIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJmdW4iLCJ0aGlzVmFsdWUiLCJ4IiwiRnVuYyIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiYmluZCIsImNvbmNhdCIsImFyciIsIkFycmF5IiwiaXNBcnJheSIsImFycjIiLCJmcm9tIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiZnVuYyIsImFycmF5Rm9yRWFjaCIsInVuYXBwbHkiLCJhcnJheVBvcCIsInBvcCIsImFycmF5UHVzaCIsInN0cmluZ1RvTG93ZXJDYXNlIiwiU3RyaW5nIiwic3RyaW5nTWF0Y2giLCJzdHJpbmdSZXBsYWNlIiwic3RyaW5nSW5kZXhPZiIsImluZGV4T2YiLCJzdHJpbmdUcmltIiwidHJpbSIsInJlZ0V4cFRlc3QiLCJ0eXBlRXJyb3JDcmVhdGUiLCJUeXBlRXJyb3IiLCJfbGVuMiIsImFyZ3VtZW50cyIsIl9rZXkyIiwidGhpc0FyZyIsIl9sZW4iLCJfa2V5IiwiYWRkVG9TZXQiLCJhcnJheSIsImwiLCJlbGVtZW50IiwibGNFbGVtZW50IiwiY2xvbmUiLCJvYmplY3QiLCJuZXdPYmplY3QiLCJwcm9wZXJ0eSIsImxvb2t1cEdldHRlciIsInByb3AiLCJkZXNjIiwidmFsdWUiLCJodG1sIiwic3ZnIiwic3ZnRmlsdGVycyIsInN2Z0Rpc2FsbG93ZWQiLCJtYXRoTWwiLCJtYXRoTWxEaXNhbGxvd2VkIiwidGV4dCIsImh0bWwkMSIsInN2ZyQxIiwibWF0aE1sJDEiLCJ4bWwiLCJNVVNUQUNIRV9FWFBSIiwiRVJCX0VYUFIiLCJEQVRBX0FUVFIiLCJBUklBX0FUVFIiLCJJU19BTExPV0VEX1VSSSIsIklTX1NDUklQVF9PUl9EQVRBIiwiQVRUUl9XSElURVNQQUNFIiwiX3R5cGVvZiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwib2JqIiwiY29uc3RydWN0b3IiLCJfdG9Db25zdW1hYmxlQXJyYXkkMSIsImdldEdsb2JhbCIsIl9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kiLCJ0cnVzdGVkVHlwZXMiLCJjcmVhdGVQb2xpY3kiLCJzdWZmaXgiLCJBVFRSX05BTUUiLCJjdXJyZW50U2NyaXB0IiwiaGFzQXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwicG9saWN5TmFtZSIsImNyZWF0ZUhUTUwiLCJodG1sJCQxIiwiXyIsImNyZWF0ZURPTVB1cmlmeSIsInVuZGVmaW5lZCIsIkRPTVB1cmlmeSIsInZlcnNpb24iLCJyZW1vdmVkIiwibm9kZVR5cGUiLCJpc1N1cHBvcnRlZCIsIm9yaWdpbmFsRG9jdW1lbnQiLCJEb2N1bWVudEZyYWdtZW50IiwiSFRNTFRlbXBsYXRlRWxlbWVudCIsIk5vZGUiLCJFbGVtZW50IiwiTm9kZUZpbHRlciIsIl93aW5kb3ckTmFtZWROb2RlTWFwIiwiTmFtZWROb2RlTWFwIiwiTW96TmFtZWRBdHRyTWFwIiwiVGV4dCIsIkNvbW1lbnQiLCJET01QYXJzZXIiLCJFbGVtZW50UHJvdG90eXBlIiwiY2xvbmVOb2RlIiwiZ2V0TmV4dFNpYmxpbmciLCJnZXRDaGlsZE5vZGVzIiwiZ2V0UGFyZW50Tm9kZSIsInRlbXBsYXRlIiwiY3JlYXRlRWxlbWVudCIsImNvbnRlbnQiLCJvd25lckRvY3VtZW50IiwidHJ1c3RlZFR5cGVzUG9saWN5IiwiZW1wdHlIVE1MIiwiUkVUVVJOX1RSVVNURURfVFlQRSIsIl9kb2N1bWVudCIsImltcGxlbWVudGF0aW9uIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaW1wb3J0Tm9kZSIsImRvY3VtZW50TW9kZSIsImhvb2tzIiwiY3JlYXRlSFRNTERvY3VtZW50IiwiTVVTVEFDSEVfRVhQUiQkMSIsIkVSQl9FWFBSJCQxIiwiREFUQV9BVFRSJCQxIiwiQVJJQV9BVFRSJCQxIiwiSVNfU0NSSVBUX09SX0RBVEEkJDEiLCJBVFRSX1dISVRFU1BBQ0UkJDEiLCJJU19BTExPV0VEX1VSSSQkMSIsIkFMTE9XRURfVEFHUyIsIkRFRkFVTFRfQUxMT1dFRF9UQUdTIiwiQUxMT1dFRF9BVFRSIiwiREVGQVVMVF9BTExPV0VEX0FUVFIiLCJGT1JCSURfVEFHUyIsIkZPUkJJRF9BVFRSIiwiQUxMT1dfQVJJQV9BVFRSIiwiQUxMT1dfREFUQV9BVFRSIiwiQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMiLCJTQUZFX0ZPUl9URU1QTEFURVMiLCJXSE9MRV9ET0NVTUVOVCIsIlNFVF9DT05GSUciLCJGT1JDRV9CT0RZIiwiUkVUVVJOX0RPTSIsIlJFVFVSTl9ET01fRlJBR01FTlQiLCJSRVRVUk5fRE9NX0lNUE9SVCIsIlNBTklUSVpFX0RPTSIsIktFRVBfQ09OVEVOVCIsIklOX1BMQUNFIiwiVVNFX1BST0ZJTEVTIiwiRk9SQklEX0NPTlRFTlRTIiwiREVGQVVMVF9GT1JCSURfQ09OVEVOVFMiLCJEQVRBX1VSSV9UQUdTIiwiREVGQVVMVF9EQVRBX1VSSV9UQUdTIiwiVVJJX1NBRkVfQVRUUklCVVRFUyIsIkRFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyIsIk1BVEhNTF9OQU1FU1BBQ0UiLCJTVkdfTkFNRVNQQUNFIiwiSFRNTF9OQU1FU1BBQ0UiLCJOQU1FU1BBQ0UiLCJJU19FTVBUWV9JTlBVVCIsIkNPTkZJRyIsImZvcm1FbGVtZW50IiwiX3BhcnNlQ29uZmlnIiwiY2ZnIiwiQUREX1VSSV9TQUZFX0FUVFIiLCJBRERfREFUQV9VUklfVEFHUyIsIkFMTE9XRURfVVJJX1JFR0VYUCIsIkFERF9UQUdTIiwiQUREX0FUVFIiLCJ0Ym9keSIsIk1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUyIsIkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIiwiQUxMX1NWR19UQUdTIiwiQUxMX01BVEhNTF9UQUdTIiwiX2NoZWNrVmFsaWROYW1lc3BhY2UiLCJwYXJlbnQiLCJ0YWdOYW1lIiwibmFtZXNwYWNlVVJJIiwicGFyZW50VGFnTmFtZSIsIkJvb2xlYW4iLCJjb21tb25TdmdBbmRIVE1MRWxlbWVudHMiLCJfZm9yY2VSZW1vdmUiLCJub2RlIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwib3V0ZXJIVE1MIiwicmVtb3ZlIiwiX3JlbW92ZUF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZU5vZGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJfaW5pdERvY3VtZW50IiwiZGlydHkiLCJkb2MiLCJsZWFkaW5nV2hpdGVzcGFjZSIsIm1hdGNoZXMiLCJkaXJ0eVBheWxvYWQiLCJwYXJzZUZyb21TdHJpbmciLCJjcmVhdGVEb2N1bWVudCIsImlubmVySFRNTCIsImJvZHkiLCJpbnNlcnRCZWZvcmUiLCJjcmVhdGVUZXh0Tm9kZSIsImNoaWxkTm9kZXMiLCJfY3JlYXRlSXRlcmF0b3IiLCJTSE9XX0VMRU1FTlQiLCJTSE9XX0NPTU1FTlQiLCJTSE9XX1RFWFQiLCJfaXNDbG9iYmVyZWQiLCJlbG0iLCJub2RlTmFtZSIsInRleHRDb250ZW50IiwiYXR0cmlidXRlcyIsIl9pc05vZGUiLCJfZXhlY3V0ZUhvb2siLCJlbnRyeVBvaW50IiwiY3VycmVudE5vZGUiLCJkYXRhIiwiaG9vayIsIl9zYW5pdGl6ZUVsZW1lbnRzIiwiYWxsb3dlZFRhZ3MiLCJmaXJzdEVsZW1lbnRDaGlsZCIsIl9pc1ZhbGlkQXR0cmlidXRlIiwibGNUYWciLCJsY05hbWUiLCJfc2FuaXRpemVBdHRyaWJ1dGVzIiwiYXR0ciIsImhvb2tFdmVudCIsImF0dHJOYW1lIiwiYXR0clZhbHVlIiwia2VlcEF0dHIiLCJhbGxvd2VkQXR0cmlidXRlcyIsIl9hdHRyIiwiZm9yY2VLZWVwQXR0ciIsInNldEF0dHJpYnV0ZU5TIiwiX3Nhbml0aXplU2hhZG93RE9NIiwiZnJhZ21lbnQiLCJzaGFkb3dOb2RlIiwic2hhZG93SXRlcmF0b3IiLCJuZXh0Tm9kZSIsInNhbml0aXplIiwiaW1wb3J0ZWROb2RlIiwib2xkTm9kZSIsInJldHVybk5vZGUiLCJ0b1N0YXRpY0hUTUwiLCJhcHBlbmRDaGlsZCIsImZpcnN0Q2hpbGQiLCJub2RlSXRlcmF0b3IiLCJzZXJpYWxpemVkSFRNTCIsInNldENvbmZpZyIsImNsZWFyQ29uZmlnIiwiaXNWYWxpZEF0dHJpYnV0ZSIsInRhZyIsImFkZEhvb2siLCJob29rRnVuY3Rpb24iLCJyZW1vdmVIb29rIiwicmVtb3ZlSG9va3MiLCJyZW1vdmVBbGxIb29rcyIsImhhcyIsInByZWZpeCIsIkV2ZW50cyIsIkVFIiwiZm4iLCJjb250ZXh0Iiwib25jZSIsImFkZExpc3RlbmVyIiwiZW1pdHRlciIsImV2ZW50IiwibGlzdGVuZXIiLCJldnQiLCJfZXZlbnRzIiwiX2V2ZW50c0NvdW50IiwiY2xlYXJFdmVudCIsIkV2ZW50RW1pdHRlciIsIl9fcHJvdG9fXyIsImV2ZW50TmFtZXMiLCJldmVudHMiLCJzbGljZSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImxpc3RlbmVycyIsImhhbmRsZXJzIiwiZWUiLCJsaXN0ZW5lckNvdW50IiwiZW1pdCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJyZW1vdmVMaXN0ZW5lciIsIm9uIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwib2ZmIiwicHJlZml4ZWQiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwid3JpdGFibGUiLCJUZW1wQ3RvciIsInMiLCJtIiwiaCIsImQiLCJwbHVyYWwiLCJtc0FicyIsIm4iLCJpc1BsdXJhbCIsInJvdW5kIiwib3B0aW9ucyIsInN0ciIsImV4ZWMiLCJwYXJzZUZsb2F0IiwicGFyc2UiLCJpc0Zpbml0ZSIsImxvbmciLCJmbXRTaG9ydCIsImlzV2luZG93cyIsInBsYXRmb3JtIiwidXRpbCIsIm5vcm1hbGl6ZUFycmF5IiwicGFydHMiLCJhbGxvd0Fib3ZlUm9vdCIsInJlcyIsInAiLCJ0cmltQXJyYXkiLCJsYXN0SW5kZXgiLCJzdGFydCIsImVuZCIsInNwbGl0RGV2aWNlUmUiLCJzcGxpdFRhaWxSZSIsIndpbjMyIiwid2luMzJTcGxpdFBhdGgiLCJmaWxlbmFtZSIsInJlc3VsdCIsImRldmljZSIsInRhaWwiLCJyZXN1bHQyIiwid2luMzJTdGF0UGF0aCIsInBhdGgiLCJpc1VuYyIsImlzQWJzb2x1dGUiLCJub3JtYWxpemVVTkNSb290IiwicmVzb2x2ZSIsInJlc29sdmVkRGV2aWNlIiwicmVzb2x2ZWRUYWlsIiwicmVzb2x2ZWRBYnNvbHV0ZSIsImN3ZCIsImlzU3RyaW5nIiwibm9ybWFsaXplIiwidHJhaWxpbmdTbGFzaCIsInBhdGhzIiwiYXJnIiwiam9pbmVkIiwicmVsYXRpdmUiLCJ0byIsImxvd2VyRnJvbSIsImxvd2VyVG8iLCJ0b1BhcnRzIiwibG93ZXJGcm9tUGFydHMiLCJsb3dlclRvUGFydHMiLCJtaW4iLCJzYW1lUGFydHNMZW5ndGgiLCJvdXRwdXRQYXJ0cyIsIl9tYWtlTG9uZyIsInJlc29sdmVkUGF0aCIsImRpcm5hbWUiLCJkaXIiLCJiYXNlbmFtZSIsImV4dCIsImYiLCJleHRuYW1lIiwicGF0aE9iamVjdCIsImlzT2JqZWN0IiwiYmFzZSIsInNlcCIsInBhdGhTdHJpbmciLCJhbGxQYXJ0cyIsInNwbGl0UGF0aFJlIiwicG9zaXgiLCJwb3NpeFNwbGl0UGF0aCIsImNoYXJBdCIsInNlZ21lbnQiLCJmcm9tUGFydHMiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwiZGVmYXVsdFNldFRpbW91dCIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJydW5UaW1lb3V0Iiwic2V0VGltZW91dCIsImUiLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwicnVuIiwibWFya2VyIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsIm5vb3AiLCJuZXh0VGljayIsInRpdGxlIiwiYnJvd3NlciIsImFyZ3YiLCJ2ZXJzaW9ucyIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJiaW5kaW5nIiwiY2hkaXIiLCJ1bWFzayIsImNvcHkiLCJmaWxsIiwicmVhZFVJbnQ4IiwiZm9ybWF0UmVnRXhwIiwib2JqZWN0cyIsImluc3BlY3QiLCJpc051bGwiLCJkZXByZWNhdGUiLCJtc2ciLCJpc1VuZGVmaW5lZCIsImciLCJub0RlcHJlY2F0aW9uIiwidGhyb3dEZXByZWNhdGlvbiIsInRyYWNlRGVwcmVjYXRpb24iLCJ0cmFjZSIsImRlYnVnRW52aXJvbiIsImRlYnVncyIsIm9wdHMiLCJjdHgiLCJzZWVuIiwic3R5bGl6ZSIsInN0eWxpemVOb0NvbG9yIiwiZGVwdGgiLCJpc0Jvb2xlYW4iLCJzaG93SGlkZGVuIiwiX2V4dGVuZCIsImN1c3RvbUluc3BlY3QiLCJzdHlsaXplV2l0aENvbG9yIiwiZm9ybWF0VmFsdWUiLCJzdHlsZVR5cGUiLCJzdHlsZXMiLCJyZWN1cnNlVGltZXMiLCJpc0Z1bmN0aW9uIiwicmV0IiwicHJpbWl0aXZlIiwic2ltcGxlIiwiaXNOdW1iZXIiLCJmb3JtYXRQcmltaXRpdmUiLCJ2aXNpYmxlS2V5cyIsImlkeCIsImFycmF5VG9IYXNoIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImlzRXJyb3IiLCJmb3JtYXRFcnJvciIsImlzUmVnRXhwIiwiaXNEYXRlIiwib3V0cHV0IiwiYnJhY2VzIiwidG9VVENTdHJpbmciLCJmb3JtYXRQcm9wZXJ0eSIsImZvcm1hdEFycmF5IiwicmVkdWNlIiwiY3VyIiwicmVkdWNlVG9TaW5nbGVTdHJpbmciLCJsaW5lIiwiYXIiLCJyZSIsIm9iamVjdFRvU3RyaW5nIiwibyIsInBhZCIsImRlYnVnbG9nIiwiTk9ERV9ERUJVRyIsInRvVXBwZXJDYXNlIiwicGlkIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJpc1N5bWJvbCIsImlzUHJpbWl0aXZlIiwiaXNCdWZmZXIiLCJtb250aHMiLCJ0aW1lc3RhbXAiLCJ0aW1lIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldERhdGUiLCJnZXRNb250aCIsImluaGVyaXRzIiwib3JpZ2luIiwiYWRkIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJhIiwiZGVmaW5pdGlvbiIsImdsb2JhbFRoaXMiLCJ0b1N0cmluZ1RhZyIsIl9fYXNzaWduIiwiYXNzaWduIiwidCIsImxvd2VyQ2FzZSIsIkRFRkFVTFRfU1BMSVRfUkVHRVhQIiwiREVGQVVMVF9TVFJJUF9SRUdFWFAiLCJpbnB1dCIsInNuYWtlQ2FzZSIsIl9hIiwic3BsaXRSZWdleHAiLCJfYiIsInN0cmlwUmVnZXhwIiwiX2MiLCJ0cmFuc2Zvcm0iLCJfZCIsIm5vQ2FzZSIsImRvdENhc2UiLCJJU19ERVYiLCJQUk9UT0NPTF9GSUxFIiwiUFJPVE9DT0xfTFNQIiwiVVJMX0xTUCIsIl9hcHBQYXRoUm9vdCIsImFzeW5jIiwiZ2V0QXBwUGF0aFJvb3QiLCJpbnZva2VIb3N0RXhwb3J0ZWRBcGkiLCJnZXRTREtQYXRoUm9vdCIsInNhZmV0eVBhdGhKb2luIiwiaXRlbSIsImRlZXBNZXJnZSIsInRhcmdldCIsInNvdXJjZXMiLCJTZXQiLCJnZW5JRCIsInJhbmRvbSIsInVjRmlyc3QiLCJ3aXRoRmlsZVByb3RvY29sIiwiYmFzZVBhdGgiLCJ1cmwiLCJVUkwiLCJmdWxsUGF0aCIsInNhZmV0eVBhdGhOb3JtYWxpemUiLCJkZWZlcnJlZCIsInJlamVjdCIsInNldHRsZWQiLCJ0aW1lRm4iLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUxIiwicmVqZWN0MSIsImNyZWF0ZWQiLCJub3ciLCJzZXRUYWciLCJtZXRob2QiLCJtZXRob2QxIiwibG9nc2VxSG9zdEV4cG9ydGVkQXBpIiwibG9nc2VxIiwiYXBpIiwiYXBpcyIsInNldHVwSWZyYW1lU2FuZGJveCIsInByb3BzIiwiaWZyYW1lIiwiY2xhc3NMaXN0IiwiZW50cmllcyIsImsiLCJzZXR1cEluamVjdGVkU3R5bGUiLCJhdHRycyIsImVsIiwicXVlcnlTZWxlY3RvciIsImhlYWQiLCJhcHBlbmQiLCJzZXR1cEluamVjdGVkVUkiLCJ1aSIsInBsIiwic2xvdCIsInNlbGVjdG9yIiwiZGVidWdUYWciLCJpZCIsImRhdGFzZXQiLCJpbmplY3RlZFVpIiwiYWRkRXZlbnRMaXN0ZW5lciIsInRyaWdnZXIiLCJjbG9zZXN0IiwibXNnVHlwZSIsImNhbGxlciIsImNhbGxVc2VyTW9kZWwiLCJ0cmFuc2Zvcm1hYmxlRXZlbnQiLCJkcyIsIkZMQUdfUkVDVCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRvSlNPTiIsImluamVjdGVkVGhlbWVFZmZlY3QiLCJzZXR1cEluamVjdGVkVGhlbWUiLCJsaW5rIiwicmVsIiwiaHJlZiIsIm1lc3NhZ2VUeXBlIiwiX21lc3NhZ2VJZCIsIm1lc3NhZ2VUeXBlcyIsImhhbmRzaGFrZSIsInJlcGx5IiwicmVxdWVzdCIsImFsbG93ZWRPcmlnaW4iLCJwb3N0bWF0ZSIsIlBhcmVudEFQSSIsImZyYW1lIiwiY2hpbGQiLCJjaGlsZE9yaWdpbiIsImluZm8iLCJjYWxsYmFjayIsInVpZCIsInRyYW5zYWN0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBvc3RNZXNzYWdlIiwiZXZlbnROYW1lIiwiQ2hpbGRBUEkiLCJtb2RlbCIsInBhcmVudE9yaWdpbiIsInVud3JhcHBlZENvbnRleHQiLCJyZXNvbHZlVmFsdWUiLCJ0aGVuIiwic291cmNlIiwiUG9zdG1hdGUiLCJjb250YWluZXIiLCJjbGFzc0xpc3RBcnJheSIsImNvbnRlbnRXaW5kb3ciLCJzZW5kSGFuZHNoYWtlIiwicHJvdG9jb2wiLCJsb2NhdGlvbiIsImhvc3QiLCJwb3J0IiwiaG9zdG5hbWUiLCJyZXNvbHZlT3JpZ2luIiwicmVzcG9uc2VJbnRlcnZhbCIsImF0dGVtcHQiLCJjbGVhckludGVydmFsIiwiZG9TZW5kIiwic2V0SW50ZXJ2YWwiLCJzcmMiLCJNb2RlbCIsInNlbmRIYW5kc2hha2VSZXBseSIsInNoYWtlIiwiZGVmYXVsdHMiLCJMU1BsdWdpbkZpbGVTdG9yYWdlIiwiYmFzZUluZm8iLCJjYWxsQXN5bmMiLCJjdHhJZCIsImNsZWFyIiwiaGFzSXRlbSIsIlBST1hZX0NPTlRJTlVFIiwiZm9yIiwicmVnaXN0ZXJTaW1wbGVDb21tYW5kIiwiYWN0aW9uIiwibGFiZWwiLCJldmVudEtleSIsInJlZ2lzdGVyZWRDbWRVaWQiLCJFZGl0b3IiLCJhcHAiLCJyZWdpc3RlclVJSXRlbSIsInJlZ2lzdGVyUGFnZU1lbnVJdGVtIiwiZWRpdG9yIiwicmVnaXN0ZXJTbGFzaENvbW1hbmQiLCJhY3Rpb25zIiwiaXQiLCJyZWdpc3RlckJsb2NrQ29udGV4dE1lbnVJdGVtIiwic2Nyb2xsVG9CbG9ja0luUGFnZSIsInBhZ2VOYW1lIiwiYmxvY2tJZCIsImFuY2hvciIsIkFwcCIsInB1c2hTdGF0ZSIsImRiIiwiTFNQbHVnaW5Vc2VyIiwiX2Jhc2VJbmZvIiwiX2NhbGxlciIsIl9jb25uZWN0ZWQiLCJfdWkiLCJNYXAiLCJfZmlsZVN0b3JhZ2UiLCJfYmVmb3JldW5sb2FkQ2FsbGJhY2siLCJzdXBlciIsInBheWxvYWQiLCJiIiwic2V0dGluZ3MiLCJhY3RvciIsInJlc3QiLCJjYiIsImNvbm5lY3RUb1BhcmVudCIsImVuc3VyZUNvbm5lY3RlZCIsImJlZm9yZXVubG9hZCIsInByb3ZpZGVNb2RlbCIsIl9leHRlbmRVc2VyTW9kZWwiLCJwcm92aWRlVGhlbWUiLCJ0aGVtZSIsInByb3ZpZGVTdHlsZSIsInByb3ZpZGVVSSIsInVwZGF0ZVNldHRpbmdzIiwic2V0TWFpblVJQXR0cnMiLCJzZXRNYWluVUlJbmxpbmVTdHlsZSIsImhpZGVNYWluVUkiLCJ2aXNpYmxlIiwiY3Vyc29yIiwicmVzdG9yZUVkaXRpbmdDdXJzb3IiLCJzaG93TWFpblVJIiwidG9nZ2xlTWFpblVJIiwic3RhdGUiLCJyZXNvbHZlUmVzb3VyY2VGdWxsVXJsIiwiZmlsZVBhdGgiLCJsc3IiLCJfbWFrZVVzZXJQcm94eSIsInRoYXQiLCJQcm94eSIsInByb3BLZXkiLCJyZWNlaXZlciIsIm9yaWdNZXRob2QiLCJob29rTWF0Y2hlciIsImhhbmRsZXIiLCJfX0xTUF9fSE9TVF9fIiwiTFNQbHVnaW5DYWxsZXIiLCJpbXBvcnRIVE1MIiwiY3JlYXRlU2FuZGJveENvbnRhaW5lciIsIlFTYW5kYm94IiwidXNlckZldGNoIiwic3RhcnRzV2l0aCIsImZldGNoIiwiZG9BY3Rpb24iLCJMU1BsdWdpblNoYWRvd0ZyYW1lIiwiX3BsdWdpbkxvY2FsIiwiX2ZyYW1lIiwiX3Jvb3QiLCJfbG9hZGVkIiwiX3VubW91bnRGbnMiLCJfZGlzcG9zZSIsIl91bm1vdW50IiwiZW50cnkiLCJsb2FkZWQiLCJleGVjU2NyaXB0cyIsIl9tb3VudCIsImdsb2JhbCIsImVsZW1lbnRHZXR0ZXIiLCJpbnN0YW5jZSIsInByb3h5IiwiX19zaGFkb3dfbW9kZV9fIiwiTFNQbHVnaW5Mb2NhbCIsIkxTUGx1Z2luU2hhZG93IiwiZXhlY1Jlc3VsdCIsInVubW91bnQiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwiRkxBR19BV0FJVCIsIkxTUE1TRyIsIkxTUE1TR19FUlJPUl9UQUciLCJMU1BNU0dfU0VUVElOR1MiLCJMU1BNU0dfQkVGT1JFX1VOTE9BRCIsIkxTUE1TR19TWU5DIiwiTFNQTVNHX1JFQURZIiwiTFNQTVNHRm4iLCJfcGFyZW50IiwiX2NoaWxkIiwiX3NoYWRvdyIsIl9zdGF0dXMiLCJfdXNlck1vZGVsIiwiX2NhbGwiLCJfY2FsbFVzZXJNb2RlbCIsIl9kZWJ1Z1RhZyIsInNoYWRvdyIsIl9zZXR1cFNoYWRvd1NhbmRib3giLCJfc2V0dXBJZnJhbWVTYW5kYm94IiwidXNlck1vZGVsIiwiaXNTaGFkb3dNb2RlIiwic3luY0dDVGltZXIiLCJzeW5jVGFnIiwic3luY0FjdG9ycyIsInJlYWR5RGVmZXJyZWQiLCJucyIsIl9zeW5jIiwiZGVsZXRlIiwicmVmUGFyZW50Iiwic2l6ZSIsImZpbmFsbHkiLCJjbnQiLCJzZWFyY2hQYXJhbXMiLCJ0aW1lciIsInJlZkNoaWxkIiwiJCRwaWQiLCJjYXRjaCIsIl9nZXRTYW5kYm94SWZyYW1lQ29udGFpbmVyIiwiX2dldFNhbmRib3hTaGFkb3dDb250YWluZXIiLCJESVJfUExVR0lOUyIsIlBsdWdpblNldHRpbmdzIiwiX3VzZXJQbHVnaW5TZXR0aW5ncyIsIl9zZXR0aW5ncyIsImRpc2FibGVkIiwiUGx1Z2luTG9nZ2VyIiwiX3RhZyIsIl9sb2dzIiwid3JpdGUiLCJhYyIsInRvTG9jYWxlVGltZVN0cmluZyIsIlBsdWdpbkxvY2FsTG9hZFN0YXR1cyIsImNvbnZlcnRUb0xTUFJlc291cmNlIiwiZnVsbFVybCIsImRvdFBsdWdpblJvb3QiLCJJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yIiwiRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yIiwiUGx1Z2luTG9jYWwiLCJfb3B0aW9ucyIsIl90aGVtZU1nciIsIl9jdHgiLCJfZGlzcG9zZXMiLCJfaWQiLCJVTkxPQURFRCIsIl9sb2FkRXJyIiwiX2xvY2FsUm9vdCIsIl9kb3RTZXR0aW5nc0ZpbGUiLCJwbHVnaW5Mb2NhbCIsInRvZ2dsZSIsImdldE1haW5VSSIsImZvY3VzIiwiaW5pdE1haW5VSUhhbmRsZXJzIiwidGhlbWVkIiwidGhlbWVNZ3IiLCJyZWdpc3RlclRoZW1lIiwidW5yZWdpc3RlclRoZW1lIiwiX29uSG9zdE1vdW50ZWQiLCJpbml0UHJvdmlkZXJIYW5kbGVycyIsImluaXRBcGlQcm94eUhhbmRsZXJzIiwibG9nZ2VyIiwidXNlclNldHRpbmdzRmlsZVBhdGgiLCJ1c2VyU2V0dGluZ3MiLCJ1bmxvYWQiLCJfcmVzb2x2ZVJlc291cmNlRnVsbFVybCIsImxvY2FsUm9vdCIsInJlZyIsImlzSW5zdGFsbGVkSW5Eb3RSb290IiwiZG90UGx1Z2luc1Jvb3QiLCJwa2ciLCJtYWluIiwiaWNvbiIsInJlZ2lzdGVyZWRQbHVnaW5zIiwiaXNSZWdpc3RlcmluZyIsInRoZW1lcyIsIl9sb2FkQ29uZmlnVGhlbWVzIiwiZGV2RW50cnkiLCJlbmRzV2l0aCIsImRpclBhdGhJbnN0YWxsZWQiLCJ0bXBfZmlsZV9tZXRob2QiLCJzZGtQYXRoUm9vdCIsImVudHJ5UGF0aCIsInJlYWR5SW5kaWNhdG9yIiwicGVuZGluZyIsIkxPQURJTkciLCJpbnN0YWxsUGFja2FnZVRoZW1lcyIsIl9wcmVwYXJlUGFja2FnZUNvbmZpZ3MiLCJfc2V0dXBVc2VyU2V0dGluZ3MiLCJfdHJ5VG9Ob3JtYWxpemVFbnRyeSIsImNvbm5lY3RUb0NoaWxkIiwicmVhZHlGbiIsIkVSUk9SIiwiTE9BREVEIiwidW5yZWdpc3RlciIsIlVOTE9BRElORyIsImV2ZW50QmVmb3JlVW5sb2FkIiwiZGlzcG9zZSIsImhvc3RNb3VudGVkQWN0b3IiLCJkb3RSb290IiwiZG90Q29uZmlnUm9vdCIsInBsZ1Jvb3QiLCJpbmNsdWRlcyIsImpzb24iLCJlcnIiLCJsb2FkRXJyIiwidXNmIiwiZG90U2V0dGluZ3NGaWxlIiwiaWlyIiwiTFNQbHVnaW5Db3JlIiwiX2lzUmVnaXN0ZXJpbmciLCJfcmVhZHlJbmRpY2F0b3IiLCJfaG9zdE1vdW50ZWRBY3RvciIsIl91c2VyUHJlZmVyZW5jZXMiLCJfcmVnaXN0ZXJlZFRoZW1lcyIsIl9yZWdpc3RlcmVkUGx1Z2lucyIsInNlbGVjdFRoZW1lIiwicGx1Z2lucyIsImluaXRpYWwiLCJyZWdpc3RlciIsInBlcmZUYWJsZSIsImRlYnVnUGVyZkluZm8iLCJ2YWx1ZXMiLCJzdGF0dXMiLCJwZXJmIiwidG9GaXhlZCIsIl9fZGVidWdQbHVnaW5zUGVyZkluZm8iLCJsb2FkVXNlclByZWZlcmVuY2VzIiwiZXh0ZXJuYWxzIiwiZmlsdGVyIiwiZXZlcnkiLCJwbHVnaW5PcHRpb25zIiwicGVyZkluZm8iLCJwZXJmb3JtYW5jZSIsInNhdmVVc2VyUHJlZmVyZW5jZXMiLCJhY3RpdmF0ZVVzZXJQcmVmZXJlbmNlcyIsImlkZW50aXR5IiwiZW5zdXJlUGx1Z2luIiwicmVsb2FkIiwidW5yZWdpc3RlcmVkRXh0ZXJuYWxzIiwicGx1Z2luIiwiaG9va0FwcCIsIl9ob29rIiwiaG9va0VkaXRvciIsIl9leGVjRGlyZWN0aXZlIiwicGFyYW1zIiwiaG9zdE1vdW50ZWQiLCJvcHQiLCJlZmZlY3QiLCJzZXR1cFBsdWdpbkNvcmUiLCJwbHVnaW5Db3JlIl0sInNvdXJjZVJvb3QiOiIifQ==