lsplugin.core.js 479 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 T=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"]),O=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 q=function(){return"undefined"==typeof window?null:window},J=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]:q(),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=J(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(T),G(O),G(E),G(L),G(I))),xe=null,Se=x({},[].concat(G(R),G(M),G(j),G(P))),Ae=null,Te=null,Oe=!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"]),qe=null,Je=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,qe="ADD_URI_SAFE_ATTR"in e?x(S(Je),e.ADD_URI_SAFE_ATTR):Je,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):{},Te="FORBID_ATTR"in e?x({},e.FORBID_ATTR):{},ze="USE_PROFILES"in e&&e.USE_PROFILES,Oe=!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,T),x(xe,R)),!0===ze.svg&&(x(we,O),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(qe,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({},O);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&&!Te[t]&&b(me,t));else if(Oe&&b(ye,t));else{if(!xe[t]||Te[t])return!1;if(qe[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 T=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function O(){var e=new Date,t=[A(e.getHours()),A(e.getMinutes()),A(e.getSeconds())].join(":");return[e.getDate(),T[e.getMonth()],t].join(" ")}function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",O(),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:()=>Te});var e={};n.r(e),n.d(e,{IS_DEV:()=>p,PROTOCOL_FILE:()=>f,PROTOCOL_LSP:()=>g,URL_LSP:()=>m,deepMerge:()=>w,deferred:()=>O,genID:()=>C,getAppPathRoot:()=>v,getSDKPathRoot:()=>_,invokeHostExportedApi:()=>E,isObject:()=>b,path:()=>h,safetyPathJoin:()=>A,safetyPathNormalize:()=>T,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 T(e){return e?.match(/^(http?|lsp|assets):/)||(e=h.normalize(e)),e}function O(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){e=e?.replace(/^[_$]+/,"");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=()=>{try{document.head.removeChild(t)}catch(e){console.error(e)}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"),e.id&&(this.frame.id=e.id),e.name&&(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 q=Symbol.for("proxy-continue"),J=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){J("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)===q){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=O(5e3),a=this._extendUserModel({[de]:async()=>{await s.resolve()},[ce]:async e=>{const n=O(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=O(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=t.id,r=new URL(t.options.entry);r.searchParams.set("__v__",p?Date.now().toString():t.options.version);const i=e.querySelector(`#${n}`);i&&i.parentElement.removeChild(i);let o,s=new B({id:n,container:e,url:r.href,classListArray:["lsp-iframe-sandbox"],model:{baseInfo:JSON.parse(JSON.stringify(t.toJSON()))}}).sendHandshake();return this._status="pending",new Promise(((e,n)=>{o=setTimeout((()=>{n(new Error("handshake Timeout"))}),3e3),s.then((n=>{this._parent=n,this._connected=!0,this.emit("connected"),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(o)}))})).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.logger=new _e("Loader");try{const[t,n]=await E("load_plugin_user_settings",this.id);this._dotSettingsFile=t,(e.settings=new ve(n)).on("change",((e,t)=>{me("linked settings change",e),!e.disabled&&t.disabled&&this.load(),e.disabled&&!t.disabled&&this.unload(),e&&E("save_plugin_user_settings",this.id,e)}))}catch(e){me("[load plugin user settings Error]",e),t?.error(e)}}getMainUI(){return this.shadow?this.caller?._getSandboxShadowContainer():this.caller?._getSandboxIframeContainer()}_resolveResourceFullUrl(e,t){if(!e?.trim())return;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.options.effect&&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","repo","title","effect"].forEach((e=>{this._options[e]=t[e]}));const n=this._localRoot=T(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.title||t.title,s=r.icon||t.icon;if(this._options.title=o,this._options.icon=s&&this._resolveResourceFullUrl(s),this.isInstalledInDotRoot)this._id=h.basename(n);else if(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:a,isRegistering:l}=this._ctx;if(l&&a.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(){this.pending||(this._ctx.emit("beforereload",this),await this.unload(),await this.load(),this._ctx.emit("reloaded",this))}async unload(e=!1){if(!this.pending){if(e)return await this.unload(),void(this.isInstalledInDotRoot&&this._ctx.emit("unlink-plugin",this.id));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){return me("[plugin unload Error]",e),!1}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=O();_userPreferences={};_registeredThemes=new Map;_registeredPlugins=new Map;_currentTheme;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=O();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)try{const e=this.ensurePlugin(t);await e.reload()}catch(e){me(e)}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){this._currentTheme&&this._currentTheme.dis?.();const n=M(e?.url);this.emit("theme-selected",e),t&&await this.saveUserPreferences({theme:e?.url?e:null}),e?.url&&(this._currentTheme={dis:()=>{n(),t&&this.saveUserPreferences({theme:null})},opt:e,pid:e.pid})}async unregisterTheme(e,t=!0){me("unregistered Theme #",e),this._registeredThemes.has(e)&&(this._registeredThemes.delete(e),this.emit("theme-changed",this.themes,{id:e}),t&&this._currentTheme?.pid==e&&(this._currentTheme.dis?.(),this._currentTheme=null,this.emit("theme-selected",null)))}}function Te(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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LEtBQUssaUJBQWtCLFNBSXhDLFNBQVMrbkIsR0FBZ0J0bUIsR0FDckIsTUFBTXVtQixFQUFhLElBQUkzQyxHQUFhNWpCLEdBQ3BDLEdBQU0sNENBQ043WixPQUFPeTlCLGFBQWUyQyIsInNvdXJjZXMiOlsid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9kaXN0L3B1cmlmeS5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvcGF0aC9wYXRoLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2xvd2VyLWNhc2UvZGlzdC5lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvbm8tY2FzZS9kaXN0LmVzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9zbmFrZS1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2RvdC1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvcG9zdG1hdGUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvbW9kdWxlcy9MU1BsdWdpbi5TdG9yYWdlLnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLnVzZXIudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvTFNQbHVnaW4uc2hhZG93LnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLmNhbGxlci50cyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9MU1BsdWdpbi5jb3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkxTUGx1Z2luXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkxTUGx1Z2luXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXdhcm5lZCkge1xuXHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuXHQnIzAwMDBDQycsXG5cdCcjMDAwMEZGJyxcblx0JyMwMDMzQ0MnLFxuXHQnIzAwMzNGRicsXG5cdCcjMDA2NkNDJyxcblx0JyMwMDY2RkYnLFxuXHQnIzAwOTlDQycsXG5cdCcjMDA5OUZGJyxcblx0JyMwMENDMDAnLFxuXHQnIzAwQ0MzMycsXG5cdCcjMDBDQzY2Jyxcblx0JyMwMENDOTknLFxuXHQnIzAwQ0NDQycsXG5cdCcjMDBDQ0ZGJyxcblx0JyMzMzAwQ0MnLFxuXHQnIzMzMDBGRicsXG5cdCcjMzMzM0NDJyxcblx0JyMzMzMzRkYnLFxuXHQnIzMzNjZDQycsXG5cdCcjMzM2NkZGJyxcblx0JyMzMzk5Q0MnLFxuXHQnIzMzOTlGRicsXG5cdCcjMzNDQzAwJyxcblx0JyMzM0NDMzMnLFxuXHQnIzMzQ0M2NicsXG5cdCcjMzNDQzk5Jyxcblx0JyMzM0NDQ0MnLFxuXHQnIzMzQ0NGRicsXG5cdCcjNjYwMENDJyxcblx0JyM2NjAwRkYnLFxuXHQnIzY2MzNDQycsXG5cdCcjNjYzM0ZGJyxcblx0JyM2NkNDMDAnLFxuXHQnIzY2Q0MzMycsXG5cdCcjOTkwMENDJyxcblx0JyM5OTAwRkYnLFxuXHQnIzk5MzNDQycsXG5cdCcjOTkzM0ZGJyxcblx0JyM5OUNDMDAnLFxuXHQnIzk5Q0MzMycsXG5cdCcjQ0MwMDAwJyxcblx0JyNDQzAwMzMnLFxuXHQnI0NDMDA2NicsXG5cdCcjQ0MwMDk5Jyxcblx0JyNDQzAwQ0MnLFxuXHQnI0NDMDBGRicsXG5cdCcjQ0MzMzAwJyxcblx0JyNDQzMzMzMnLFxuXHQnI0NDMzM2NicsXG5cdCcjQ0MzMzk5Jyxcblx0JyNDQzMzQ0MnLFxuXHQnI0NDMzNGRicsXG5cdCcjQ0M2NjAwJyxcblx0JyNDQzY2MzMnLFxuXHQnI0NDOTkwMCcsXG5cdCcjQ0M5OTMzJyxcblx0JyNDQ0NDMDAnLFxuXHQnI0NDQ0MzMycsXG5cdCcjRkYwMDAwJyxcblx0JyNGRjAwMzMnLFxuXHQnI0ZGMDA2NicsXG5cdCcjRkYwMDk5Jyxcblx0JyNGRjAwQ0MnLFxuXHQnI0ZGMDBGRicsXG5cdCcjRkYzMzAwJyxcblx0JyNGRjMzMzMnLFxuXHQnI0ZGMzM2NicsXG5cdCcjRkYzMzk5Jyxcblx0JyNGRjMzQ0MnLFxuXHQnI0ZGMzNGRicsXG5cdCcjRkY2NjAwJyxcblx0JyNGRjY2MzMnLFxuXHQnI0ZGOTkwMCcsXG5cdCcjRkY5OTMzJyxcblx0JyNGRkNDMDAnLFxuXHQnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0Ly8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHQvLyBleHBsaWNpdGx5XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG5cdHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuXHRcdC8vIElzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuXHRcdC8vIERvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRhcmdzWzBdID0gKHRoaXMudXNlQ29sb3JzID8gJyVjJyA6ICcnKSArXG5cdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKSArXG5cdFx0YXJnc1swXSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHQnKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG5cdGlmICghdGhpcy51c2VDb2xvcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcblx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0Ly8gVGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcblx0Ly8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuXHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0bGV0IGluZGV4ID0gMDtcblx0bGV0IGxhc3RDID0gMDtcblx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5kZXgrKztcblx0XHRpZiAobWF0Y2ggPT09ICclYycpIHtcblx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0Ly8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcblx0XHRcdGxhc3RDID0gaW5kZXg7XG5cdFx0fVxuXHR9KTtcblxuXHRhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5kZWJ1ZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqIElmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlLCBmYWxscyBiYWNrXG4gKiB0byBgY29uc29sZS5sb2dgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdHRyeSB7XG5cdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5zZXRJdGVtKCdkZWJ1ZycsIG5hbWVzcGFjZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdGxldCByO1xuXHR0cnkge1xuXHRcdHIgPSBleHBvcnRzLnN0b3JhZ2UuZ2V0SXRlbSgnZGVidWcnKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cblxuXHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuXHRcdHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxuXG5cdHJldHVybiByO1xufVxuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcblx0dHJ5IHtcblx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0Ly8gVGhlIEJyb3dzZXIgYWxzbyBoYXMgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dC5cblx0XHRyZXR1cm4gbG9jYWxTdG9yYWdlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHR0cnkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyb3IubWVzc2FnZTtcblx0fVxufTtcbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZm9yIHRoZSBkZWJ1ZyBpbnN0YW5jZSB0byBiZSBjb2xvcmVkXG5cdCogQHJldHVybiB7TnVtYmVyfFN0cmluZ30gQW4gQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuXHRcdGxldCBoYXNoID0gMDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcblx0XHRcdGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNyZWF0ZURlYnVnLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGNyZWF0ZURlYnVnLmNvbG9ycy5sZW5ndGhdO1xuXHR9XG5cdGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yID0gc2VsZWN0Q29sb3I7XG5cblx0LyoqXG5cdCogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQHJldHVybiB7RnVuY3Rpb259XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cdFx0bGV0IHByZXZUaW1lO1xuXHRcdGxldCBlbmFibGVPdmVycmlkZSA9IG51bGw7XG5cdFx0bGV0IG5hbWVzcGFjZXNDYWNoZTtcblx0XHRsZXQgZW5hYmxlZENhY2hlO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKGVuYWJsZU92ZXJyaWRlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVuYWJsZU92ZXJyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuYW1lc3BhY2VzQ2FjaGUgIT09IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRuYW1lc3BhY2VzQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzO1xuXHRcdFx0XHRcdGVuYWJsZWRDYWNoZSA9IGNyZWF0ZURlYnVnLmVuYWJsZWQobmFtZXNwYWNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbmFibGVkQ2FjaGU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiB2ID0+IHtcblx0XHRcdFx0ZW5hYmxlT3ZlcnJpZGUgPSB2O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcblx0XHRpZiAodHlwZW9mIGNyZWF0ZURlYnVnLmluaXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNyZWF0ZURlYnVnLmluaXQoZGVidWcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWJ1Zztcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dGVuZChuYW1lc3BhY2UsIGRlbGltaXRlcikge1xuXHRcdGNvbnN0IG5ld0RlYnVnID0gY3JlYXRlRGVidWcodGhpcy5uYW1lc3BhY2UgKyAodHlwZW9mIGRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnOicgOiBkZWxpbWl0ZXIpICsgbmFtZXNwYWNlKTtcblx0XHRuZXdEZWJ1Zy5sb2cgPSB0aGlzLmxvZztcblx0XHRyZXR1cm4gbmV3RGVidWc7XG5cdH1cblxuXHQvKipcblx0KiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG5cdCogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcblx0XHRjcmVhdGVEZWJ1Zy5zYXZlKG5hbWVzcGFjZXMpO1xuXHRcdGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuXG5cdFx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0XHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdFx0bGV0IGk7XG5cdFx0Y29uc3Qgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKCFzcGxpdFtpXSkge1xuXHRcdFx0XHQvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG5cblx0XHRcdGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc3Vic3RyKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCIvKiEgQGxpY2Vuc2UgRE9NUHVyaWZ5IDIuMy4xIHwgKGMpIEN1cmU1MyBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwgUmVsZWFzZWQgdW5kZXIgdGhlIEFwYWNoZSBsaWNlbnNlIDIuMCBhbmQgTW96aWxsYSBQdWJsaWMgTGljZW5zZSAyLjAgfCBnaXRodWIuY29tL2N1cmU1My9ET01QdXJpZnkvYmxvYi8yLjMuMS9MSUNFTlNFICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuRE9NUHVyaWZ5ID0gZmFjdG9yeSgpKTtcbn0odGhpcywgZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0Lmhhc093blByb3BlcnR5LFxuICAgICAgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YsXG4gICAgICBpc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbixcbiAgICAgIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgdmFyIGZyZWV6ZSA9IE9iamVjdC5mcmVlemUsXG4gICAgICBzZWFsID0gT2JqZWN0LnNlYWwsXG4gICAgICBjcmVhdGUgPSBPYmplY3QuY3JlYXRlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby1tdXRhYmxlLWV4cG9ydHNcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBSZWZsZWN0LFxuICAgICAgYXBwbHkgPSBfcmVmLmFwcGx5LFxuICAgICAgY29uc3RydWN0ID0gX3JlZi5jb25zdHJ1Y3Q7XG5cbiAgaWYgKCFhcHBseSkge1xuICAgIGFwcGx5ID0gZnVuY3Rpb24gYXBwbHkoZnVuLCB0aGlzVmFsdWUsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW4uYXBwbHkodGhpc1ZhbHVlLCBhcmdzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFmcmVlemUpIHtcbiAgICBmcmVlemUgPSBmdW5jdGlvbiBmcmVlemUoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuXG4gIGlmICghc2VhbCkge1xuICAgIHNlYWwgPSBmdW5jdGlvbiBzZWFsKHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH07XG4gIH1cblxuICBpZiAoIWNvbnN0cnVjdCkge1xuICAgIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIGNvbnN0cnVjdChGdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShGdW5jLCBbbnVsbF0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhcmdzKSkpKSgpO1xuICAgIH07XG4gIH1cblxuICB2YXIgYXJyYXlGb3JFYWNoID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG4gIHZhciBhcnJheVBvcCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnBvcCk7XG4gIHZhciBhcnJheVB1c2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKTtcblxuICB2YXIgc3RyaW5nVG9Mb3dlckNhc2UgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UpO1xuICB2YXIgc3RyaW5nTWF0Y2ggPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuICB2YXIgc3RyaW5nUmVwbGFjZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbiAgdmFyIHN0cmluZ0luZGV4T2YgPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG4gIHZhciBzdHJpbmdUcmltID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pO1xuXG4gIHZhciByZWdFeHBUZXN0ID0gdW5hcHBseShSZWdFeHAucHJvdG90eXBlLnRlc3QpO1xuXG4gIHZhciB0eXBlRXJyb3JDcmVhdGUgPSB1bmNvbnN0cnVjdChUeXBlRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIHVuYXBwbHkoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpc0FyZykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncyk7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuY29uc3RydWN0KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uc3RydWN0KGZ1bmMsIGFyZ3MpO1xuICAgIH07XG4gIH1cblxuICAvKiBBZGQgcHJvcGVydGllcyB0byBhIGxvb2t1cCB0YWJsZSAqL1xuICBmdW5jdGlvbiBhZGRUb1NldChzZXQsIGFycmF5KSB7XG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAvLyBNYWtlICdpbicgYW5kIHRydXRoeSBjaGVja3MgbGlrZSBCb29sZWFuKHNldC5jb25zdHJ1Y3RvcilcbiAgICAgIC8vIGluZGVwZW5kZW50IG9mIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gT2JqZWN0LnByb3RvdHlwZS5cbiAgICAgIC8vIFByZXZlbnQgcHJvdG90eXBlIHNldHRlcnMgZnJvbSBpbnRlcmNlcHRpbmcgc2V0IGFzIGEgdGhpcyB2YWx1ZS5cbiAgICAgIHNldFByb3RvdHlwZU9mKHNldCwgbnVsbCk7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGwtLSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBhcnJheVtsXTtcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGxjRWxlbWVudCA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQpO1xuICAgICAgICBpZiAobGNFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgICAgLy8gQ29uZmlnIHByZXNldHMgKGUuZy4gdGFncy5qcywgYXR0cnMuanMpIGFyZSBpbW11dGFibGUuXG4gICAgICAgICAgaWYgKCFpc0Zyb3plbihhcnJheSkpIHtcbiAgICAgICAgICAgIGFycmF5W2xdID0gbGNFbGVtZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsZW1lbnQgPSBsY0VsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0W2VsZW1lbnRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0O1xuICB9XG5cbiAgLyogU2hhbGxvdyBjbG9uZSBhbiBvYmplY3QgKi9cbiAgZnVuY3Rpb24gY2xvbmUob2JqZWN0KSB7XG4gICAgdmFyIG5ld09iamVjdCA9IGNyZWF0ZShudWxsKTtcblxuICAgIHZhciBwcm9wZXJ0eSA9IHZvaWQgMDtcbiAgICBmb3IgKHByb3BlcnR5IGluIG9iamVjdCkge1xuICAgICAgaWYgKGFwcGx5KGhhc093blByb3BlcnR5LCBvYmplY3QsIFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgIG5ld09iamVjdFtwcm9wZXJ0eV0gPSBvYmplY3RbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXdPYmplY3Q7XG4gIH1cblxuICAvKiBJRTEwIGRvZXNuJ3Qgc3VwcG9ydCBfX2xvb2t1cEdldHRlcl9fIHNvIGxldHMnXG4gICAqIHNpbXVsYXRlIGl0LiBJdCBhbHNvIGF1dG9tYXRpY2FsbHkgY2hlY2tzXG4gICAqIGlmIHRoZSBwcm9wIGlzIGZ1bmN0aW9uIG9yIGdldHRlciBhbmQgYmVoYXZlc1xuICAgKiBhY2NvcmRpbmdseS4gKi9cbiAgZnVuY3Rpb24gbG9va3VwR2V0dGVyKG9iamVjdCwgcHJvcCkge1xuICAgIHdoaWxlIChvYmplY3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcCk7XG4gICAgICBpZiAoZGVzYykge1xuICAgICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdW5hcHBseShkZXNjLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoZWxlbWVudCkge1xuICAgICAgY29uc29sZS53YXJuKCdmYWxsYmFjayB2YWx1ZSBmb3InLCBlbGVtZW50KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICB9XG5cbiAgdmFyIGh0bWwgPSBmcmVlemUoWydhJywgJ2FiYnInLCAnYWNyb255bScsICdhZGRyZXNzJywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdhdWRpbycsICdiJywgJ2JkaScsICdiZG8nLCAnYmlnJywgJ2JsaW5rJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FudmFzJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NpdGUnLCAnY29kZScsICdjb2wnLCAnY29sZ3JvdXAnLCAnY29udGVudCcsICdkYXRhJywgJ2RhdGFsaXN0JywgJ2RkJywgJ2RlY29yYXRvcicsICdkZWwnLCAnZGV0YWlscycsICdkZm4nLCAnZGlhbG9nJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZWxlbWVudCcsICdlbScsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb250JywgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2knLCAnaW1nJywgJ2lucHV0JywgJ2lucycsICdrYmQnLCAnbGFiZWwnLCAnbGVnZW5kJywgJ2xpJywgJ21haW4nLCAnbWFwJywgJ21hcmsnLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGVyJywgJ25hdicsICdub2JyJywgJ29sJywgJ29wdGdyb3VwJywgJ29wdGlvbicsICdvdXRwdXQnLCAncCcsICdwaWN0dXJlJywgJ3ByZScsICdwcm9ncmVzcycsICdxJywgJ3JwJywgJ3J0JywgJ3J1YnknLCAncycsICdzYW1wJywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NoYWRvdycsICdzbWFsbCcsICdzb3VyY2UnLCAnc3BhY2VyJywgJ3NwYW4nLCAnc3RyaWtlJywgJ3N0cm9uZycsICdzdHlsZScsICdzdWInLCAnc3VtbWFyeScsICdzdXAnLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGltZScsICd0cicsICd0cmFjaycsICd0dCcsICd1JywgJ3VsJywgJ3ZhcicsICd2aWRlbycsICd3YnInXSk7XG5cbiAgLy8gU1ZHXG4gIHZhciBzdmcgPSBmcmVlemUoWydzdmcnLCAnYScsICdhbHRnbHlwaCcsICdhbHRnbHlwaGRlZicsICdhbHRnbHlwaGl0ZW0nLCAnYW5pbWF0ZWNvbG9yJywgJ2FuaW1hdGVtb3Rpb24nLCAnYW5pbWF0ZXRyYW5zZm9ybScsICdjaXJjbGUnLCAnY2xpcHBhdGgnLCAnZGVmcycsICdkZXNjJywgJ2VsbGlwc2UnLCAnZmlsdGVyJywgJ2ZvbnQnLCAnZycsICdnbHlwaCcsICdnbHlwaHJlZicsICdoa2VybicsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhcmdyYWRpZW50JywgJ21hcmtlcicsICdtYXNrJywgJ21ldGFkYXRhJywgJ21wYXRoJywgJ3BhdGgnLCAncGF0dGVybicsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JhZGlhbGdyYWRpZW50JywgJ3JlY3QnLCAnc3RvcCcsICdzdHlsZScsICdzd2l0Y2gnLCAnc3ltYm9sJywgJ3RleHQnLCAndGV4dHBhdGgnLCAndGl0bGUnLCAndHJlZicsICd0c3BhbicsICd2aWV3JywgJ3ZrZXJuJ10pO1xuXG4gIHZhciBzdmdGaWx0ZXJzID0gZnJlZXplKFsnZmVCbGVuZCcsICdmZUNvbG9yTWF0cml4JywgJ2ZlQ29tcG9uZW50VHJhbnNmZXInLCAnZmVDb21wb3NpdGUnLCAnZmVDb252b2x2ZU1hdHJpeCcsICdmZURpZmZ1c2VMaWdodGluZycsICdmZURpc3BsYWNlbWVudE1hcCcsICdmZURpc3RhbnRMaWdodCcsICdmZUZsb29kJywgJ2ZlRnVuY0EnLCAnZmVGdW5jQicsICdmZUZ1bmNHJywgJ2ZlRnVuY1InLCAnZmVHYXVzc2lhbkJsdXInLCAnZmVNZXJnZScsICdmZU1lcmdlTm9kZScsICdmZU1vcnBob2xvZ3knLCAnZmVPZmZzZXQnLCAnZmVQb2ludExpZ2h0JywgJ2ZlU3BlY3VsYXJMaWdodGluZycsICdmZVNwb3RMaWdodCcsICdmZVRpbGUnLCAnZmVUdXJidWxlbmNlJ10pO1xuXG4gIC8vIExpc3Qgb2YgU1ZHIGVsZW1lbnRzIHRoYXQgYXJlIGRpc2FsbG93ZWQgYnkgZGVmYXVsdC5cbiAgLy8gV2Ugc3RpbGwgbmVlZCB0byBrbm93IHRoZW0gc28gdGhhdCB3ZSBjYW4gZG8gbmFtZXNwYWNlXG4gIC8vIGNoZWNrcyBwcm9wZXJseSBpbiBjYXNlIG9uZSB3YW50cyB0byBhZGQgdGhlbSB0b1xuICAvLyBhbGxvdy1saXN0LlxuICB2YXIgc3ZnRGlzYWxsb3dlZCA9IGZyZWV6ZShbJ2FuaW1hdGUnLCAnY29sb3ItcHJvZmlsZScsICdjdXJzb3InLCAnZGlzY2FyZCcsICdmZWRyb3BzaGFkb3cnLCAnZmVpbWFnZScsICdmb250LWZhY2UnLCAnZm9udC1mYWNlLWZvcm1hdCcsICdmb250LWZhY2UtbmFtZScsICdmb250LWZhY2Utc3JjJywgJ2ZvbnQtZmFjZS11cmknLCAnZm9yZWlnbm9iamVjdCcsICdoYXRjaCcsICdoYXRjaHBhdGgnLCAnbWVzaCcsICdtZXNoZ3JhZGllbnQnLCAnbWVzaHBhdGNoJywgJ21lc2hyb3cnLCAnbWlzc2luZy1nbHlwaCcsICdzY3JpcHQnLCAnc2V0JywgJ3NvbGlkY29sb3InLCAndW5rbm93bicsICd1c2UnXSk7XG5cbiAgdmFyIG1hdGhNbCA9IGZyZWV6ZShbJ21hdGgnLCAnbWVuY2xvc2UnLCAnbWVycm9yJywgJ21mZW5jZWQnLCAnbWZyYWMnLCAnbWdseXBoJywgJ21pJywgJ21sYWJlbGVkdHInLCAnbW11bHRpc2NyaXB0cycsICdtbicsICdtbycsICdtb3ZlcicsICdtcGFkZGVkJywgJ21waGFudG9tJywgJ21yb290JywgJ21yb3cnLCAnbXMnLCAnbXNwYWNlJywgJ21zcXJ0JywgJ21zdHlsZScsICdtc3ViJywgJ21zdXAnLCAnbXN1YnN1cCcsICdtdGFibGUnLCAnbXRkJywgJ210ZXh0JywgJ210cicsICdtdW5kZXInLCAnbXVuZGVyb3ZlciddKTtcblxuICAvLyBTaW1pbGFybHkgdG8gU1ZHLCB3ZSB3YW50IHRvIGtub3cgYWxsIE1hdGhNTCBlbGVtZW50cyxcbiAgLy8gZXZlbiB0aG9zZSB0aGF0IHdlIGRpc2FsbG93IGJ5IGRlZmF1bHQuXG4gIHZhciBtYXRoTWxEaXNhbGxvd2VkID0gZnJlZXplKFsnbWFjdGlvbicsICdtYWxpZ25ncm91cCcsICdtYWxpZ25tYXJrJywgJ21sb25nZGl2JywgJ21zY2FycmllcycsICdtc2NhcnJ5JywgJ21zZ3JvdXAnLCAnbXN0YWNrJywgJ21zbGluZScsICdtc3JvdycsICdzZW1hbnRpY3MnLCAnYW5ub3RhdGlvbicsICdhbm5vdGF0aW9uLXhtbCcsICdtcHJlc2NyaXB0cycsICdub25lJ10pO1xuXG4gIHZhciB0ZXh0ID0gZnJlZXplKFsnI3RleHQnXSk7XG5cbiAgdmFyIGh0bWwkMSA9IGZyZWV6ZShbJ2FjY2VwdCcsICdhY3Rpb24nLCAnYWxpZ24nLCAnYWx0JywgJ2F1dG9jYXBpdGFsaXplJywgJ2F1dG9jb21wbGV0ZScsICdhdXRvcGljdHVyZWlucGljdHVyZScsICdhdXRvcGxheScsICdiYWNrZ3JvdW5kJywgJ2JnY29sb3InLCAnYm9yZGVyJywgJ2NhcHR1cmUnLCAnY2VsbHBhZGRpbmcnLCAnY2VsbHNwYWNpbmcnLCAnY2hlY2tlZCcsICdjaXRlJywgJ2NsYXNzJywgJ2NsZWFyJywgJ2NvbG9yJywgJ2NvbHMnLCAnY29sc3BhbicsICdjb250cm9scycsICdjb250cm9sc2xpc3QnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZGlyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVwaWN0dXJlaW5waWN0dXJlJywgJ2Rpc2FibGVyZW1vdGVwbGF5YmFjaycsICdkb3dubG9hZCcsICdkcmFnZ2FibGUnLCAnZW5jdHlwZScsICdlbnRlcmtleWhpbnQnLCAnZmFjZScsICdmb3InLCAnaGVhZGVycycsICdoZWlnaHQnLCAnaGlkZGVuJywgJ2hpZ2gnLCAnaHJlZicsICdocmVmbGFuZycsICdpZCcsICdpbnB1dG1vZGUnLCAnaW50ZWdyaXR5JywgJ2lzbWFwJywgJ2tpbmQnLCAnbGFiZWwnLCAnbGFuZycsICdsaXN0JywgJ2xvYWRpbmcnLCAnbG9vcCcsICdsb3cnLCAnbWF4JywgJ21heGxlbmd0aCcsICdtZWRpYScsICdtZXRob2QnLCAnbWluJywgJ21pbmxlbmd0aCcsICdtdWx0aXBsZScsICdtdXRlZCcsICduYW1lJywgJ25vc2hhZGUnLCAnbm92YWxpZGF0ZScsICdub3dyYXAnLCAnb3BlbicsICdvcHRpbXVtJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncGxheXNpbmxpbmUnLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncHViZGF0ZScsICdyYWRpb2dyb3VwJywgJ3JlYWRvbmx5JywgJ3JlbCcsICdyZXF1aXJlZCcsICdyZXYnLCAncmV2ZXJzZWQnLCAncm9sZScsICdyb3dzJywgJ3Jvd3NwYW4nLCAnc3BlbGxjaGVjaycsICdzY29wZScsICdzZWxlY3RlZCcsICdzaGFwZScsICdzaXplJywgJ3NpemVzJywgJ3NwYW4nLCAnc3JjbGFuZycsICdzdGFydCcsICdzcmMnLCAnc3Jjc2V0JywgJ3N0ZXAnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJpbmRleCcsICd0aXRsZScsICd0cmFuc2xhdGUnLCAndHlwZScsICd1c2VtYXAnLCAndmFsaWduJywgJ3ZhbHVlJywgJ3dpZHRoJywgJ3htbG5zJywgJ3Nsb3QnXSk7XG5cbiAgdmFyIHN2ZyQxID0gZnJlZXplKFsnYWNjZW50LWhlaWdodCcsICdhY2N1bXVsYXRlJywgJ2FkZGl0aXZlJywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhc2NlbnQnLCAnYXR0cmlidXRlbmFtZScsICdhdHRyaWJ1dGV0eXBlJywgJ2F6aW11dGgnLCAnYmFzZWZyZXF1ZW5jeScsICdiYXNlbGluZS1zaGlmdCcsICdiZWdpbicsICdiaWFzJywgJ2J5JywgJ2NsYXNzJywgJ2NsaXAnLCAnY2xpcHBhdGh1bml0cycsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2N4JywgJ2N5JywgJ2QnLCAnZHgnLCAnZHknLCAnZGlmZnVzZWNvbnN0YW50JywgJ2RpcmVjdGlvbicsICdkaXNwbGF5JywgJ2Rpdmlzb3InLCAnZHVyJywgJ2VkZ2Vtb2RlJywgJ2VsZXZhdGlvbicsICdlbmQnLCAnZmlsbCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2ZpbHRlcicsICdmaWx0ZXJ1bml0cycsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdmeCcsICdmeScsICdnMScsICdnMicsICdnbHlwaC1uYW1lJywgJ2dseXBocmVmJywgJ2dyYWRpZW50dW5pdHMnLCAnZ3JhZGllbnR0cmFuc2Zvcm0nLCAnaGVpZ2h0JywgJ2hyZWYnLCAnaWQnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2luJywgJ2luMicsICdrJywgJ2sxJywgJ2syJywgJ2szJywgJ2s0JywgJ2tlcm5pbmcnLCAna2V5cG9pbnRzJywgJ2tleXNwbGluZXMnLCAna2V5dGltZXMnLCAnbGFuZycsICdsZW5ndGhhZGp1c3QnLCAnbGV0dGVyLXNwYWNpbmcnLCAna2VybmVsbWF0cml4JywgJ2tlcm5lbHVuaXRsZW5ndGgnLCAnbGlnaHRpbmctY29sb3InLCAnbG9jYWwnLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdtYXJrZXJoZWlnaHQnLCAnbWFya2VydW5pdHMnLCAnbWFya2Vyd2lkdGgnLCAnbWFza2NvbnRlbnR1bml0cycsICdtYXNrdW5pdHMnLCAnbWF4JywgJ21hc2snLCAnbWVkaWEnLCAnbWV0aG9kJywgJ21vZGUnLCAnbWluJywgJ25hbWUnLCAnbnVtb2N0YXZlcycsICdvZmZzZXQnLCAnb3BlcmF0b3InLCAnb3BhY2l0eScsICdvcmRlcicsICdvcmllbnQnLCAnb3JpZW50YXRpb24nLCAnb3JpZ2luJywgJ292ZXJmbG93JywgJ3BhaW50LW9yZGVyJywgJ3BhdGgnLCAncGF0aGxlbmd0aCcsICdwYXR0ZXJuY29udGVudHVuaXRzJywgJ3BhdHRlcm50cmFuc2Zvcm0nLCAncGF0dGVybnVuaXRzJywgJ3BvaW50cycsICdwcmVzZXJ2ZWFscGhhJywgJ3ByZXNlcnZlYXNwZWN0cmF0aW8nLCAncHJpbWl0aXZldW5pdHMnLCAncicsICdyeCcsICdyeScsICdyYWRpdXMnLCAncmVmeCcsICdyZWZ5JywgJ3JlcGVhdGNvdW50JywgJ3JlcGVhdGR1cicsICdyZXN0YXJ0JywgJ3Jlc3VsdCcsICdyb3RhdGUnLCAnc2NhbGUnLCAnc2VlZCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3BlY3VsYXJjb25zdGFudCcsICdzcGVjdWxhcmV4cG9uZW50JywgJ3NwcmVhZG1ldGhvZCcsICdzdGFydG9mZnNldCcsICdzdGRkZXZpYXRpb24nLCAnc3RpdGNodGlsZXMnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlJywgJ3N0cm9rZS13aWR0aCcsICdzdHlsZScsICdzdXJmYWNlc2NhbGUnLCAnc3lzdGVtbGFuZ3VhZ2UnLCAndGFiaW5kZXgnLCAndGFyZ2V0eCcsICd0YXJnZXR5JywgJ3RyYW5zZm9ybScsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndGV4dGxlbmd0aCcsICd0eXBlJywgJ3UxJywgJ3UyJywgJ3VuaWNvZGUnLCAndmFsdWVzJywgJ3ZpZXdib3gnLCAndmlzaWJpbGl0eScsICd2ZXJzaW9uJywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dpZHRoJywgJ3dvcmQtc3BhY2luZycsICd3cmFwJywgJ3dyaXRpbmctbW9kZScsICd4Y2hhbm5lbHNlbGVjdG9yJywgJ3ljaGFubmVsc2VsZWN0b3InLCAneCcsICd4MScsICd4MicsICd4bWxucycsICd5JywgJ3kxJywgJ3kyJywgJ3onLCAnem9vbWFuZHBhbiddKTtcblxuICB2YXIgbWF0aE1sJDEgPSBmcmVlemUoWydhY2NlbnQnLCAnYWNjZW50dW5kZXInLCAnYWxpZ24nLCAnYmV2ZWxsZWQnLCAnY2xvc2UnLCAnY29sdW1uc2FsaWduJywgJ2NvbHVtbmxpbmVzJywgJ2NvbHVtbnNwYW4nLCAnZGVub21hbGlnbicsICdkZXB0aCcsICdkaXInLCAnZGlzcGxheScsICdkaXNwbGF5c3R5bGUnLCAnZW5jb2RpbmcnLCAnZmVuY2UnLCAnZnJhbWUnLCAnaGVpZ2h0JywgJ2hyZWYnLCAnaWQnLCAnbGFyZ2VvcCcsICdsZW5ndGgnLCAnbGluZXRoaWNrbmVzcycsICdsc3BhY2UnLCAnbHF1b3RlJywgJ21hdGhiYWNrZ3JvdW5kJywgJ21hdGhjb2xvcicsICdtYXRoc2l6ZScsICdtYXRodmFyaWFudCcsICdtYXhzaXplJywgJ21pbnNpemUnLCAnbW92YWJsZWxpbWl0cycsICdub3RhdGlvbicsICdudW1hbGlnbicsICdvcGVuJywgJ3Jvd2FsaWduJywgJ3Jvd2xpbmVzJywgJ3Jvd3NwYWNpbmcnLCAncm93c3BhbicsICdyc3BhY2UnLCAncnF1b3RlJywgJ3NjcmlwdGxldmVsJywgJ3NjcmlwdG1pbnNpemUnLCAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLCAnc2VsZWN0aW9uJywgJ3NlcGFyYXRvcicsICdzZXBhcmF0b3JzJywgJ3N0cmV0Y2h5JywgJ3N1YnNjcmlwdHNoaWZ0JywgJ3N1cHNjcmlwdHNoaWZ0JywgJ3N5bW1ldHJpYycsICd2b2Zmc2V0JywgJ3dpZHRoJywgJ3htbG5zJ10pO1xuXG4gIHZhciB4bWwgPSBmcmVlemUoWyd4bGluazpocmVmJywgJ3htbDppZCcsICd4bGluazp0aXRsZScsICd4bWw6c3BhY2UnLCAneG1sbnM6eGxpbmsnXSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG4gIHZhciBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcc1xcU10qfFtcXHNcXFNdKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuICB2YXIgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHNcXFNdKnxbXFxzXFxTXSolPi9nbSk7XG4gIHZhciBEQVRBX0FUVFIgPSBzZWFsKC9eZGF0YS1bXFwtXFx3LlxcdTAwQjctXFx1RkZGRl0vKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgQVJJQV9BVFRSID0gc2VhbCgvXmFyaWEtW1xcLVxcd10rJC8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHZhciBJU19BTExPV0VEX1VSSSA9IHNlYWwoL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98Y2lkfHhtcHApOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICApO1xuICB2YXIgSVNfU0NSSVBUX09SX0RBVEEgPSBzZWFsKC9eKD86XFx3K3NjcmlwdHxkYXRhKTovaSk7XG4gIHZhciBBVFRSX1dISVRFU1BBQ0UgPSBzZWFsKC9bXFx1MDAwMC1cXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDI5XFx1MjA1RlxcdTMwMDBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICk7XG5cbiAgdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4gIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheSQxKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbiAgdmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogd2luZG93O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbm8tb3AgcG9saWN5IGZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICogRG9uJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSFcbiAgICogQHBhcmFtIHs/VHJ1c3RlZFR5cGVQb2xpY3lGYWN0b3J5fSB0cnVzdGVkVHlwZXMgVGhlIHBvbGljeSBmYWN0b3J5LlxuICAgKiBAcGFyYW0ge0RvY3VtZW50fSBkb2N1bWVudCBUaGUgZG9jdW1lbnQgb2JqZWN0ICh0byBkZXRlcm1pbmUgcG9saWN5IG5hbWUgc3VmZml4KVxuICAgKiBAcmV0dXJuIHs/VHJ1c3RlZFR5cGVQb2xpY3l9IFRoZSBwb2xpY3kgY3JlYXRlZCAob3IgbnVsbCwgaWYgVHJ1c3RlZCBUeXBlc1xuICAgKiBhcmUgbm90IHN1cHBvcnRlZCkuXG4gICAqL1xuICB2YXIgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kodHJ1c3RlZFR5cGVzLCBkb2N1bWVudCkge1xuICAgIGlmICgodHlwZW9mIHRydXN0ZWRUeXBlcyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodHJ1c3RlZFR5cGVzKSkgIT09ICdvYmplY3QnIHx8IHR5cGVvZiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgY2FsbGVycyB0byBjb250cm9sIHRoZSB1bmlxdWUgcG9saWN5IG5hbWVcbiAgICAvLyBieSBhZGRpbmcgYSBkYXRhLXR0LXBvbGljeS1zdWZmaXggdG8gdGhlIHNjcmlwdCBlbGVtZW50IHdpdGggdGhlIERPTVB1cmlmeS5cbiAgICAvLyBQb2xpY3kgY3JlYXRpb24gd2l0aCBkdXBsaWNhdGUgbmFtZXMgdGhyb3dzIGluIFRydXN0ZWQgVHlwZXMuXG4gICAgdmFyIHN1ZmZpeCA9IG51bGw7XG4gICAgdmFyIEFUVFJfTkFNRSA9ICdkYXRhLXR0LXBvbGljeS1zdWZmaXgnO1xuICAgIGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuaGFzQXR0cmlidXRlKEFUVFJfTkFNRSkpIHtcbiAgICAgIHN1ZmZpeCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7XG4gICAgfVxuXG4gICAgdmFyIHBvbGljeU5hbWUgPSAnZG9tcHVyaWZ5JyArIChzdWZmaXggPyAnIycgKyBzdWZmaXggOiAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kocG9saWN5TmFtZSwge1xuICAgICAgICBjcmVhdGVIVE1MOiBmdW5jdGlvbiBjcmVhdGVIVE1MKGh0bWwkJDEpIHtcbiAgICAgICAgICByZXR1cm4gaHRtbCQkMTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLy8gUG9saWN5IGNyZWF0aW9uIGZhaWxlZCAobW9zdCBsaWtlbHkgYW5vdGhlciBET01QdXJpZnkgc2NyaXB0IGhhc1xuICAgICAgLy8gYWxyZWFkeSBydW4pLiBTa2lwIGNyZWF0aW5nIHRoZSBwb2xpY3ksIGFzIHRoaXMgd2lsbCBvbmx5IGNhdXNlIGVycm9yc1xuICAgICAgLy8gaWYgVFQgYXJlIGVuZm9yY2VkLlxuICAgICAgY29uc29sZS53YXJuKCdUcnVzdGVkVHlwZXMgcG9saWN5ICcgKyBwb2xpY3lOYW1lICsgJyBjb3VsZCBub3QgYmUgY3JlYXRlZC4nKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVET01QdXJpZnkoKSB7XG4gICAgdmFyIHdpbmRvdyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZ2V0R2xvYmFsKCk7XG5cbiAgICB2YXIgRE9NUHVyaWZ5ID0gZnVuY3Rpb24gRE9NUHVyaWZ5KHJvb3QpIHtcbiAgICAgIHJldHVybiBjcmVhdGVET01QdXJpZnkocm9vdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICAgKi9cbiAgICBET01QdXJpZnkudmVyc2lvbiA9ICcyLjMuMSc7XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbGVtZW50cyB0aGF0IERPTVB1cmlmeSByZW1vdmVkIGR1cmluZyBzYW5pdGF0aW9uLlxuICAgICAqIEVtcHR5IGlmIG5vdGhpbmcgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50Lm5vZGVUeXBlICE9PSA5KSB7XG4gICAgICAvLyBOb3QgcnVubmluZyBpbiBhIGJyb3dzZXIsIHByb3ZpZGUgYSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgICAvLyBzbyB0aGF0IHlvdSBjYW4gcGFzcyB5b3VyIG93biBXaW5kb3dcbiAgICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICAgIH1cblxuICAgIHZhciBvcmlnaW5hbERvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciBEb2N1bWVudEZyYWdtZW50ID0gd2luZG93LkRvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPSB3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgTm9kZSA9IHdpbmRvdy5Ob2RlLFxuICAgICAgICBFbGVtZW50ID0gd2luZG93LkVsZW1lbnQsXG4gICAgICAgIE5vZGVGaWx0ZXIgPSB3aW5kb3cuTm9kZUZpbHRlcixcbiAgICAgICAgX3dpbmRvdyROYW1lZE5vZGVNYXAgPSB3aW5kb3cuTmFtZWROb2RlTWFwLFxuICAgICAgICBOYW1lZE5vZGVNYXAgPSBfd2luZG93JE5hbWVkTm9kZU1hcCA9PT0gdW5kZWZpbmVkID8gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCB3aW5kb3cuTW96TmFtZWRBdHRyTWFwIDogX3dpbmRvdyROYW1lZE5vZGVNYXAsXG4gICAgICAgIFRleHQgPSB3aW5kb3cuVGV4dCxcbiAgICAgICAgQ29tbWVudCA9IHdpbmRvdy5Db21tZW50LFxuICAgICAgICBET01QYXJzZXIgPSB3aW5kb3cuRE9NUGFyc2VyLFxuICAgICAgICB0cnVzdGVkVHlwZXMgPSB3aW5kb3cudHJ1c3RlZFR5cGVzO1xuXG5cbiAgICB2YXIgRWxlbWVudFByb3RvdHlwZSA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgdmFyIGNsb25lTm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2xvbmVOb2RlJyk7XG4gICAgdmFyIGdldE5leHRTaWJsaW5nID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICduZXh0U2libGluZycpO1xuICAgIHZhciBnZXRDaGlsZE5vZGVzID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjaGlsZE5vZGVzJyk7XG4gICAgdmFyIGdldFBhcmVudE5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ3BhcmVudE5vZGUnKTtcblxuICAgIC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAgIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAgIC8vIChodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjcmVhdGluZy1hbmQtcGFzc2luZy1yZWdpc3RyaWVzKVxuICAgIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gICAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgICAvLyBpcyBpbmhlcml0ZWQuXG4gICAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgaWYgKHRlbXBsYXRlLmNvbnRlbnQgJiYgdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50ID0gdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cnVzdGVkVHlwZXNQb2xpY3kgPSBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KHRydXN0ZWRUeXBlcywgb3JpZ2luYWxEb2N1bWVudCk7XG4gICAgdmFyIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoJycpIDogJyc7XG5cbiAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICAgIGltcGxlbWVudGF0aW9uID0gX2RvY3VtZW50LmltcGxlbWVudGF0aW9uLFxuICAgICAgICBjcmVhdGVOb2RlSXRlcmF0b3IgPSBfZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yLFxuICAgICAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50ID0gX2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lID0gX2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lO1xuICAgIHZhciBpbXBvcnROb2RlID0gb3JpZ2luYWxEb2N1bWVudC5pbXBvcnROb2RlO1xuXG5cbiAgICB2YXIgZG9jdW1lbnRNb2RlID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50TW9kZSA9IGNsb25lKGRvY3VtZW50KS5kb2N1bWVudE1vZGUgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiB7fTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgdmFyIGhvb2tzID0ge307XG5cbiAgICAvKipcbiAgICAgKiBFeHBvc2Ugd2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgcnVubmluZyB0aGUgZnVsbCBET01QdXJpZnkuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID0gdHlwZW9mIGdldFBhcmVudE5vZGUgPT09ICdmdW5jdGlvbicgJiYgaW1wbGVtZW50YXRpb24gJiYgdHlwZW9mIGltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnRNb2RlICE9PSA5O1xuXG4gICAgdmFyIE1VU1RBQ0hFX0VYUFIkJDEgPSBNVVNUQUNIRV9FWFBSLFxuICAgICAgICBFUkJfRVhQUiQkMSA9IEVSQl9FWFBSLFxuICAgICAgICBEQVRBX0FUVFIkJDEgPSBEQVRBX0FUVFIsXG4gICAgICAgIEFSSUFfQVRUUiQkMSA9IEFSSUFfQVRUUixcbiAgICAgICAgSVNfU0NSSVBUX09SX0RBVEEkJDEgPSBJU19TQ1JJUFRfT1JfREFUQSxcbiAgICAgICAgQVRUUl9XSElURVNQQUNFJCQxID0gQVRUUl9XSElURVNQQUNFO1xuICAgIHZhciBJU19BTExPV0VEX1VSSSQkMSA9IElTX0FMTE9XRURfVVJJO1xuXG4gICAgLyoqXG4gICAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICAgKiBkb24ndCBhZGQgYW55IG5ldyBvbmVzIGJ1dCBmZWVsIGZyZWUgdG8gcmVtb3ZlIHVud2FudGVkIG9uZXMuXG4gICAgICovXG5cbiAgICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cblxuICAgIHZhciBBTExPV0VEX1RBR1MgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5JDEoaHRtbCksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2ZyksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2Z0ZpbHRlcnMpLCBfdG9Db25zdW1hYmxlQXJyYXkkMShtYXRoTWwpLCBfdG9Db25zdW1hYmxlQXJyYXkkMSh0ZXh0KSkpO1xuXG4gICAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgICB2YXIgQUxMT1dFRF9BVFRSID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX0FUVFIgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSQxKGh0bWwkMSksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2ZyQxKSwgX3RvQ29uc3VtYWJsZUFycmF5JDEobWF0aE1sJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkkMSh4bWwpKSk7XG5cbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiB0YWdzIChvdmVycmlkZXMgQUxMT1dFRF9UQUdTL0FERF9UQUdTKSAqL1xuICAgIHZhciBGT1JCSURfVEFHUyA9IG51bGw7XG5cbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiBhdHRyaWJ1dGVzIChvdmVycmlkZXMgQUxMT1dFRF9BVFRSL0FERF9BVFRSKSAqL1xuICAgIHZhciBGT1JCSURfQVRUUiA9IG51bGw7XG5cbiAgICAvKiBEZWNpZGUgaWYgQVJJQSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gICAgdmFyIEFMTE9XX0FSSUFfQVRUUiA9IHRydWU7XG5cbiAgICAvKiBEZWNpZGUgaWYgY3VzdG9tIGRhdGEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICAgIHZhciBBTExPV19EQVRBX0FUVFIgPSB0cnVlO1xuXG4gICAgLyogRGVjaWRlIGlmIHVua25vd24gcHJvdG9jb2xzIGFyZSBva2F5ICovXG4gICAgdmFyIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gZmFsc2U7XG5cbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGRhdGEgYXR0cmlidXRlcywgbXVzdGFjaGVzIGFuZCBFUkJcbiAgICAgKi9cbiAgICB2YXIgU0FGRV9GT1JfVEVNUExBVEVTID0gZmFsc2U7XG5cbiAgICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG4gICAgdmFyIFdIT0xFX0RPQ1VNRU5UID0gZmFsc2U7XG5cbiAgICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cbiAgICB2YXIgU0VUX0NPTkZJRyA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGFsbCBlbGVtZW50cyAoZS5nLiBzdHlsZSwgc2NyaXB0KSBtdXN0IGJlIGNoaWxkcmVuIG9mXG4gICAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgICB2YXIgRk9SQ0VfQk9EWSA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGEgRE9NIGBIVE1MQm9keUVsZW1lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAgICovXG4gICAgdmFyIFJFVFVSTl9ET00gPSBmYWxzZTtcblxuICAgIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgICAqIHN0cmluZyAgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkgKi9cbiAgICB2YXIgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGZhbHNlO1xuXG4gICAgLyogSWYgYFJFVFVSTl9ET01gIG9yIGBSRVRVUk5fRE9NX0ZSQUdNRU5UYCBpcyBlbmFibGVkLCBkZWNpZGUgaWYgdGhlIHJldHVybmVkIERPTVxuICAgICAqIGBOb2RlYCBpcyBpbXBvcnRlZCBpbnRvIHRoZSBjdXJyZW50IGBEb2N1bWVudGAuIElmIHRoaXMgZmxhZyBpcyBub3QgZW5hYmxlZCB0aGVcbiAgICAgKiBgTm9kZWAgd2lsbCBiZWxvbmcgKGl0cyBvd25lckRvY3VtZW50KSB0byBhIGZyZXNoIGBIVE1MRG9jdW1lbnRgLCBjcmVhdGVkIGJ5XG4gICAgICogRE9NUHVyaWZ5LlxuICAgICAqXG4gICAgICogVGhpcyBkZWZhdWx0cyB0byBgdHJ1ZWAgc3RhcnRpbmcgRE9NUHVyaWZ5IDIuMi4wLiBOb3RlIHRoYXQgc2V0dGluZyBpdCB0byBgZmFsc2VgXG4gICAgICogbWlnaHQgY2F1c2UgWFNTIGZyb20gYXR0YWNrcyBoaWRkZW4gaW4gY2xvc2VkIHNoYWRvd3Jvb3RzIGluIGNhc2UgdGhlIGJyb3dzZXJcbiAgICAgKiBzdXBwb3J0cyBEZWNsYXJhdGl2ZSBTaGFkb3c6IERPTSBodHRwczovL3dlYi5kZXYvZGVjbGFyYXRpdmUtc2hhZG93LWRvbS9cbiAgICAgKi9cbiAgICB2YXIgUkVUVVJOX0RPTV9JTVBPUlQgPSB0cnVlO1xuXG4gICAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAgICogY2FzZSBUcnVzdGVkIFR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkICAqL1xuICAgIHZhciBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG5cbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzPyAqL1xuICAgIHZhciBTQU5JVElaRV9ET00gPSB0cnVlO1xuXG4gICAgLyogS2VlcCBlbGVtZW50IGNvbnRlbnQgd2hlbiByZW1vdmluZyBlbGVtZW50PyAqL1xuICAgIHZhciBLRUVQX0NPTlRFTlQgPSB0cnVlO1xuXG4gICAgLyogSWYgYSBgTm9kZWAgaXMgcGFzc2VkIHRvIHNhbml0aXplKCksIHRoZW4gcGVyZm9ybXMgc2FuaXRpemF0aW9uIGluLXBsYWNlIGluc3RlYWRcbiAgICAgKiBvZiBpbXBvcnRpbmcgaXQgaW50byBhIG5ldyBEb2N1bWVudCBhbmQgcmV0dXJuaW5nIGEgc2FuaXRpemVkIGNvcHkgKi9cbiAgICB2YXIgSU5fUExBQ0UgPSBmYWxzZTtcblxuICAgIC8qIEFsbG93IHVzYWdlIG9mIHByb2ZpbGVzIGxpa2UgaHRtbCwgc3ZnIGFuZCBtYXRoTWwgKi9cbiAgICB2YXIgVVNFX1BST0ZJTEVTID0ge307XG5cbiAgICAvKiBUYWdzIHRvIGlnbm9yZSBjb250ZW50IG9mIHdoZW4gS0VFUF9DT05URU5UIGlzIHRydWUgKi9cbiAgICB2YXIgRk9SQklEX0NPTlRFTlRTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9GT1JCSURfQ09OVEVOVFMgPSBhZGRUb1NldCh7fSwgWydhbm5vdGF0aW9uLXhtbCcsICdhdWRpbycsICdjb2xncm91cCcsICdkZXNjJywgJ2ZvcmVpZ25vYmplY3QnLCAnaGVhZCcsICdpZnJhbWUnLCAnbWF0aCcsICdtaScsICdtbicsICdtbycsICdtcycsICdtdGV4dCcsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ3BsYWludGV4dCcsICdzY3JpcHQnLCAnc3R5bGUnLCAnc3ZnJywgJ3RlbXBsYXRlJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3ZpZGVvJywgJ3htcCddKTtcblxuICAgIC8qIFRhZ3MgdGhhdCBhcmUgc2FmZSBmb3IgZGF0YTogVVJJcyAqL1xuICAgIHZhciBEQVRBX1VSSV9UQUdTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9EQVRBX1VSSV9UQUdTID0gYWRkVG9TZXQoe30sIFsnYXVkaW8nLCAndmlkZW8nLCAnaW1nJywgJ3NvdXJjZScsICdpbWFnZScsICd0cmFjayddKTtcblxuICAgIC8qIEF0dHJpYnV0ZXMgc2FmZSBmb3IgdmFsdWVzIGxpa2UgXCJqYXZhc2NyaXB0OlwiICovXG4gICAgdmFyIFVSSV9TQUZFX0FUVFJJQlVURVMgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVMgPSBhZGRUb1NldCh7fSwgWydhbHQnLCAnY2xhc3MnLCAnZm9yJywgJ2lkJywgJ2xhYmVsJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyb2xlJywgJ3N1bW1hcnknLCAndGl0bGUnLCAndmFsdWUnLCAnc3R5bGUnLCAneG1sbnMnXSk7XG5cbiAgICB2YXIgTUFUSE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbiAgICB2YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gICAgdmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuICAgIC8qIERvY3VtZW50IG5hbWVzcGFjZSAqL1xuICAgIHZhciBOQU1FU1BBQ0UgPSBIVE1MX05BTUVTUEFDRTtcbiAgICB2YXIgSVNfRU1QVFlfSU5QVVQgPSBmYWxzZTtcblxuICAgIC8qIEtlZXAgYSByZWZlcmVuY2UgdG8gY29uZmlnIHRvIHBhc3MgdG8gaG9va3MgKi9cbiAgICB2YXIgQ09ORklHID0gbnVsbDtcblxuICAgIC8qIElkZWFsbHksIGRvIG5vdCB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi9cbiAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovXG5cbiAgICB2YXIgZm9ybUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG5cbiAgICAvKipcbiAgICAgKiBfcGFyc2VDb25maWdcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gY2ZnIG9wdGlvbmFsIGNvbmZpZyBsaXRlcmFsXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICB2YXIgX3BhcnNlQ29uZmlnID0gZnVuY3Rpb24gX3BhcnNlQ29uZmlnKGNmZykge1xuICAgICAgaWYgKENPTkZJRyAmJiBDT05GSUcgPT09IGNmZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRhbXBlcmluZyAqL1xuICAgICAgaWYgKCFjZmcgfHwgKHR5cGVvZiBjZmcgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGNmZykpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBjZmcgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gcHJvdG90eXBlIHBvbGx1dGlvbiAqL1xuICAgICAgY2ZnID0gY2xvbmUoY2ZnKTtcblxuICAgICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgICAgQUxMT1dFRF9UQUdTID0gJ0FMTE9XRURfVEFHUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX1RBR1MpIDogREVGQVVMVF9BTExPV0VEX1RBR1M7XG4gICAgICBBTExPV0VEX0FUVFIgPSAnQUxMT1dFRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfQVRUUikgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSAnQUREX1VSSV9TQUZFX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksIGNmZy5BRERfVVJJX1NBRkVfQVRUUikgOiBERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVM7XG4gICAgICBEQVRBX1VSSV9UQUdTID0gJ0FERF9EQVRBX1VSSV9UQUdTJyBpbiBjZmcgPyBhZGRUb1NldChjbG9uZShERUZBVUxUX0RBVEFfVVJJX1RBR1MpLCBjZmcuQUREX0RBVEFfVVJJX1RBR1MpIDogREVGQVVMVF9EQVRBX1VSSV9UQUdTO1xuICAgICAgRk9SQklEX0NPTlRFTlRTID0gJ0ZPUkJJRF9DT05URU5UUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfQ09OVEVOVFMpIDogREVGQVVMVF9GT1JCSURfQ09OVEVOVFM7XG4gICAgICBGT1JCSURfVEFHUyA9ICdGT1JCSURfVEFHUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfVEFHUykgOiB7fTtcbiAgICAgIEZPUkJJRF9BVFRSID0gJ0ZPUkJJRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkZPUkJJRF9BVFRSKSA6IHt9O1xuICAgICAgVVNFX1BST0ZJTEVTID0gJ1VTRV9QUk9GSUxFUycgaW4gY2ZnID8gY2ZnLlVTRV9QUk9GSUxFUyA6IGZhbHNlO1xuICAgICAgQUxMT1dfQVJJQV9BVFRSID0gY2ZnLkFMTE9XX0FSSUFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgQUxMT1dfREFUQV9BVFRSID0gY2ZnLkFMTE9XX0RBVEFfQVRUUiAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgPSBjZmcuQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFNBRkVfRk9SX1RFTVBMQVRFUyA9IGNmZy5TQUZFX0ZPUl9URU1QTEFURVMgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFdIT0xFX0RPQ1VNRU5UID0gY2ZnLldIT0xFX0RPQ1VNRU5UIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBSRVRVUk5fRE9NID0gY2ZnLlJFVFVSTl9ET00gfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFJFVFVSTl9ET01fRlJBR01FTlQgPSBjZmcuUkVUVVJOX0RPTV9GUkFHTUVOVCB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgUkVUVVJOX0RPTV9JTVBPUlQgPSBjZmcuUkVUVVJOX0RPTV9JTVBPUlQgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIFJFVFVSTl9UUlVTVEVEX1RZUEUgPSBjZmcuUkVUVVJOX1RSVVNURURfVFlQRSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgRk9SQ0VfQk9EWSA9IGNmZy5GT1JDRV9CT0RZIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBTQU5JVElaRV9ET00gPSBjZmcuU0FOSVRJWkVfRE9NICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBLRUVQX0NPTlRFTlQgPSBjZmcuS0VFUF9DT05URU5UICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBJTl9QTEFDRSA9IGNmZy5JTl9QTEFDRSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgSVNfQUxMT1dFRF9VUkkkJDEgPSBjZmcuQUxMT1dFRF9VUklfUkVHRVhQIHx8IElTX0FMTE9XRURfVVJJJCQxO1xuICAgICAgTkFNRVNQQUNFID0gY2ZnLk5BTUVTUEFDRSB8fCBIVE1MX05BTUVTUEFDRTtcbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIFJFVFVSTl9ET00gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBQYXJzZSBwcm9maWxlIGluZm8gKi9cbiAgICAgIGlmIChVU0VfUFJPRklMRVMpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkkMSh0ZXh0KSkpO1xuICAgICAgICBBTExPV0VEX0FUVFIgPSBbXTtcbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBodG1sKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGh0bWwkMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2ZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgc3ZnKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHN2ZyQxKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2Z0ZpbHRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgc3ZnJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMubWF0aE1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBtYXRoTWwpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgbWF0aE1sJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBNZXJnZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICAgIGlmIChjZmcuQUREX1RBR1MpIHtcbiAgICAgICAgaWYgKEFMTE9XRURfVEFHUyA9PT0gREVGQVVMVF9BTExPV0VEX1RBR1MpIHtcbiAgICAgICAgICBBTExPV0VEX1RBR1MgPSBjbG9uZShBTExPV0VEX1RBR1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBjZmcuQUREX1RBR1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkFERF9BVFRSKSB7XG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgICAgQUxMT1dFRF9BVFRSID0gY2xvbmUoQUxMT1dFRF9BVFRSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgY2ZnLkFERF9BVFRSKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5BRERfVVJJX1NBRkVfQVRUUikge1xuICAgICAgICBhZGRUb1NldChVUklfU0FGRV9BVFRSSUJVVEVTLCBjZmcuQUREX1VSSV9TQUZFX0FUVFIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkZPUkJJRF9DT05URU5UUykge1xuICAgICAgICBpZiAoRk9SQklEX0NPTlRFTlRTID09PSBERUZBVUxUX0ZPUkJJRF9DT05URU5UUykge1xuICAgICAgICAgIEZPUkJJRF9DT05URU5UUyA9IGNsb25lKEZPUkJJRF9DT05URU5UUyk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRUb1NldChGT1JCSURfQ09OVEVOVFMsIGNmZy5GT1JCSURfQ09OVEVOVFMpO1xuICAgICAgfVxuXG4gICAgICAvKiBBZGQgI3RleHQgaW4gY2FzZSBLRUVQX0NPTlRFTlQgaXMgc2V0IHRvIHRydWUgKi9cbiAgICAgIGlmIChLRUVQX0NPTlRFTlQpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTWycjdGV4dCddID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuICAgICAgaWYgKFdIT0xFX0RPQ1VNRU5UKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgWydodG1sJywgJ2hlYWQnLCAnYm9keSddKTtcbiAgICAgIH1cblxuICAgICAgLyogQWRkIHRib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIHRhYmxlcyBhcmUgcGVybWl0dGVkLCBzZWUgIzI4NiwgIzM2NSAqL1xuICAgICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsndGJvZHknXSk7XG4gICAgICAgIGRlbGV0ZSBGT1JCSURfVEFHUy50Ym9keTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBvZiBjb25maWd1cmF0aW9uLlxuICAgICAgLy8gTm90IGF2YWlsYWJsZSBpbiBJRTgsIFNhZmFyaSA1LCBldGMuXG4gICAgICBpZiAoZnJlZXplKSB7XG4gICAgICAgIGZyZWV6ZShjZmcpO1xuICAgICAgfVxuXG4gICAgICBDT05GSUcgPSBjZmc7XG4gICAgfTtcblxuICAgIHZhciBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPSBhZGRUb1NldCh7fSwgWydtaScsICdtbycsICdtbicsICdtcycsICdtdGV4dCddKTtcblxuICAgIHZhciBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2ZvcmVpZ25vYmplY3QnLCAnZGVzYycsICd0aXRsZScsICdhbm5vdGF0aW9uLXhtbCddKTtcblxuICAgIC8qIEtlZXAgdHJhY2sgb2YgYWxsIHBvc3NpYmxlIFNWRyBhbmQgTWF0aE1MIHRhZ3NcbiAgICAgKiBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIHRoZSBuYW1lc3BhY2UgY2hlY2tzXG4gICAgICogY29ycmVjdGx5LiAqL1xuICAgIHZhciBBTExfU1ZHX1RBR1MgPSBhZGRUb1NldCh7fSwgc3ZnKTtcbiAgICBhZGRUb1NldChBTExfU1ZHX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgIGFkZFRvU2V0KEFMTF9TVkdfVEFHUywgc3ZnRGlzYWxsb3dlZCk7XG5cbiAgICB2YXIgQUxMX01BVEhNTF9UQUdTID0gYWRkVG9TZXQoe30sIG1hdGhNbCk7XG4gICAgYWRkVG9TZXQoQUxMX01BVEhNTF9UQUdTLCBtYXRoTWxEaXNhbGxvd2VkKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtFbGVtZW50fSBlbGVtZW50IGEgRE9NIGVsZW1lbnQgd2hvc2UgbmFtZXNwYWNlIGlzIGJlaW5nIGNoZWNrZWRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBhXG4gICAgICogIG5hbWVzcGFjZSB0aGF0IGEgc3BlYy1jb21wbGlhbnQgcGFyc2VyIHdvdWxkIG5ldmVyXG4gICAgICogIHJldHVybi4gUmV0dXJuIHRydWUgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHZhciBfY2hlY2tWYWxpZE5hbWVzcGFjZSA9IGZ1bmN0aW9uIF9jaGVja1ZhbGlkTmFtZXNwYWNlKGVsZW1lbnQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gICAgICAvLyBJbiBKU0RPTSwgaWYgd2UncmUgaW5zaWRlIHNoYWRvdyBET00sIHRoZW4gcGFyZW50Tm9kZVxuICAgICAgLy8gY2FuIGJlIG51bGwuIFdlIGp1c3Qgc2ltdWxhdGUgcGFyZW50IGluIHRoaXMgY2FzZS5cbiAgICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQudGFnTmFtZSkge1xuICAgICAgICBwYXJlbnQgPSB7XG4gICAgICAgICAgbmFtZXNwYWNlVVJJOiBIVE1MX05BTUVTUEFDRSxcbiAgICAgICAgICB0YWdOYW1lOiAndGVtcGxhdGUnXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZhciB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoZWxlbWVudC50YWdOYW1lKTtcbiAgICAgIHZhciBwYXJlbnRUYWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UocGFyZW50LnRhZ05hbWUpO1xuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIFNWR1xuICAgICAgICAvLyBpcyB2aWEgPHN2Zz4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGtpbGxlZC5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdzdmcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIE1hdGhNTCB0byBTVkcgaXMgdmlhXG4gICAgICAgIC8vIHN2ZyBpZiBwYXJlbnQgaXMgZWl0aGVyIDxhbm5vdGF0aW9uLXhtbD4gb3IgTWF0aE1MXG4gICAgICAgIC8vIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzLlxuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJyAmJiAocGFyZW50VGFnTmFtZSA9PT0gJ2Fubm90YXRpb24teG1sJyB8fCBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Ugb25seSBhbGxvdyBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIGluIFNWR1xuICAgICAgICAvLyBzcGVjLiBBbGwgb3RoZXJzIGFyZSBkaXNhbGxvd2VkIGluIFNWRyBuYW1lc3BhY2UuXG4gICAgICAgIHJldHVybiBCb29sZWFuKEFMTF9TVkdfVEFHU1t0YWdOYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gTUFUSE1MX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gSFRNTCBuYW1lc3BhY2UgdG8gTWF0aE1MXG4gICAgICAgIC8vIGlzIHZpYSA8bWF0aD4uIElmIGl0IGhhcHBlbnMgdmlhIGFueSBvdGhlciB0YWcsIHRoZW5cbiAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGtpbGxlZC5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gTWF0aE1MIGlzIHZpYVxuICAgICAgICAvLyA8bWF0aD4gYW5kIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ05hbWUgPT09ICdtYXRoJyAmJiBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBNYXRoTUxcbiAgICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBNYXRoTUwgbmFtZXNwYWNlLlxuICAgICAgICByZXR1cm4gQm9vbGVhbihBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBTVkcgdG8gSFRNTCBpcyB2aWFcbiAgICAgICAgLy8gSFRNTCBpbnRlZ3JhdGlvbiBwb2ludHMsIGFuZCBmcm9tIE1hdGhNTCB0byBIVE1MXG4gICAgICAgIC8vIGlzIHZpYSBNYXRoTUwgdGV4dCBpbnRlZ3JhdGlvbiBwb2ludHNcbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UgJiYgIUhUTUxfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UgJiYgIU1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENlcnRhaW4gZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYm90aCBTVkcgYW5kIEhUTUxcbiAgICAgICAgLy8gbmFtZXNwYWNlLiBXZSBuZWVkIHRvIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5XG4gICAgICAgIC8vIHNvIHRoYXQgdGhleSBkb24ndCBnZXQgZXJyb25vdXNseSBkZWxldGVkIGZyb21cbiAgICAgICAgLy8gSFRNTCBuYW1lc3BhY2UuXG4gICAgICAgIHZhciBjb21tb25TdmdBbmRIVE1MRWxlbWVudHMgPSBhZGRUb1NldCh7fSwgWyd0aXRsZScsICdzdHlsZScsICdmb250JywgJ2EnLCAnc2NyaXB0J10pO1xuXG4gICAgICAgIC8vIFdlIGRpc2FsbG93IHRhZ3MgdGhhdCBhcmUgc3BlY2lmaWMgZm9yIE1hdGhNTFxuICAgICAgICAvLyBvciBTVkcgYW5kIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gSFRNTCBuYW1lc3BhY2VcbiAgICAgICAgcmV0dXJuICFBTExfTUFUSE1MX1RBR1NbdGFnTmFtZV0gJiYgKGNvbW1vblN2Z0FuZEhUTUxFbGVtZW50c1t0YWdOYW1lXSB8fCAhQUxMX1NWR19UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvZGUgc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgcGxhY2UgKHRoaXMgbWVhbnNcbiAgICAgIC8vIHRoYXQgdGhlIGVsZW1lbnQgc29tZWhvdyBnb3QgbmFtZXNwYWNlIHRoYXQgaXMgbm90XG4gICAgICAvLyBIVE1MLCBTVkcgb3IgTWF0aE1MKS4gUmV0dXJuIGZhbHNlIGp1c3QgaW4gY2FzZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2ZvcmNlUmVtb3ZlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBub2RlIGEgRE9NIG5vZGVcbiAgICAgKi9cbiAgICB2YXIgX2ZvcmNlUmVtb3ZlID0gZnVuY3Rpb24gX2ZvcmNlUmVtb3ZlKG5vZGUpIHtcbiAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwgeyBlbGVtZW50OiBub2RlIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLXJlbW92ZVxuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbm9kZS5vdXRlckhUTUwgPSBlbXB0eUhUTUw7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9yZW1vdmVBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gbmFtZSBhbiBBdHRyaWJ1dGUgbmFtZVxuICAgICAqIEBwYXJhbSAge05vZGV9IG5vZGUgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfcmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBub2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IG5vZGUuZ2V0QXR0cmlidXRlTm9kZShuYW1lKSxcbiAgICAgICAgICBmcm9tOiBub2RlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHtcbiAgICAgICAgICBhdHRyaWJ1dGU6IG51bGwsXG4gICAgICAgICAgZnJvbTogbm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICAgIC8vIFdlIHZvaWQgYXR0cmlidXRlIHZhbHVlcyBmb3IgdW5yZW1vdmFibGUgXCJpc1wiXCIgYXR0cmlidXRlc1xuICAgICAgaWYgKG5hbWUgPT09ICdpcycgJiYgIUFMTE9XRURfQVRUUltuYW1lXSkge1xuICAgICAgICBpZiAoUkVUVVJOX0RPTSB8fCBSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF9mb3JjZVJlbW92ZShub2RlKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaW5pdERvY3VtZW50XG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGRpcnR5IGEgc3RyaW5nIG9mIGRpcnR5IG1hcmt1cFxuICAgICAqIEByZXR1cm4ge0RvY3VtZW50fSBhIERPTSwgZmlsbGVkIHdpdGggdGhlIGRpcnR5IG1hcmt1cFxuICAgICAqL1xuICAgIHZhciBfaW5pdERvY3VtZW50ID0gZnVuY3Rpb24gX2luaXREb2N1bWVudChkaXJ0eSkge1xuICAgICAgLyogQ3JlYXRlIGEgSFRNTCBkb2N1bWVudCAqL1xuICAgICAgdmFyIGRvYyA9IHZvaWQgMDtcbiAgICAgIHZhciBsZWFkaW5nV2hpdGVzcGFjZSA9IHZvaWQgMDtcblxuICAgICAgaWYgKEZPUkNFX0JPRFkpIHtcbiAgICAgICAgZGlydHkgPSAnPHJlbW92ZT48L3JlbW92ZT4nICsgZGlydHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBJZiBGT1JDRV9CT0RZIGlzbid0IHVzZWQsIGxlYWRpbmcgd2hpdGVzcGFjZSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgbWFudWFsbHkgKi9cbiAgICAgICAgdmFyIG1hdGNoZXMgPSBzdHJpbmdNYXRjaChkaXJ0eSwgL15bXFxyXFxuXFx0IF0rLyk7XG4gICAgICAgIGxlYWRpbmdXaGl0ZXNwYWNlID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzBdO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlydHlQYXlsb2FkID0gdHJ1c3RlZFR5cGVzUG9saWN5ID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoZGlydHkpIDogZGlydHk7XG4gICAgICAvKlxuICAgICAgICogVXNlIHRoZSBET01QYXJzZXIgQVBJIGJ5IGRlZmF1bHQsIGZhbGxiYWNrIGxhdGVyIGlmIG5lZWRzIGJlXG4gICAgICAgKiBET01QYXJzZXIgbm90IHdvcmsgZm9yIHN2ZyB3aGVuIGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnQuXG4gICAgICAgKi9cbiAgICAgIGlmIChOQU1FU1BBQ0UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkaXJ0eVBheWxvYWQsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH1cblxuICAgICAgLyogVXNlIGNyZWF0ZUhUTUxEb2N1bWVudCBpbiBjYXNlIERPTVBhcnNlciBpcyBub3QgYXZhaWxhYmxlICovXG4gICAgICBpZiAoIWRvYyB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICBkb2MgPSBpbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudChOQU1FU1BBQ0UsICd0ZW1wbGF0ZScsIG51bGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MID0gSVNfRU1QVFlfSU5QVVQgPyAnJyA6IGRpcnR5UGF5bG9hZDtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIC8vIFN5bnRheCBlcnJvciBpZiBkaXJ0eVBheWxvYWQgaXMgaW52YWxpZCB4bWxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgYm9keSA9IGRvYy5ib2R5IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgIGlmIChkaXJ0eSAmJiBsZWFkaW5nV2hpdGVzcGFjZSkge1xuICAgICAgICBib2R5Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWFkaW5nV2hpdGVzcGFjZSksIGJvZHkuY2hpbGROb2Rlc1swXSB8fCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgLyogV29yayBvbiB3aG9sZSBkb2N1bWVudCBvciBqdXN0IGl0cyBib2R5ICovXG4gICAgICBpZiAoTkFNRVNQQUNFID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUuY2FsbChkb2MsIFdIT0xFX0RPQ1VNRU5UID8gJ2h0bWwnIDogJ2JvZHknKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFdIT0xFX0RPQ1VNRU5UID8gZG9jLmRvY3VtZW50RWxlbWVudCA6IGJvZHk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9jcmVhdGVJdGVyYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnR9IHJvb3QgZG9jdW1lbnQvZnJhZ21lbnQgdG8gY3JlYXRlIGl0ZXJhdG9yIGZvclxuICAgICAqIEByZXR1cm4ge0l0ZXJhdG9yfSBpdGVyYXRvciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHZhciBfY3JlYXRlSXRlcmF0b3IgPSBmdW5jdGlvbiBfY3JlYXRlSXRlcmF0b3Iocm9vdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZU5vZGVJdGVyYXRvci5jYWxsKHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LCByb290LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIG51bGwsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2lzQ2xvYmJlcmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBlbG0gZWxlbWVudCB0byBjaGVjayBmb3IgY2xvYmJlcmluZyBhdHRhY2tzXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBjbG9iYmVyZWQsIGZhbHNlIGlmIHNhZmVcbiAgICAgKi9cbiAgICB2YXIgX2lzQ2xvYmJlcmVkID0gZnVuY3Rpb24gX2lzQ2xvYmJlcmVkKGVsbSkge1xuICAgICAgaWYgKGVsbSBpbnN0YW5jZW9mIFRleHQgfHwgZWxtIGluc3RhbmNlb2YgQ29tbWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZWxtLm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnJlbW92ZUNoaWxkICE9PSAnZnVuY3Rpb24nIHx8ICEoZWxtLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8IHR5cGVvZiBlbG0ucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0uc2V0QXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0ubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaXNOb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBvYmogb2JqZWN0IHRvIGNoZWNrIHdoZXRoZXIgaXQncyBhIERPTSBub2RlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpcyBvYmplY3QgaXMgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfaXNOb2RlID0gZnVuY3Rpb24gX2lzTm9kZShvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIE5vZGUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKE5vZGUpKSA9PT0gJ29iamVjdCcgPyBvYmplY3QgaW5zdGFuY2VvZiBOb2RlIDogb2JqZWN0ICYmICh0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmplY3QpKSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZyc7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9leGVjdXRlSG9va1xuICAgICAqIEV4ZWN1dGUgdXNlciBjb25maWd1cmFibGUgaG9va3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZW50cnlQb2ludCAgTmFtZSBvZiB0aGUgaG9vaydzIGVudHJ5IHBvaW50XG4gICAgICogQHBhcmFtICB7Tm9kZX0gY3VycmVudE5vZGUgbm9kZSB0byB3b3JrIG9uIHdpdGggdGhlIGhvb2tcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgYWRkaXRpb25hbCBob29rIHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICB2YXIgX2V4ZWN1dGVIb29rID0gZnVuY3Rpb24gX2V4ZWN1dGVIb29rKGVudHJ5UG9pbnQsIGN1cnJlbnROb2RlLCBkYXRhKSB7XG4gICAgICBpZiAoIWhvb2tzW2VudHJ5UG9pbnRdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXJyYXlGb3JFYWNoKGhvb2tzW2VudHJ5UG9pbnRdLCBmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICBob29rLmNhbGwoRE9NUHVyaWZ5LCBjdXJyZW50Tm9kZSwgZGF0YSwgQ09ORklHKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVFbGVtZW50c1xuICAgICAqXG4gICAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICAgKiBAcHJvdGVjdCB0ZXh0Q29udGVudFxuICAgICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICB7Tm9kZX0gY3VycmVudE5vZGUgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb24gdG8gZXhpc3RcbiAgICAgKiBAcmV0dXJuICB7Qm9vbGVhbn0gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICAgKi9cbiAgICB2YXIgX3Nhbml0aXplRWxlbWVudHMgPSBmdW5jdGlvbiBfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSB2b2lkIDA7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVFbGVtZW50cycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cbiAgICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayBpZiB0YWduYW1lIGNvbnRhaW5zIFVuaWNvZGUgKi9cbiAgICAgIGlmIChzdHJpbmdNYXRjaChjdXJyZW50Tm9kZS5ub2RlTmFtZSwgL1tcXHUwMDgwLVxcdUZGRkZdLykpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cbiAgICAgIHZhciB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLCBjdXJyZW50Tm9kZSwge1xuICAgICAgICB0YWdOYW1lOiB0YWdOYW1lLFxuICAgICAgICBhbGxvd2VkVGFnczogQUxMT1dFRF9UQUdTXG4gICAgICB9KTtcblxuICAgICAgLyogRGV0ZWN0IG1YU1MgYXR0ZW1wdHMgYWJ1c2luZyBuYW1lc3BhY2UgY29uZnVzaW9uICovXG4gICAgICBpZiAoIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmICghX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50KSB8fCAhX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkKSkgJiYgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpICYmIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUudGV4dENvbnRlbnQpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBNaXRpZ2F0ZSBhIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZXMgaW5zaWRlIHNlbGVjdCAqL1xuICAgICAgaWYgKHRhZ05hbWUgPT09ICdzZWxlY3QnICYmIHJlZ0V4cFRlc3QoLzx0ZW1wbGF0ZS9pLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgLyogS2VlcCBjb250ZW50IGV4Y2VwdCBmb3IgYmFkLWxpc3RlZCBlbGVtZW50cyAqL1xuICAgICAgICBpZiAoS0VFUF9DT05URU5UICYmICFGT1JCSURfQ09OVEVOVFNbdGFnTmFtZV0pIHtcbiAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpIHx8IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgdmFyIGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKGN1cnJlbnROb2RlKSB8fCBjdXJyZW50Tm9kZS5jaGlsZE5vZGVzO1xuXG4gICAgICAgICAgaWYgKGNoaWxkTm9kZXMgJiYgcGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkQ291bnQgPSBjaGlsZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkQ291bnQgLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjbG9uZU5vZGUoY2hpbGROb2Rlc1tpXSwgdHJ1ZSksIGdldE5leHRTaWJsaW5nKGN1cnJlbnROb2RlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIENoZWNrIHdoZXRoZXIgZWxlbWVudCBoYXMgYSB2YWxpZCBuYW1lc3BhY2UgKi9cbiAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgIV9jaGVja1ZhbGlkTmFtZXNwYWNlKGN1cnJlbnROb2RlKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCh0YWdOYW1lID09PSAnbm9zY3JpcHQnIHx8IHRhZ05hbWUgPT09ICdub2VtYmVkJykgJiYgcmVnRXhwVGVzdCgvPFxcL25vKHNjcmlwdHxlbWJlZCkvaSwgY3VycmVudE5vZGUuaW5uZXJIVE1MKSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogU2FuaXRpemUgZWxlbWVudCBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMgJiYgY3VycmVudE5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgLyogR2V0IHRoZSBlbGVtZW50J3MgdGV4dCBjb250ZW50ICovXG4gICAgICAgIGNvbnRlbnQgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudDtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgTVVTVEFDSEVfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgY29udGVudCA9IHN0cmluZ1JlcGxhY2UoY29udGVudCwgRVJCX0VYUFIkJDEsICcgJyk7XG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS50ZXh0Q29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwgeyBlbGVtZW50OiBjdXJyZW50Tm9kZS5jbG9uZU5vZGUoKSB9KTtcbiAgICAgICAgICBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rKCdhZnRlclNhbml0aXplRWxlbWVudHMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2lzVmFsaWRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbGNUYWcgTG93ZXJjYXNlIHRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxjTmFtZSBMb3dlcmNhc2UgYXR0cmlidXRlIG5hbWUuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIHZhciBfaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIF9pc1ZhbGlkQXR0cmlidXRlKGxjVGFnLCBsY05hbWUsIHZhbHVlKSB7XG4gICAgICAvKiBNYWtlIHN1cmUgYXR0cmlidXRlIGNhbm5vdCBjbG9iYmVyICovXG4gICAgICBpZiAoU0FOSVRJWkVfRE9NICYmIChsY05hbWUgPT09ICdpZCcgfHwgbGNOYW1lID09PSAnbmFtZScpICYmICh2YWx1ZSBpbiBkb2N1bWVudCB8fCB2YWx1ZSBpbiBmb3JtRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvKiBBbGxvdyB2YWxpZCBkYXRhLSogYXR0cmlidXRlczogQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhZnRlciBcIi1cIlxuICAgICAgICAgIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNlbWJlZGRpbmctY3VzdG9tLW5vbi12aXNpYmxlLWRhdGEtd2l0aC10aGUtZGF0YS0qLWF0dHJpYnV0ZXMpXG4gICAgICAgICAgWE1MLWNvbXBhdGlibGUgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2luZnJhc3RydWN0dXJlLmh0bWwjeG1sLWNvbXBhdGlibGUgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jZDBlODA0KVxuICAgICAgICAgIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlOyBpdCdzIGFsd2F5cyBVUkkgc2FmZS4gKi9cbiAgICAgIGlmIChBTExPV19EQVRBX0FUVFIgJiYgIUZPUkJJRF9BVFRSW2xjTmFtZV0gJiYgcmVnRXhwVGVzdChEQVRBX0FUVFIkJDEsIGxjTmFtZSkpIDsgZWxzZSBpZiAoQUxMT1dfQVJJQV9BVFRSICYmIHJlZ0V4cFRlc3QoQVJJQV9BVFRSJCQxLCBsY05hbWUpKSA7IGVsc2UgaWYgKCFBTExPV0VEX0FUVFJbbGNOYW1lXSB8fCBGT1JCSURfQVRUUltsY05hbWVdKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvKiBDaGVjayB2YWx1ZSBpcyBzYWZlLiBGaXJzdCwgaXMgYXR0ciBpbmVydD8gSWYgc28sIGlzIHNhZmUgKi9cbiAgICAgIH0gZWxzZSBpZiAoVVJJX1NBRkVfQVRUUklCVVRFU1tsY05hbWVdKSA7IGVsc2UgaWYgKHJlZ0V4cFRlc3QoSVNfQUxMT1dFRF9VUkkkJDEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSQkMSwgJycpKSkgOyBlbHNlIGlmICgobGNOYW1lID09PSAnc3JjJyB8fCBsY05hbWUgPT09ICd4bGluazpocmVmJyB8fCBsY05hbWUgPT09ICdocmVmJykgJiYgbGNUYWcgIT09ICdzY3JpcHQnICYmIHN0cmluZ0luZGV4T2YodmFsdWUsICdkYXRhOicpID09PSAwICYmIERBVEFfVVJJX1RBR1NbbGNUYWddKSA7IGVsc2UgaWYgKEFMTE9XX1VOS05PV05fUFJPVE9DT0xTICYmICFyZWdFeHBUZXN0KElTX1NDUklQVF9PUl9EQVRBJCQxLCBzdHJpbmdSZXBsYWNlKHZhbHVlLCBBVFRSX1dISVRFU1BBQ0UkJDEsICcnKSkpIDsgZWxzZSBpZiAoIXZhbHVlKSA7IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVBdHRyaWJ1dGVzXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdCBhdHRyaWJ1dGVzXG4gICAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICAgKiBAcHJvdGVjdCByZW1vdmVBdHRyaWJ1dGVcbiAgICAgKiBAcHJvdGVjdCBzZXRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge05vZGV9IGN1cnJlbnROb2RlIHRvIHNhbml0aXplXG4gICAgICovXG4gICAgdmFyIF9zYW5pdGl6ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBfc2FuaXRpemVBdHRyaWJ1dGVzKGN1cnJlbnROb2RlKSB7XG4gICAgICB2YXIgYXR0ciA9IHZvaWQgMDtcbiAgICAgIHZhciB2YWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBsY05hbWUgPSB2b2lkIDA7XG4gICAgICB2YXIgbCA9IHZvaWQgMDtcbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzJywgY3VycmVudE5vZGUsIG51bGwpO1xuXG4gICAgICB2YXIgYXR0cmlidXRlcyA9IGN1cnJlbnROb2RlLmF0dHJpYnV0ZXM7XG5cbiAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYXR0cmlidXRlczsgaWYgbm90IHdlIG1pZ2h0IGhhdmUgYSB0ZXh0IG5vZGUgKi9cblxuICAgICAgaWYgKCFhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhvb2tFdmVudCA9IHtcbiAgICAgICAgYXR0ck5hbWU6ICcnLFxuICAgICAgICBhdHRyVmFsdWU6ICcnLFxuICAgICAgICBrZWVwQXR0cjogdHJ1ZSxcbiAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXM6IEFMTE9XRURfQVRUUlxuICAgICAgfTtcbiAgICAgIGwgPSBhdHRyaWJ1dGVzLmxlbmd0aDtcblxuICAgICAgLyogR28gYmFja3dhcmRzIG92ZXIgYWxsIGF0dHJpYnV0ZXM7IHNhZmVseSByZW1vdmUgYmFkIG9uZXMgKi9cbiAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgYXR0ciA9IGF0dHJpYnV0ZXNbbF07XG4gICAgICAgIHZhciBfYXR0ciA9IGF0dHIsXG4gICAgICAgICAgICBuYW1lID0gX2F0dHIubmFtZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IF9hdHRyLm5hbWVzcGFjZVVSSTtcblxuICAgICAgICB2YWx1ZSA9IHN0cmluZ1RyaW0oYXR0ci52YWx1ZSk7XG4gICAgICAgIGxjTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKG5hbWUpO1xuXG4gICAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgICAgaG9va0V2ZW50LmF0dHJOYW1lID0gbGNOYW1lO1xuICAgICAgICBob29rRXZlbnQuYXR0clZhbHVlID0gdmFsdWU7XG4gICAgICAgIGhvb2tFdmVudC5rZWVwQXR0ciA9IHRydWU7XG4gICAgICAgIGhvb2tFdmVudC5mb3JjZUtlZXBBdHRyID0gdW5kZWZpbmVkOyAvLyBBbGxvd3MgZGV2ZWxvcGVycyB0byBzZWUgdGhpcyBpcyBhIHByb3BlcnR5IHRoZXkgY2FuIHNldFxuICAgICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZUF0dHJpYnV0ZScsIGN1cnJlbnROb2RlLCBob29rRXZlbnQpO1xuICAgICAgICB2YWx1ZSA9IGhvb2tFdmVudC5hdHRyVmFsdWU7XG4gICAgICAgIC8qIERpZCB0aGUgaG9va3MgYXBwcm92ZSBvZiB0aGUgYXR0cmlidXRlPyAqL1xuICAgICAgICBpZiAoaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFJlbW92ZSBhdHRyaWJ1dGUgKi9cbiAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICAgIGlmICghaG9va0V2ZW50LmtlZXBBdHRyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBXb3JrIGFyb3VuZCBhIHNlY3VyaXR5IGlzc3VlIGluIGpRdWVyeSAzLjAgKi9cbiAgICAgICAgaWYgKHJlZ0V4cFRlc3QoL1xcLz4vaSwgdmFsdWUpKSB7XG4gICAgICAgICAgX3JlbW92ZUF0dHJpYnV0ZShuYW1lLCBjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTYW5pdGl6ZSBhdHRyaWJ1dGUgY29udGVudCB0byBiZSB0ZW1wbGF0ZS1zYWZlICovXG4gICAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIE1VU1RBQ0hFX0VYUFIkJDEsICcgJyk7XG4gICAgICAgICAgdmFsdWUgPSBzdHJpbmdSZXBsYWNlKHZhbHVlLCBFUkJfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIElzIGB2YWx1ZWAgdmFsaWQgZm9yIHRoaXMgYXR0cmlidXRlPyAqL1xuICAgICAgICB2YXIgbGNUYWcgPSBjdXJyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIV9pc1ZhbGlkQXR0cmlidXRlKGxjVGFnLCBsY05hbWUsIHZhbHVlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogSGFuZGxlIGludmFsaWQgZGF0YS0qIGF0dHJpYnV0ZSBzZXQgYnkgdHJ5LWNhdGNoaW5nIGl0ICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHNldEF0dHJpYnV0ZSgpIGZvciBicm93c2VyLXVucmVjb2duaXplZCBuYW1lc3BhY2VzIGUuZy4gXCJ4LXNjaGVtYVwiLiAqL1xuICAgICAgICAgICAgY3VycmVudE5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhcnJheVBvcChET01QdXJpZnkucmVtb3ZlZCk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9zYW5pdGl6ZVNoYWRvd0RPTVxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnQgdG8gaXRlcmF0ZSBvdmVyIHJlY3Vyc2l2ZWx5XG4gICAgICovXG4gICAgdmFyIF9zYW5pdGl6ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uIF9zYW5pdGl6ZVNoYWRvd0RPTShmcmFnbWVudCkge1xuICAgICAgdmFyIHNoYWRvd05vZGUgPSB2b2lkIDA7XG4gICAgICB2YXIgc2hhZG93SXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoZnJhZ21lbnQpO1xuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2JlZm9yZVNhbml0aXplU2hhZG93RE9NJywgZnJhZ21lbnQsIG51bGwpO1xuXG4gICAgICB3aGlsZSAoc2hhZG93Tm9kZSA9IHNoYWRvd0l0ZXJhdG9yLm5leHROb2RlKCkpIHtcbiAgICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZVNoYWRvd05vZGUnLCBzaGFkb3dOb2RlLCBudWxsKTtcblxuICAgICAgICAvKiBTYW5pdGl6ZSB0YWdzIGFuZCBlbGVtZW50cyAqL1xuICAgICAgICBpZiAoX3Nhbml0aXplRWxlbWVudHMoc2hhZG93Tm9kZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIERlZXAgc2hhZG93IERPTSBkZXRlY3RlZCAqL1xuICAgICAgICBpZiAoc2hhZG93Tm9kZS5jb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgICAgIF9zYW5pdGl6ZVNoYWRvd0RPTShzaGFkb3dOb2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG4gICAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoc2hhZG93Tm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYWZ0ZXJTYW5pdGl6ZVNoYWRvd0RPTScsIGZyYWdtZW50LCBudWxsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2FuaXRpemVcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHByb3ZpZGluZyBjb3JlIHNhbml0YXRpb24gZnVuY3Rpb25hbGl0eVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8Tm9kZX0gZGlydHkgc3RyaW5nIG9yIERPTSBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICBET01QdXJpZnkuc2FuaXRpemUgPSBmdW5jdGlvbiAoZGlydHksIGNmZykge1xuICAgICAgdmFyIGJvZHkgPSB2b2lkIDA7XG4gICAgICB2YXIgaW1wb3J0ZWROb2RlID0gdm9pZCAwO1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gdm9pZCAwO1xuICAgICAgdmFyIG9sZE5vZGUgPSB2b2lkIDA7XG4gICAgICB2YXIgcmV0dXJuTm9kZSA9IHZvaWQgMDtcbiAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc3RyaW5nIHRvIHNhbml0aXplLlxuICAgICAgICBETyBOT1QgcmV0dXJuIGVhcmx5LCBhcyB0aGlzIHdpbGwgcmV0dXJuIHRoZSB3cm9uZyB0eXBlIGlmXG4gICAgICAgIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBET00gb2JqZWN0IHJhdGhlciB0aGFuIGEgc3RyaW5nICovXG4gICAgICBJU19FTVBUWV9JTlBVVCA9ICFkaXJ0eTtcbiAgICAgIGlmIChJU19FTVBUWV9JTlBVVCkge1xuICAgICAgICBkaXJ0eSA9ICc8IS0tPic7XG4gICAgICB9XG5cbiAgICAgIC8qIFN0cmluZ2lmeSwgaW4gY2FzZSBkaXJ0eSBpcyBhbiBvYmplY3QgKi9cbiAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnICYmICFfaXNOb2RlKGRpcnR5KSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVnYXRlZC1jb25kaXRpb25cbiAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgndG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXJ0eSA9IGRpcnR5LnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IHR5cGVFcnJvckNyZWF0ZSgnZGlydHkgaXMgbm90IGEgc3RyaW5nLCBhYm9ydGluZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayB3ZSBjYW4gcnVuLiBPdGhlcndpc2UgZmFsbCBiYWNrIG9yIGlnbm9yZSAqL1xuICAgICAgaWYgKCFET01QdXJpZnkuaXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgaWYgKF90eXBlb2Yod2luZG93LnRvU3RhdGljSFRNTCkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB3aW5kb3cudG9TdGF0aWNIVE1MID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9TdGF0aWNIVE1MKGRpcnR5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9TdGF0aWNIVE1MKGRpcnR5Lm91dGVySFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBBc3NpZ24gY29uZmlnIHZhcnMgKi9cbiAgICAgIGlmICghU0VUX0NPTkZJRykge1xuICAgICAgICBfcGFyc2VDb25maWcoY2ZnKTtcbiAgICAgIH1cblxuICAgICAgLyogQ2xlYW4gdXAgcmVtb3ZlZCBlbGVtZW50cyAqL1xuICAgICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgICAgLyogQ2hlY2sgaWYgZGlydHkgaXMgY29ycmVjdGx5IHR5cGVkIGZvciBJTl9QTEFDRSAqL1xuICAgICAgaWYgKHR5cGVvZiBkaXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgSU5fUExBQ0UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKElOX1BMQUNFKSA7IGVsc2UgaWYgKGRpcnR5IGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAvKiBJZiBkaXJ0eSBpcyBhIERPTSBlbGVtZW50LCBhcHBlbmQgdG8gYW4gZW1wdHkgZG9jdW1lbnQgdG8gYXZvaWRcbiAgICAgICAgICAgZWxlbWVudHMgYmVpbmcgc3RyaXBwZWQgYnkgdGhlIHBhcnNlciAqL1xuICAgICAgICBib2R5ID0gX2luaXREb2N1bWVudCgnPCEtLS0tPicpO1xuICAgICAgICBpbXBvcnRlZE5vZGUgPSBib2R5Lm93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZShkaXJ0eSwgdHJ1ZSk7XG4gICAgICAgIGlmIChpbXBvcnRlZE5vZGUubm9kZVR5cGUgPT09IDEgJiYgaW1wb3J0ZWROb2RlLm5vZGVOYW1lID09PSAnQk9EWScpIHtcbiAgICAgICAgICAvKiBOb2RlIGlzIGFscmVhZHkgYSBib2R5LCB1c2UgYXMgaXMgKi9cbiAgICAgICAgICBib2R5ID0gaW1wb3J0ZWROb2RlO1xuICAgICAgICB9IGVsc2UgaWYgKGltcG9ydGVkTm9kZS5ub2RlTmFtZSA9PT0gJ0hUTUwnKSB7XG4gICAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItZG9tLW5vZGUtYXBwZW5kXG4gICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbXBvcnRlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBFeGl0IGRpcmVjdGx5IGlmIHdlIGhhdmUgbm90aGluZyB0byBkbyAqL1xuICAgICAgICBpZiAoIVJFVFVSTl9ET00gJiYgIVNBRkVfRk9SX1RFTVBMQVRFUyAmJiAhV0hPTEVfRE9DVU1FTlQgJiZcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWluY2x1ZGVzXG4gICAgICAgIGRpcnR5LmluZGV4T2YoJzwnKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRvY3VtZW50IHRvIHdvcmsgb24gKi9cbiAgICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuXG4gICAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICAgIGlmICghYm9keSkge1xuICAgICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IGVtcHR5SFRNTDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoYm9keS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cbiAgICAgIHZhciBub2RlSXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoSU5fUExBQ0UgPyBkaXJ0eSA6IGJvZHkpO1xuXG4gICAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cbiAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEZpeCBJRSdzIHN0cmFuZ2UgYmVoYXZpb3Igd2l0aCBtYW5pcHVsYXRlZCB0ZXh0Tm9kZXMgIzg5ICovXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBjdXJyZW50Tm9kZSA9PT0gb2xkTm9kZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2hhZG93IERPTSBkZXRlY3RlZCwgc2FuaXRpemUgaXQgKi9cbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG4gICAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIG9sZE5vZGUgPSBjdXJyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgb2xkTm9kZSA9IG51bGw7XG5cbiAgICAgIC8qIElmIHdlIHNhbml0aXplZCBgZGlydHlgIGluLXBsYWNlLCByZXR1cm4gaXQuICovXG4gICAgICBpZiAoSU5fUExBQ0UpIHtcbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBSZXR1cm4gc2FuaXRpemVkIHN0cmluZyBvciBET00gKi9cbiAgICAgIGlmIChSRVRVUk5fRE9NKSB7XG4gICAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQuY2FsbChib2R5Lm93bmVyRG9jdW1lbnQpO1xuXG4gICAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWFwcGVuZFxuICAgICAgICAgICAgcmV0dXJuTm9kZS5hcHBlbmRDaGlsZChib2R5LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5Ob2RlID0gYm9keTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChSRVRVUk5fRE9NX0lNUE9SVCkge1xuICAgICAgICAgIC8qXG4gICAgICAgICAgICBBZG9wdE5vZGUoKSBpcyBub3QgdXNlZCBiZWNhdXNlIGludGVybmFsIHN0YXRlIGlzIG5vdCByZXNldFxuICAgICAgICAgICAgKGUuZy4gdGhlIHBhc3QgbmFtZXMgbWFwIG9mIGEgSFRNTEZvcm1FbGVtZW50KSwgdGhpcyBpcyBzYWZlXG4gICAgICAgICAgICBpbiB0aGVvcnkgYnV0IHdlIHdvdWxkIHJhdGhlciBub3QgcmlzayBhbm90aGVyIGF0dGFjayB2ZWN0b3IuXG4gICAgICAgICAgICBUaGUgc3RhdGUgdGhhdCBpcyBjbG9uZWQgYnkgaW1wb3J0Tm9kZSgpIGlzIGV4cGxpY2l0bHkgZGVmaW5lZFxuICAgICAgICAgICAgYnkgdGhlIHNwZWNzLlxuICAgICAgICAgICovXG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGltcG9ydE5vZGUuY2FsbChvcmlnaW5hbERvY3VtZW50LCByZXR1cm5Ob2RlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXR1cm5Ob2RlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VyaWFsaXplZEhUTUwgPSBXSE9MRV9ET0NVTUVOVCA/IGJvZHkub3V0ZXJIVE1MIDogYm9keS5pbm5lckhUTUw7XG5cbiAgICAgIC8qIFNhbml0aXplIGZpbmFsIHN0cmluZyB0ZW1wbGF0ZS1zYWZlICovXG4gICAgICBpZiAoU0FGRV9GT1JfVEVNUExBVEVTKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRIVE1MID0gc3RyaW5nUmVwbGFjZShzZXJpYWxpemVkSFRNTCwgTVVTVEFDSEVfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBFUkJfRVhQUiQkMSwgJyAnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoc2VyaWFsaXplZEhUTUwpIDogc2VyaWFsaXplZEhUTUw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gc2V0IHRoZSBjb25maWd1cmF0aW9uIG9uY2VcbiAgICAgKiBzZXRDb25maWdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICBET01QdXJpZnkuc2V0Q29uZmlnID0gZnVuY3Rpb24gKGNmZykge1xuICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgICBTRVRfQ09ORklHID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBjbGVhckNvbmZpZ1xuICAgICAqXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmNsZWFyQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgICAgQ09ORklHID0gbnVsbDtcbiAgICAgIFNFVF9DT05GSUcgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGljIG1ldGhvZCB0byBjaGVjayBpZiBhbiBhdHRyaWJ1dGUgdmFsdWUgaXMgdmFsaWQuXG4gICAgICogVXNlcyBsYXN0IHNldCBjb25maWcsIGlmIGFueS4gT3RoZXJ3aXNlLCB1c2VzIGNvbmZpZyBkZWZhdWx0cy5cbiAgICAgKiBpc1ZhbGlkQXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHRhZyBUYWcgbmFtZSBvZiBjb250YWluaW5nIGVsZW1lbnQuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBhdHRyIEF0dHJpYnV0ZSBuYW1lLlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIHZhbGlkLiBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmlzVmFsaWRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAodGFnLCBhdHRyLCB2YWx1ZSkge1xuICAgICAgLyogSW5pdGlhbGl6ZSBzaGFyZWQgY29uZmlnIHZhcnMgaWYgbmVjZXNzYXJ5LiAqL1xuICAgICAgaWYgKCFDT05GSUcpIHtcbiAgICAgICAgX3BhcnNlQ29uZmlnKHt9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGxjVGFnID0gc3RyaW5nVG9Mb3dlckNhc2UodGFnKTtcbiAgICAgIHZhciBsY05hbWUgPSBzdHJpbmdUb0xvd2VyQ2FzZShhdHRyKTtcbiAgICAgIHJldHVybiBfaXNWYWxpZEF0dHJpYnV0ZShsY1RhZywgbGNOYW1lLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZEhvb2tcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIGFkZCBET01QdXJpZnkgaG9va3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9vayB0byBhZGRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBob29rRnVuY3Rpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgICAqL1xuICAgIERPTVB1cmlmeS5hZGRIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQsIGhvb2tGdW5jdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBob29rRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBob29rc1tlbnRyeVBvaW50XSA9IGhvb2tzW2VudHJ5UG9pbnRdIHx8IFtdO1xuICAgICAgYXJyYXlQdXNoKGhvb2tzW2VudHJ5UG9pbnRdLCBob29rRnVuY3Rpb24pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVIb29rXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgYSBET01QdXJpZnkgaG9vayBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICAgKiAocG9wcyBpdCBmcm9tIHRoZSBzdGFjayBvZiBob29rcyBpZiBtb3JlIGFyZSBwcmVzZW50KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVIb29rID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQpIHtcbiAgICAgIGlmIChob29rc1tlbnRyeVBvaW50XSkge1xuICAgICAgICBhcnJheVBvcChob29rc1tlbnRyeVBvaW50XSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZUhvb2tzXG4gICAgICogUHVibGljIG1ldGhvZCB0byByZW1vdmUgYWxsIERPTVB1cmlmeSBob29rcyBhdCBhIGdpdmVuIGVudHJ5UG9pbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2tzIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVIb29rcyA9IGZ1bmN0aW9uIChlbnRyeVBvaW50KSB7XG4gICAgICBpZiAoaG9va3NbZW50cnlQb2ludF0pIHtcbiAgICAgICAgaG9va3NbZW50cnlQb2ludF0gPSBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlQWxsSG9va3NcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhbGwgRE9NUHVyaWZ5IGhvb2tzXG4gICAgICpcbiAgICAgKi9cbiAgICBET01QdXJpZnkucmVtb3ZlQWxsSG9va3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBob29rcyA9IHt9O1xuICAgIH07XG5cbiAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICB9XG5cbiAgdmFyIHB1cmlmeSA9IGNyZWF0ZURPTVB1cmlmeSgpO1xuXG4gIHJldHVybiBwdXJpZnk7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1cmlmeS5qcy5tYXBcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cclxuLy9cclxuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcclxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxyXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcclxuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxyXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XHJcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxyXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuLy9cclxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcclxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbi8vXHJcbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcclxuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxyXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXHJcbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxyXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1JcclxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxyXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuXHJcbnZhciBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xyXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcclxuXHJcblxyXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcclxuLy8gbXVzdCBiZSBubyBzbGFzaGVzIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XHJcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxyXG4vLyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcGF0aHMpXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xyXG4gIHZhciByZXMgPSBbXTtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICB2YXIgcCA9IHBhcnRzW2ldO1xyXG5cclxuICAgIC8vIGlnbm9yZSBlbXB0eSBwYXJ0c1xyXG4gICAgaWYgKCFwIHx8IHAgPT09ICcuJylcclxuICAgICAgY29udGludWU7XHJcblxyXG4gICAgaWYgKHAgPT09ICcuLicpIHtcclxuICAgICAgaWYgKHJlcy5sZW5ndGggJiYgcmVzW3Jlcy5sZW5ndGggLSAxXSAhPT0gJy4uJykge1xyXG4gICAgICAgIHJlcy5wb3AoKTtcclxuICAgICAgfSBlbHNlIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xyXG4gICAgICAgIHJlcy5wdXNoKCcuLicpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXMucHVzaChwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiByZXM7XHJcbn1cclxuXHJcbi8vIHJldHVybnMgYW4gYXJyYXkgd2l0aCBlbXB0eSBlbGVtZW50cyByZW1vdmVkIGZyb20gZWl0aGVyIGVuZCBvZiB0aGUgaW5wdXRcclxuLy8gYXJyYXkgb3IgdGhlIG9yaWdpbmFsIGFycmF5IGlmIG5vIGVsZW1lbnRzIG5lZWQgdG8gYmUgcmVtb3ZlZFxyXG5mdW5jdGlvbiB0cmltQXJyYXkoYXJyKSB7XHJcbiAgdmFyIGxhc3RJbmRleCA9IGFyci5sZW5ndGggLSAxO1xyXG4gIHZhciBzdGFydCA9IDA7XHJcbiAgZm9yICg7IHN0YXJ0IDw9IGxhc3RJbmRleDsgc3RhcnQrKykge1xyXG4gICAgaWYgKGFycltzdGFydF0pXHJcbiAgICAgIGJyZWFrO1xyXG4gIH1cclxuXHJcbiAgdmFyIGVuZCA9IGxhc3RJbmRleDtcclxuICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XHJcbiAgICBpZiAoYXJyW2VuZF0pXHJcbiAgICAgIGJyZWFrO1xyXG4gIH1cclxuXHJcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gbGFzdEluZGV4KVxyXG4gICAgcmV0dXJuIGFycjtcclxuICBpZiAoc3RhcnQgPiBlbmQpXHJcbiAgICByZXR1cm4gW107XHJcbiAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kICsgMSk7XHJcbn1cclxuXHJcbi8vIFJlZ2V4IHRvIHNwbGl0IGEgd2luZG93cyBwYXRoIGludG8gdGhyZWUgcGFydHM6IFsqLCBkZXZpY2UsIHNsYXNoLFxyXG4vLyB0YWlsXSB3aW5kb3dzLW9ubHlcclxudmFyIHNwbGl0RGV2aWNlUmUgPVxyXG4gICAgL14oW2EtekEtWl06fFtcXFxcXFwvXXsyfVteXFxcXFxcL10rW1xcXFxcXC9dK1teXFxcXFxcL10rKT8oW1xcXFxcXC9dKT8oW1xcc1xcU10qPykkLztcclxuXHJcbi8vIFJlZ2V4IHRvIHNwbGl0IHRoZSB0YWlsIHBhcnQgb2YgdGhlIGFib3ZlIGludG8gWyosIGRpciwgYmFzZW5hbWUsIGV4dF1cclxudmFyIHNwbGl0VGFpbFJlID1cclxuICAgIC9eKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFxcXFxcL10rP3wpKFxcLlteLlxcL1xcXFxdKnwpKSg/OltcXFxcXFwvXSopJC87XHJcblxyXG52YXIgd2luMzIgPSB7fTtcclxuXHJcbi8vIEZ1bmN0aW9uIHRvIHNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XVxyXG5mdW5jdGlvbiB3aW4zMlNwbGl0UGF0aChmaWxlbmFtZSkge1xyXG4gIC8vIFNlcGFyYXRlIGRldmljZStzbGFzaCBmcm9tIHRhaWxcclxuICB2YXIgcmVzdWx0ID0gc3BsaXREZXZpY2VSZS5leGVjKGZpbGVuYW1lKSxcclxuICAgICAgZGV2aWNlID0gKHJlc3VsdFsxXSB8fCAnJykgKyAocmVzdWx0WzJdIHx8ICcnKSxcclxuICAgICAgdGFpbCA9IHJlc3VsdFszXSB8fCAnJztcclxuICAvLyBTcGxpdCB0aGUgdGFpbCBpbnRvIGRpciwgYmFzZW5hbWUgYW5kIGV4dGVuc2lvblxyXG4gIHZhciByZXN1bHQyID0gc3BsaXRUYWlsUmUuZXhlYyh0YWlsKSxcclxuICAgICAgZGlyID0gcmVzdWx0MlsxXSxcclxuICAgICAgYmFzZW5hbWUgPSByZXN1bHQyWzJdLFxyXG4gICAgICBleHQgPSByZXN1bHQyWzNdO1xyXG4gIHJldHVybiBbZGV2aWNlLCBkaXIsIGJhc2VuYW1lLCBleHRdO1xyXG59XHJcblxyXG5mdW5jdGlvbiB3aW4zMlN0YXRQYXRoKHBhdGgpIHtcclxuICB2YXIgcmVzdWx0ID0gc3BsaXREZXZpY2VSZS5leGVjKHBhdGgpLFxyXG4gICAgICBkZXZpY2UgPSByZXN1bHRbMV0gfHwgJycsXHJcbiAgICAgIGlzVW5jID0gISFkZXZpY2UgJiYgZGV2aWNlWzFdICE9PSAnOic7XHJcbiAgcmV0dXJuIHtcclxuICAgIGRldmljZTogZGV2aWNlLFxyXG4gICAgaXNVbmM6IGlzVW5jLFxyXG4gICAgaXNBYnNvbHV0ZTogaXNVbmMgfHwgISFyZXN1bHRbMl0sIC8vIFVOQyBwYXRocyBhcmUgYWx3YXlzIGFic29sdXRlXHJcbiAgICB0YWlsOiByZXN1bHRbM11cclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBub3JtYWxpemVVTkNSb290KGRldmljZSkge1xyXG4gIHJldHVybiAnXFxcXFxcXFwnICsgZGV2aWNlLnJlcGxhY2UoL15bXFxcXFxcL10rLywgJycpLnJlcGxhY2UoL1tcXFxcXFwvXSsvZywgJ1xcXFwnKTtcclxufVxyXG5cclxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxyXG53aW4zMi5yZXNvbHZlID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHJlc29sdmVkRGV2aWNlID0gJycsXHJcbiAgICAgIHJlc29sdmVkVGFpbCA9ICcnLFxyXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XHJcblxyXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMTsgaS0tKSB7XHJcbiAgICB2YXIgcGF0aDtcclxuICAgIGlmIChpID49IDApIHtcclxuICAgICAgcGF0aCA9IGFyZ3VtZW50c1tpXTtcclxuICAgIH0gZWxzZSBpZiAoIXJlc29sdmVkRGV2aWNlKSB7XHJcbiAgICAgIHBhdGggPSBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gV2luZG93cyBoYXMgdGhlIGNvbmNlcHQgb2YgZHJpdmUtc3BlY2lmaWMgY3VycmVudCB3b3JraW5nXHJcbiAgICAgIC8vIGRpcmVjdG9yaWVzLiBJZiB3ZSd2ZSByZXNvbHZlZCBhIGRyaXZlIGxldHRlciBidXQgbm90IHlldCBhblxyXG4gICAgICAvLyBhYnNvbHV0ZSBwYXRoLCBnZXQgY3dkIGZvciB0aGF0IGRyaXZlLiBXZSdyZSBzdXJlIHRoZSBkZXZpY2UgaXMgbm90XHJcbiAgICAgIC8vIGFuIHVuYyBwYXRoIGF0IHRoaXMgcG9pbnRzLCBiZWNhdXNlIHVuYyBwYXRocyBhcmUgYWx3YXlzIGFic29sdXRlLlxyXG4gICAgICBwYXRoID0gcHJvY2Vzcy5lbnZbJz0nICsgcmVzb2x2ZWREZXZpY2VdO1xyXG4gICAgICAvLyBWZXJpZnkgdGhhdCBhIGRyaXZlLWxvY2FsIGN3ZCB3YXMgZm91bmQgYW5kIHRoYXQgaXQgYWN0dWFsbHkgcG9pbnRzXHJcbiAgICAgIC8vIHRvIG91ciBkcml2ZS4gSWYgbm90LCBkZWZhdWx0IHRvIHRoZSBkcml2ZSdzIHJvb3QuXHJcbiAgICAgIGlmICghcGF0aCB8fCBwYXRoLnN1YnN0cigwLCAzKS50b0xvd2VyQ2FzZSgpICE9PVxyXG4gICAgICAgICAgcmVzb2x2ZWREZXZpY2UudG9Mb3dlckNhc2UoKSArICdcXFxcJykge1xyXG4gICAgICAgIHBhdGggPSByZXNvbHZlZERldmljZSArICdcXFxcJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xyXG4gICAgaWYgKCF1dGlsLmlzU3RyaW5nKHBhdGgpKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXN1bHQgPSB3aW4zMlN0YXRQYXRoKHBhdGgpLFxyXG4gICAgICAgIGRldmljZSA9IHJlc3VsdC5kZXZpY2UsXHJcbiAgICAgICAgaXNVbmMgPSByZXN1bHQuaXNVbmMsXHJcbiAgICAgICAgaXNBYnNvbHV0ZSA9IHJlc3VsdC5pc0Fic29sdXRlLFxyXG4gICAgICAgIHRhaWwgPSByZXN1bHQudGFpbDtcclxuXHJcbiAgICBpZiAoZGV2aWNlICYmXHJcbiAgICAgICAgcmVzb2x2ZWREZXZpY2UgJiZcclxuICAgICAgICBkZXZpY2UudG9Mb3dlckNhc2UoKSAhPT0gcmVzb2x2ZWREZXZpY2UudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAvLyBUaGlzIHBhdGggcG9pbnRzIHRvIGFub3RoZXIgZGV2aWNlIHNvIGl0IGlzIG5vdCBhcHBsaWNhYmxlXHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVzb2x2ZWREZXZpY2UpIHtcclxuICAgICAgcmVzb2x2ZWREZXZpY2UgPSBkZXZpY2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXJlc29sdmVkQWJzb2x1dGUpIHtcclxuICAgICAgcmVzb2x2ZWRUYWlsID0gdGFpbCArICdcXFxcJyArIHJlc29sdmVkVGFpbDtcclxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc29sdmVkRGV2aWNlICYmIHJlc29sdmVkQWJzb2x1dGUpIHtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDb252ZXJ0IHNsYXNoZXMgdG8gYmFja3NsYXNoZXMgd2hlbiBgcmVzb2x2ZWREZXZpY2VgIHBvaW50cyB0byBhbiBVTkNcclxuICAvLyByb290LiBBbHNvIHNxdWFzaCBtdWx0aXBsZSBzbGFzaGVzIGludG8gYSBzaW5nbGUgb25lIHdoZXJlIGFwcHJvcHJpYXRlLlxyXG4gIGlmIChpc1VuYykge1xyXG4gICAgcmVzb2x2ZWREZXZpY2UgPSBub3JtYWxpemVVTkNSb290KHJlc29sdmVkRGV2aWNlKTtcclxuICB9XHJcblxyXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLFxyXG4gIC8vIGJ1dCBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKVxyXG4gIC8vIGZhaWxzKVxyXG5cclxuICAvLyBOb3JtYWxpemUgdGhlIHRhaWwgcGF0aFxyXG4gIHJlc29sdmVkVGFpbCA9IG5vcm1hbGl6ZUFycmF5KHJlc29sdmVkVGFpbC5zcGxpdCgvW1xcXFxcXC9dKy8pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCdcXFxcJyk7XHJcblxyXG4gIHJldHVybiAocmVzb2x2ZWREZXZpY2UgKyAocmVzb2x2ZWRBYnNvbHV0ZSA/ICdcXFxcJyA6ICcnKSArIHJlc29sdmVkVGFpbCkgfHxcclxuICAgICAgICAgJy4nO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICB2YXIgcmVzdWx0ID0gd2luMzJTdGF0UGF0aChwYXRoKSxcclxuICAgICAgZGV2aWNlID0gcmVzdWx0LmRldmljZSxcclxuICAgICAgaXNVbmMgPSByZXN1bHQuaXNVbmMsXHJcbiAgICAgIGlzQWJzb2x1dGUgPSByZXN1bHQuaXNBYnNvbHV0ZSxcclxuICAgICAgdGFpbCA9IHJlc3VsdC50YWlsLFxyXG4gICAgICB0cmFpbGluZ1NsYXNoID0gL1tcXFxcXFwvXSQvLnRlc3QodGFpbCk7XHJcblxyXG4gIC8vIE5vcm1hbGl6ZSB0aGUgdGFpbCBwYXRoXHJcbiAgdGFpbCA9IG5vcm1hbGl6ZUFycmF5KHRhaWwuc3BsaXQoL1tcXFxcXFwvXSsvKSwgIWlzQWJzb2x1dGUpLmpvaW4oJ1xcXFwnKTtcclxuXHJcbiAgaWYgKCF0YWlsICYmICFpc0Fic29sdXRlKSB7XHJcbiAgICB0YWlsID0gJy4nO1xyXG4gIH1cclxuICBpZiAodGFpbCAmJiB0cmFpbGluZ1NsYXNoKSB7XHJcbiAgICB0YWlsICs9ICdcXFxcJztcclxuICB9XHJcblxyXG4gIC8vIENvbnZlcnQgc2xhc2hlcyB0byBiYWNrc2xhc2hlcyB3aGVuIGBkZXZpY2VgIHBvaW50cyB0byBhbiBVTkMgcm9vdC5cclxuICAvLyBBbHNvIHNxdWFzaCBtdWx0aXBsZSBzbGFzaGVzIGludG8gYSBzaW5nbGUgb25lIHdoZXJlIGFwcHJvcHJpYXRlLlxyXG4gIGlmIChpc1VuYykge1xyXG4gICAgZGV2aWNlID0gbm9ybWFsaXplVU5DUm9vdChkZXZpY2UpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGRldmljZSArIChpc0Fic29sdXRlID8gJ1xcXFwnIDogJycpICsgdGFpbDtcclxufTtcclxuXHJcblxyXG53aW4zMi5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHJldHVybiB3aW4zMlN0YXRQYXRoKHBhdGgpLmlzQWJzb2x1dGU7XHJcbn07XHJcblxyXG53aW4zMi5qb2luID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHBhdGhzID0gW107XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07XHJcbiAgICBpZiAoIXV0aWwuaXNTdHJpbmcoYXJnKSkge1xyXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGFyZykge1xyXG4gICAgICBwYXRocy5wdXNoKGFyZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YXIgam9pbmVkID0gcGF0aHMuam9pbignXFxcXCcpO1xyXG5cclxuICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgam9pbmVkIHBhdGggZG9lc24ndCBzdGFydCB3aXRoIHR3byBzbGFzaGVzLCBiZWNhdXNlXHJcbiAgLy8gbm9ybWFsaXplKCkgd2lsbCBtaXN0YWtlIGl0IGZvciBhbiBVTkMgcGF0aCB0aGVuLlxyXG4gIC8vXHJcbiAgLy8gVGhpcyBzdGVwIGlzIHNraXBwZWQgd2hlbiBpdCBpcyB2ZXJ5IGNsZWFyIHRoYXQgdGhlIHVzZXIgYWN0dWFsbHlcclxuICAvLyBpbnRlbmRlZCB0byBwb2ludCBhdCBhbiBVTkMgcGF0aC4gVGhpcyBpcyBhc3N1bWVkIHdoZW4gdGhlIGZpcnN0XHJcbiAgLy8gbm9uLWVtcHR5IHN0cmluZyBhcmd1bWVudHMgc3RhcnRzIHdpdGggZXhhY3RseSB0d28gc2xhc2hlcyBmb2xsb3dlZCBieVxyXG4gIC8vIGF0IGxlYXN0IG9uZSBtb3JlIG5vbi1zbGFzaCBjaGFyYWN0ZXIuXHJcbiAgLy9cclxuICAvLyBOb3RlIHRoYXQgZm9yIG5vcm1hbGl6ZSgpIHRvIHRyZWF0IGEgcGF0aCBhcyBhbiBVTkMgcGF0aCBpdCBuZWVkcyB0b1xyXG4gIC8vIGhhdmUgYXQgbGVhc3QgMiBjb21wb25lbnRzLCBzbyB3ZSBkb24ndCBmaWx0ZXIgZm9yIHRoYXQgaGVyZS5cclxuICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgY2FuIHVzZSBqb2luIHRvIGNvbnN0cnVjdCBVTkMgcGF0aHMgZnJvbVxyXG4gIC8vIGEgc2VydmVyIG5hbWUgYW5kIGEgc2hhcmUgbmFtZTsgZm9yIGV4YW1wbGU6XHJcbiAgLy8gICBwYXRoLmpvaW4oJy8vc2VydmVyJywgJ3NoYXJlJykgLT4gJ1xcXFxcXFxcc2VydmVyXFxcXHNoYXJlXFwnKVxyXG4gIGlmICghL15bXFxcXFxcL117Mn1bXlxcXFxcXC9dLy50ZXN0KHBhdGhzWzBdKSkge1xyXG4gICAgam9pbmVkID0gam9pbmVkLnJlcGxhY2UoL15bXFxcXFxcL117Mix9LywgJ1xcXFwnKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB3aW4zMi5ub3JtYWxpemUoam9pbmVkKTtcclxufTtcclxuXHJcblxyXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxyXG4vLyBpdCB3aWxsIHNvbHZlIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gJ2Zyb20nIHRvICd0bycsIGZvciBpbnN0YW5jZTpcclxuLy8gZnJvbSA9ICdDOlxcXFxvcmFuZGVhXFxcXHRlc3RcXFxcYWFhJ1xyXG4vLyB0byA9ICdDOlxcXFxvcmFuZGVhXFxcXGltcGxcXFxcYmJiJ1xyXG4vLyBUaGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmU6ICcuLlxcXFwuLlxcXFxpbXBsXFxcXGJiYidcclxud2luMzIucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xyXG4gIGZyb20gPSB3aW4zMi5yZXNvbHZlKGZyb20pO1xyXG4gIHRvID0gd2luMzIucmVzb2x2ZSh0byk7XHJcblxyXG4gIC8vIHdpbmRvd3MgaXMgbm90IGNhc2Ugc2Vuc2l0aXZlXHJcbiAgdmFyIGxvd2VyRnJvbSA9IGZyb20udG9Mb3dlckNhc2UoKTtcclxuICB2YXIgbG93ZXJUbyA9IHRvLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gIHZhciB0b1BhcnRzID0gdHJpbUFycmF5KHRvLnNwbGl0KCdcXFxcJykpO1xyXG5cclxuICB2YXIgbG93ZXJGcm9tUGFydHMgPSB0cmltQXJyYXkobG93ZXJGcm9tLnNwbGl0KCdcXFxcJykpO1xyXG4gIHZhciBsb3dlclRvUGFydHMgPSB0cmltQXJyYXkobG93ZXJUby5zcGxpdCgnXFxcXCcpKTtcclxuXHJcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGxvd2VyRnJvbVBhcnRzLmxlbmd0aCwgbG93ZXJUb1BhcnRzLmxlbmd0aCk7XHJcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAobG93ZXJGcm9tUGFydHNbaV0gIT09IGxvd2VyVG9QYXJ0c1tpXSkge1xyXG4gICAgICBzYW1lUGFydHNMZW5ndGggPSBpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChzYW1lUGFydHNMZW5ndGggPT0gMCkge1xyXG4gICAgcmV0dXJuIHRvO1xyXG4gIH1cclxuXHJcbiAgdmFyIG91dHB1dFBhcnRzID0gW107XHJcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGxvd2VyRnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xyXG4gIH1cclxuXHJcbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcclxuXHJcbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJ1xcXFwnKTtcclxufTtcclxuXHJcblxyXG53aW4zMi5fbWFrZUxvbmcgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgLy8gTm90ZTogdGhpcyB3aWxsICpwcm9iYWJseSogdGhyb3cgc29tZXdoZXJlLlxyXG4gIGlmICghdXRpbC5pc1N0cmluZyhwYXRoKSlcclxuICAgIHJldHVybiBwYXRoO1xyXG5cclxuICBpZiAoIXBhdGgpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHZhciByZXNvbHZlZFBhdGggPSB3aW4zMi5yZXNvbHZlKHBhdGgpO1xyXG5cclxuICBpZiAoL15bYS16QS1aXVxcOlxcXFwvLnRlc3QocmVzb2x2ZWRQYXRoKSkge1xyXG4gICAgLy8gcGF0aCBpcyBsb2NhbCBmaWxlc3lzdGVtIHBhdGgsIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZFxyXG4gICAgLy8gdG8gbG9uZyBVTkMgcGF0aC5cclxuICAgIHJldHVybiAnXFxcXFxcXFw/XFxcXCcgKyByZXNvbHZlZFBhdGg7XHJcbiAgfSBlbHNlIGlmICgvXlxcXFxcXFxcW14/Ll0vLnRlc3QocmVzb2x2ZWRQYXRoKSkge1xyXG4gICAgLy8gcGF0aCBpcyBuZXR3b3JrIFVOQyBwYXRoLCB3aGljaCBuZWVkcyB0byBiZSBjb252ZXJ0ZWRcclxuICAgIC8vIHRvIGxvbmcgVU5DIHBhdGguXHJcbiAgICByZXR1cm4gJ1xcXFxcXFxcP1xcXFxVTkNcXFxcJyArIHJlc29sdmVkUGF0aC5zdWJzdHJpbmcoMik7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0aDtcclxufTtcclxuXHJcblxyXG53aW4zMi5kaXJuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHZhciByZXN1bHQgPSB3aW4zMlNwbGl0UGF0aChwYXRoKSxcclxuICAgICAgcm9vdCA9IHJlc3VsdFswXSxcclxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xyXG5cclxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xyXG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXHJcbiAgICByZXR1cm4gJy4nO1xyXG4gIH1cclxuXHJcbiAgaWYgKGRpcikge1xyXG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcclxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJvb3QgKyBkaXI7XHJcbn07XHJcblxyXG5cclxud2luMzIuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcclxuICB2YXIgZiA9IHdpbjMyU3BsaXRQYXRoKHBhdGgpWzJdO1xyXG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cclxuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xyXG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XHJcbiAgfVxyXG4gIHJldHVybiBmO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgcmV0dXJuIHdpbjMyU3BsaXRQYXRoKHBhdGgpWzNdO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLmZvcm1hdCA9IGZ1bmN0aW9uKHBhdGhPYmplY3QpIHtcclxuICBpZiAoIXV0aWwuaXNPYmplY3QocGF0aE9iamVjdCkpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCJQYXJhbWV0ZXIgJ3BhdGhPYmplY3QnIG11c3QgYmUgYW4gb2JqZWN0LCBub3QgXCIgKyB0eXBlb2YgcGF0aE9iamVjdFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhciByb290ID0gcGF0aE9iamVjdC5yb290IHx8ICcnO1xyXG5cclxuICBpZiAoIXV0aWwuaXNTdHJpbmcocm9vdCkpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXHJcbiAgICAgICAgXCIncGF0aE9iamVjdC5yb290JyBtdXN0IGJlIGEgc3RyaW5nIG9yIHVuZGVmaW5lZCwgbm90IFwiICtcclxuICAgICAgICB0eXBlb2YgcGF0aE9iamVjdC5yb290XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFyIGRpciA9IHBhdGhPYmplY3QuZGlyO1xyXG4gIHZhciBiYXNlID0gcGF0aE9iamVjdC5iYXNlIHx8ICcnO1xyXG4gIGlmICghZGlyKSB7XHJcbiAgICByZXR1cm4gYmFzZTtcclxuICB9XHJcbiAgaWYgKGRpcltkaXIubGVuZ3RoIC0gMV0gPT09IHdpbjMyLnNlcCkge1xyXG4gICAgcmV0dXJuIGRpciArIGJhc2U7XHJcbiAgfVxyXG4gIHJldHVybiBkaXIgKyB3aW4zMi5zZXAgKyBiYXNlO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLnBhcnNlID0gZnVuY3Rpb24ocGF0aFN0cmluZykge1xyXG4gIGlmICghdXRpbC5pc1N0cmluZyhwYXRoU3RyaW5nKSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aFN0cmluZycgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHBhdGhTdHJpbmdcclxuICAgICk7XHJcbiAgfVxyXG4gIHZhciBhbGxQYXJ0cyA9IHdpbjMyU3BsaXRQYXRoKHBhdGhTdHJpbmcpO1xyXG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA0KSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBwYXRoICdcIiArIHBhdGhTdHJpbmcgKyBcIidcIik7XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICByb290OiBhbGxQYXJ0c1swXSxcclxuICAgIGRpcjogYWxsUGFydHNbMF0gKyBhbGxQYXJ0c1sxXS5zbGljZSgwLCAtMSksXHJcbiAgICBiYXNlOiBhbGxQYXJ0c1syXSxcclxuICAgIGV4dDogYWxsUGFydHNbM10sXHJcbiAgICBuYW1lOiBhbGxQYXJ0c1syXS5zbGljZSgwLCBhbGxQYXJ0c1syXS5sZW5ndGggLSBhbGxQYXJ0c1szXS5sZW5ndGgpXHJcbiAgfTtcclxufTtcclxuXHJcblxyXG53aW4zMi5zZXAgPSAnXFxcXCc7XHJcbndpbjMyLmRlbGltaXRlciA9ICc7JztcclxuXHJcblxyXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxyXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxyXG52YXIgc3BsaXRQYXRoUmUgPVxyXG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XHJcbnZhciBwb3NpeCA9IHt9O1xyXG5cclxuXHJcbmZ1bmN0aW9uIHBvc2l4U3BsaXRQYXRoKGZpbGVuYW1lKSB7XHJcbiAgcmV0dXJuIHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpO1xyXG59XHJcblxyXG5cclxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxyXG4vLyBwb3NpeCB2ZXJzaW9uXHJcbnBvc2l4LnJlc29sdmUgPSBmdW5jdGlvbigpIHtcclxuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXHJcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcclxuICAgIHZhciBwYXRoID0gKGkgPj0gMCkgPyBhcmd1bWVudHNbaV0gOiBwcm9jZXNzLmN3ZCgpO1xyXG5cclxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xyXG4gICAgaWYgKCF1dGlsLmlzU3RyaW5nKHBhdGgpKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9IGVsc2UgaWYgKCFwYXRoKSB7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XHJcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aFswXSA9PT0gJy8nO1xyXG4gIH1cclxuXHJcbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxyXG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxyXG5cclxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcclxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xyXG5cclxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XHJcbn07XHJcblxyXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxyXG4vLyBwb3NpeCB2ZXJzaW9uXHJcbnBvc2l4Lm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICB2YXIgaXNBYnNvbHV0ZSA9IHBvc2l4LmlzQWJzb2x1dGUocGF0aCksXHJcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSBwYXRoICYmIHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nO1xyXG5cclxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcclxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgnLycpLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xyXG5cclxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcclxuICAgIHBhdGggPSAnLic7XHJcbiAgfVxyXG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcclxuICAgIHBhdGggKz0gJy8nO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcclxufTtcclxuXHJcbi8vIHBvc2l4IHZlcnNpb25cclxucG9zaXguaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICByZXR1cm4gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcclxufTtcclxuXHJcbi8vIHBvc2l4IHZlcnNpb25cclxucG9zaXguam9pbiA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciBwYXRoID0gJyc7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgIHZhciBzZWdtZW50ID0gYXJndW1lbnRzW2ldO1xyXG4gICAgaWYgKCF1dGlsLmlzU3RyaW5nKHNlZ21lbnQpKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VnbWVudCkge1xyXG4gICAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgICBwYXRoICs9IHNlZ21lbnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGF0aCArPSAnLycgKyBzZWdtZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBwb3NpeC5ub3JtYWxpemUocGF0aCk7XHJcbn07XHJcblxyXG5cclxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcclxuLy8gcG9zaXggdmVyc2lvblxyXG5wb3NpeC5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XHJcbiAgZnJvbSA9IHBvc2l4LnJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xyXG4gIHRvID0gcG9zaXgucmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xyXG5cclxuICB2YXIgZnJvbVBhcnRzID0gdHJpbUFycmF5KGZyb20uc3BsaXQoJy8nKSk7XHJcbiAgdmFyIHRvUGFydHMgPSB0cmltQXJyYXkodG8uc3BsaXQoJy8nKSk7XHJcblxyXG4gIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XHJcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICBpZiAoZnJvbVBhcnRzW2ldICE9PSB0b1BhcnRzW2ldKSB7XHJcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFyIG91dHB1dFBhcnRzID0gW107XHJcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcclxuICB9XHJcblxyXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XHJcblxyXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XHJcbn07XHJcblxyXG5cclxucG9zaXguX21ha2VMb25nID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHJldHVybiBwYXRoO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgdmFyIHJlc3VsdCA9IHBvc2l4U3BsaXRQYXRoKHBhdGgpLFxyXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxyXG4gICAgICBkaXIgPSByZXN1bHRbMV07XHJcblxyXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XHJcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcclxuICAgIHJldHVybiAnLic7XHJcbiAgfVxyXG5cclxuICBpZiAoZGlyKSB7XHJcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxyXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcm9vdCArIGRpcjtcclxufTtcclxuXHJcblxyXG5wb3NpeC5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xyXG4gIHZhciBmID0gcG9zaXhTcGxpdFBhdGgocGF0aClbMl07XHJcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xyXG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XHJcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcclxuICB9XHJcbiAgcmV0dXJuIGY7XHJcbn07XHJcblxyXG5cclxucG9zaXguZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICByZXR1cm4gcG9zaXhTcGxpdFBhdGgocGF0aClbM107XHJcbn07XHJcblxyXG5cclxucG9zaXguZm9ybWF0ID0gZnVuY3Rpb24ocGF0aE9iamVjdCkge1xyXG4gIGlmICghdXRpbC5pc09iamVjdChwYXRoT2JqZWN0KSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aE9iamVjdCcgbXVzdCBiZSBhbiBvYmplY3QsIG5vdCBcIiArIHR5cGVvZiBwYXRoT2JqZWN0XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFyIHJvb3QgPSBwYXRoT2JqZWN0LnJvb3QgfHwgJyc7XHJcblxyXG4gIGlmICghdXRpbC5pc1N0cmluZyhyb290KSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIidwYXRoT2JqZWN0LnJvb3QnIG11c3QgYmUgYSBzdHJpbmcgb3IgdW5kZWZpbmVkLCBub3QgXCIgK1xyXG4gICAgICAgIHR5cGVvZiBwYXRoT2JqZWN0LnJvb3RcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB2YXIgZGlyID0gcGF0aE9iamVjdC5kaXIgPyBwYXRoT2JqZWN0LmRpciArIHBvc2l4LnNlcCA6ICcnO1xyXG4gIHZhciBiYXNlID0gcGF0aE9iamVjdC5iYXNlIHx8ICcnO1xyXG4gIHJldHVybiBkaXIgKyBiYXNlO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LnBhcnNlID0gZnVuY3Rpb24ocGF0aFN0cmluZykge1xyXG4gIGlmICghdXRpbC5pc1N0cmluZyhwYXRoU3RyaW5nKSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aFN0cmluZycgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHBhdGhTdHJpbmdcclxuICAgICk7XHJcbiAgfVxyXG4gIHZhciBhbGxQYXJ0cyA9IHBvc2l4U3BsaXRQYXRoKHBhdGhTdHJpbmcpO1xyXG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA0KSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBwYXRoICdcIiArIHBhdGhTdHJpbmcgKyBcIidcIik7XHJcbiAgfVxyXG4gIGFsbFBhcnRzWzFdID0gYWxsUGFydHNbMV0gfHwgJyc7XHJcbiAgYWxsUGFydHNbMl0gPSBhbGxQYXJ0c1syXSB8fCAnJztcclxuICBhbGxQYXJ0c1szXSA9IGFsbFBhcnRzWzNdIHx8ICcnO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcm9vdDogYWxsUGFydHNbMF0sXHJcbiAgICBkaXI6IGFsbFBhcnRzWzBdICsgYWxsUGFydHNbMV0uc2xpY2UoMCwgLTEpLFxyXG4gICAgYmFzZTogYWxsUGFydHNbMl0sXHJcbiAgICBleHQ6IGFsbFBhcnRzWzNdLFxyXG4gICAgbmFtZTogYWxsUGFydHNbMl0uc2xpY2UoMCwgYWxsUGFydHNbMl0ubGVuZ3RoIC0gYWxsUGFydHNbM10ubGVuZ3RoKVxyXG4gIH07XHJcbn07XHJcblxyXG5cclxucG9zaXguc2VwID0gJy8nO1xyXG5wb3NpeC5kZWxpbWl0ZXIgPSAnOic7XHJcblxyXG5cclxuaWYgKGlzV2luZG93cylcclxuICBtb2R1bGUuZXhwb3J0cyA9IHdpbjMyO1xyXG5lbHNlIC8qIHBvc2l4ICovXHJcbiAgbW9kdWxlLmV4cG9ydHMgPSBwb3NpeDtcclxuXHJcbm1vZHVsZS5leHBvcnRzLnBvc2l4ID0gcG9zaXg7XHJcbm1vZHVsZS5leHBvcnRzLndpbjMyID0gd2luMzI7XHJcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCIvKipcbiAqIFNvdXJjZTogZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9VQ0QvbGF0ZXN0L3VjZC9TcGVjaWFsQ2FzaW5nLnR4dFxuICovXG52YXIgU1VQUE9SVEVEX0xPQ0FMRSA9IHtcbiAgICB0cjoge1xuICAgICAgICByZWdleHA6IC9cXHUwMTMwfFxcdTAwNDl8XFx1MDA0OVxcdTAzMDcvZyxcbiAgICAgICAgbWFwOiB7XG4gICAgICAgICAgICDEsDogXCJcXHUwMDY5XCIsXG4gICAgICAgICAgICBJOiBcIlxcdTAxMzFcIixcbiAgICAgICAgICAgIEnMhzogXCJcXHUwMDY5XCIsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBhejoge1xuICAgICAgICByZWdleHA6IC9cXHUwMTMwL2csXG4gICAgICAgIG1hcDoge1xuICAgICAgICAgICAgxLA6IFwiXFx1MDA2OVwiLFxuICAgICAgICAgICAgSTogXCJcXHUwMTMxXCIsXG4gICAgICAgICAgICBJzIc6IFwiXFx1MDA2OVwiLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbHQ6IHtcbiAgICAgICAgcmVnZXhwOiAvXFx1MDA0OXxcXHUwMDRBfFxcdTAxMkV8XFx1MDBDQ3xcXHUwMENEfFxcdTAxMjgvZyxcbiAgICAgICAgbWFwOiB7XG4gICAgICAgICAgICBJOiBcIlxcdTAwNjlcXHUwMzA3XCIsXG4gICAgICAgICAgICBKOiBcIlxcdTAwNkFcXHUwMzA3XCIsXG4gICAgICAgICAgICDErjogXCJcXHUwMTJGXFx1MDMwN1wiLFxuICAgICAgICAgICAgw4w6IFwiXFx1MDA2OVxcdTAzMDdcXHUwMzAwXCIsXG4gICAgICAgICAgICDDjTogXCJcXHUwMDY5XFx1MDMwN1xcdTAzMDFcIixcbiAgICAgICAgICAgIMSoOiBcIlxcdTAwNjlcXHUwMzA3XFx1MDMwM1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuLyoqXG4gKiBMb2NhbGl6ZWQgbG93ZXIgY2FzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsZUxvd2VyQ2FzZShzdHIsIGxvY2FsZSkge1xuICAgIHZhciBsYW5nID0gU1VQUE9SVEVEX0xPQ0FMRVtsb2NhbGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKGxhbmcpXG4gICAgICAgIHJldHVybiBsb3dlckNhc2Uoc3RyLnJlcGxhY2UobGFuZy5yZWdleHAsIGZ1bmN0aW9uIChtKSB7IHJldHVybiBsYW5nLm1hcFttXTsgfSkpO1xuICAgIHJldHVybiBsb3dlckNhc2Uoc3RyKTtcbn1cbi8qKlxuICogTG93ZXIgY2FzZSBhcyBhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG93ZXJDYXNlKHN0cikge1xuICAgIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGxvd2VyQ2FzZSB9IGZyb20gXCJsb3dlci1jYXNlXCI7XG4vLyBTdXBwb3J0IGNhbWVsIGNhc2UgKFwiY2FtZWxDYXNlXCIgLT4gXCJjYW1lbCBDYXNlXCIgYW5kIFwiQ0FNRUxDYXNlXCIgLT4gXCJDQU1FTCBDYXNlXCIpLlxudmFyIERFRkFVTFRfU1BMSVRfUkVHRVhQID0gWy8oW2EtejAtOV0pKFtBLVpdKS9nLCAvKFtBLVpdKShbQS1aXVthLXpdKS9nXTtcbi8vIFJlbW92ZSBhbGwgbm9uLXdvcmQgY2hhcmFjdGVycy5cbnZhciBERUZBVUxUX1NUUklQX1JFR0VYUCA9IC9bXkEtWjAtOV0rL2dpO1xuLyoqXG4gKiBOb3JtYWxpemUgdGhlIHN0cmluZyBpbnRvIHNvbWV0aGluZyBvdGhlciBsaWJyYXJpZXMgY2FuIG1hbmlwdWxhdGUgZWFzaWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9DYXNlKGlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgX2EgPSBvcHRpb25zLnNwbGl0UmVnZXhwLCBzcGxpdFJlZ2V4cCA9IF9hID09PSB2b2lkIDAgPyBERUZBVUxUX1NQTElUX1JFR0VYUCA6IF9hLCBfYiA9IG9wdGlvbnMuc3RyaXBSZWdleHAsIHN0cmlwUmVnZXhwID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RSSVBfUkVHRVhQIDogX2IsIF9jID0gb3B0aW9ucy50cmFuc2Zvcm0sIHRyYW5zZm9ybSA9IF9jID09PSB2b2lkIDAgPyBsb3dlckNhc2UgOiBfYywgX2QgPSBvcHRpb25zLmRlbGltaXRlciwgZGVsaW1pdGVyID0gX2QgPT09IHZvaWQgMCA/IFwiIFwiIDogX2Q7XG4gICAgdmFyIHJlc3VsdCA9IHJlcGxhY2UocmVwbGFjZShpbnB1dCwgc3BsaXRSZWdleHAsIFwiJDFcXDAkMlwiKSwgc3RyaXBSZWdleHAsIFwiXFwwXCIpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgdmFyIGVuZCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgLy8gVHJpbSB0aGUgZGVsaW1pdGVyIGZyb20gYXJvdW5kIHRoZSBvdXRwdXQgc3RyaW5nLlxuICAgIHdoaWxlIChyZXN1bHQuY2hhckF0KHN0YXJ0KSA9PT0gXCJcXDBcIilcbiAgICAgICAgc3RhcnQrKztcbiAgICB3aGlsZSAocmVzdWx0LmNoYXJBdChlbmQgLSAxKSA9PT0gXCJcXDBcIilcbiAgICAgICAgZW5kLS07XG4gICAgLy8gVHJhbnNmb3JtIGVhY2ggdG9rZW4gaW5kZXBlbmRlbnRseS5cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKHN0YXJ0LCBlbmQpLnNwbGl0KFwiXFwwXCIpLm1hcCh0cmFuc2Zvcm0pLmpvaW4oZGVsaW1pdGVyKTtcbn1cbi8qKlxuICogUmVwbGFjZSBgcmVgIGluIHRoZSBpbnB1dCBzdHJpbmcgd2l0aCB0aGUgcmVwbGFjZW1lbnQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2UoaW5wdXQsIHJlLCB2YWx1ZSkge1xuICAgIGlmIChyZSBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocmUsIHZhbHVlKTtcbiAgICByZXR1cm4gcmUucmVkdWNlKGZ1bmN0aW9uIChpbnB1dCwgcmUpIHsgcmV0dXJuIGlucHV0LnJlcGxhY2UocmUsIHZhbHVlKTsgfSwgaW5wdXQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGRvdENhc2UgfSBmcm9tIFwiZG90LWNhc2VcIjtcbmV4cG9ydCBmdW5jdGlvbiBzbmFrZUNhc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHJldHVybiBkb3RDYXNlKGlucHV0LCBfX2Fzc2lnbih7IGRlbGltaXRlcjogXCJfXCIgfSwgb3B0aW9ucykpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IG5vQ2FzZSB9IGZyb20gXCJuby1jYXNlXCI7XG5leHBvcnQgZnVuY3Rpb24gZG90Q2FzZShpbnB1dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcmV0dXJuIG5vQ2FzZShpbnB1dCwgX19hc3NpZ24oeyBkZWxpbWl0ZXI6IFwiLlwiIH0sIG9wdGlvbnMpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IHNuYWtlQ2FzZSB9IGZyb20gJ3NuYWtlLWNhc2UnO1xuaW1wb3J0ICogYXMgbm9kZVBhdGggZnJvbSAncGF0aCc7XG5leHBvcnQgY29uc3QgcGF0aCA9IG5hdmlnYXRvci5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpID09PSAnd2luMzInID8gbm9kZVBhdGgud2luMzIgOiBub2RlUGF0aC5wb3NpeDtcbmV4cG9ydCBjb25zdCBJU19ERVYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JztcbmV4cG9ydCBjb25zdCBQUk9UT0NPTF9GSUxFID0gJ2ZpbGU6Ly8nO1xuZXhwb3J0IGNvbnN0IFBST1RPQ09MX0xTUCA9ICdsc3A6Ly8nO1xuZXhwb3J0IGNvbnN0IFVSTF9MU1AgPSBQUk9UT0NPTF9MU1AgKyAnbG9nc2VxLmlvLyc7XG5sZXQgX2FwcFBhdGhSb290O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFwcFBhdGhSb290KCkge1xuICAgIGlmIChfYXBwUGF0aFJvb3QpIHtcbiAgICAgICAgcmV0dXJuIF9hcHBQYXRoUm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIChfYXBwUGF0aFJvb3QgPVxuICAgICAgICBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ19jYWxsQXBwbGljYXRpb24nLCAnZ2V0QXBwUGF0aCcpKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTREtQYXRoUm9vdCgpIHtcbiAgICBpZiAoSVNfREVWKSB7XG4gICAgICAgIC8vIFRPRE86IGNhY2hlIGluIHByZWZlcmVuY2UgZmlsZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xTUF9ERVZfU0RLX1JPT1QnKSB8fCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwJztcbiAgICB9XG4gICAgY29uc3QgYXBwUGF0aFJvb3QgPSBhd2FpdCBnZXRBcHBQYXRoUm9vdCgpO1xuICAgIHJldHVybiBzYWZldHlQYXRoSm9pbihhcHBQYXRoUm9vdCwgJ2pzJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoaXRlbSkge1xuICAgIHJldHVybiAoaXRlbSA9PT0gT2JqZWN0KGl0ZW0pICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgLy8gcmV0dXJuIHRoZSB0YXJnZXQgaWYgbm8gc291cmNlcyBwYXNzZWRcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHRhcmdldDtcbiAgICBpZiAoaXNPYmplY3QocmVzdWx0KSkge1xuICAgICAgICBjb25zdCBsZW4gPSBzb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgZWxtID0gc291cmNlc1tpXTtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChlbG0pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZWxtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbG0uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGVsbVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W2tleV0gfHwgIWlzT2JqZWN0KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwTWVyZ2UocmVzdWx0W2tleV0sIGVsbVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtrZXldKSAmJiBBcnJheS5pc0FycmF5KGVsbVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZSB0aGUgdHdvIGFycmF5cyBhbmQgcmVtb3ZlIGFueSBkdXBsaWNhdGUgcHJpbWl0aXZlIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IEFycmF5LmZyb20obmV3IFNldChyZXN1bHRba2V5XS5jb25jYXQoZWxtW2tleV0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGVsbVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbklEKCkge1xuICAgIC8vIE1hdGgucmFuZG9tIHNob3VsZCBiZSB1bmlxdWUgYmVjYXVzZSBvZiBpdHMgc2VlZGluZyBhbGdvcml0aG0uXG4gICAgLy8gQ29udmVydCBpdCB0byBiYXNlIDM2IChudW1iZXJzICsgbGV0dGVycyksIGFuZCBncmFiIHRoZSBmaXJzdCA5IGNoYXJhY3RlcnNcbiAgICAvLyBhZnRlciB0aGUgZGVjaW1hbC5cbiAgICByZXR1cm4gJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVjRmlyc3Qoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRmlsZVByb3RvY29sKHBhdGgpIHtcbiAgICBpZiAoIXBhdGgpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCByZWcgPSAvXihodHRwfGZpbGV8bHNwKS87XG4gICAgaWYgKCFyZWcudGVzdChwYXRoKSkge1xuICAgICAgICBwYXRoID0gUFJPVE9DT0xfRklMRSArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhZmV0eVBhdGhKb2luKGJhc2VQYXRoLCAuLi5wYXJ0cykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVBhdGgpO1xuICAgICAgICBpZiAoIXVybC5vcmlnaW4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobnVsbCk7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGJhc2VQYXRoLnN1YnN0cih1cmwub3JpZ2luLmxlbmd0aCksIC4uLnBhcnRzKTtcbiAgICAgICAgcmV0dXJuIHVybC5vcmlnaW4gKyBmdWxsUGF0aDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihiYXNlUGF0aCwgLi4ucGFydHMpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzYWZldHlQYXRoTm9ybWFsaXplKGJhc2VQYXRoKSB7XG4gICAgaWYgKCFiYXNlUGF0aD8ubWF0Y2goL14oaHR0cD98bHNwfGFzc2V0cyk6LykpIHtcbiAgICAgICAgYmFzZVBhdGggPSBwYXRoLm5vcm1hbGl6ZShiYXNlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlUGF0aDtcbn1cbi8qKlxuICogQHBhcmFtIHRpbWVvdXQgbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gdGFnIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmZXJyZWQodGltZW91dCwgdGFnKSB7XG4gICAgbGV0IHJlc29sdmUsIHJlamVjdDtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVGbiA9IChyKSA9PiB7XG4gICAgICAgIHJldHVybiAodikgPT4ge1xuICAgICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICByKHYpO1xuICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUxLCByZWplY3QxKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSB0aW1lRm4ocmVzb2x2ZTEpO1xuICAgICAgICByZWplY3QgPSB0aW1lRm4ocmVqZWN0MSk7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBbZGVmZXJyZWQgdGltZW91dF0gJHt0YWd9YCkpLCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICAgIHNldFRhZzogKHQpID0+IHRhZyA9IHQsXG4gICAgICAgIHJlc29sdmUsIHJlamVjdCwgcHJvbWlzZSxcbiAgICAgICAgZ2V0IHNldHRsZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlZDtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW52b2tlSG9zdEV4cG9ydGVkQXBpKG1ldGhvZCwgLi4uYXJncykge1xuICAgIG1ldGhvZCA9IG1ldGhvZD8ucmVwbGFjZSgvXltfJF0rLywgJycpO1xuICAgIGNvbnN0IG1ldGhvZDEgPSBzbmFrZUNhc2UobWV0aG9kKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbG9nc2VxSG9zdEV4cG9ydGVkQXBpID0gd2luZG93LmxvZ3NlcT8uYXBpIHx8IHt9O1xuICAgIGNvbnN0IGZuID0gbG9nc2VxSG9zdEV4cG9ydGVkQXBpW21ldGhvZDFdIHx8IHdpbmRvdy5hcGlzW21ldGhvZDFdIHx8XG4gICAgICAgIGxvZ3NlcUhvc3RFeHBvcnRlZEFwaVttZXRob2RdIHx8IHdpbmRvdy5hcGlzW21ldGhvZF07XG4gICAgaWYgKCFmbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBleGlzdGVkIG1ldGhvZCAjJHttZXRob2R9YCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgPyBmbiA6IGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSWZyYW1lU2FuZGJveChwcm9wcywgdGFyZ2V0KSB7XG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC5hZGQoJ2xzcC1pZnJhbWUtc2FuZGJveCcpO1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICB9KTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW5qZWN0ZWRTdHlsZShzdHlsZSwgYXR0cnMpIHtcbiAgICBjb25zdCBrZXkgPSBhdHRyc1snZGF0YS1pbmplY3RlZC1zdHlsZSddO1xuICAgIGxldCBlbCA9IGtleSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pbmplY3RlZC1zdHlsZT0ke2tleX1dYCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgYXR0cnMgJiYgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZWwpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbmplY3RlZFVJKHVpLCBhdHRycykge1xuICAgIGNvbnN0IHBsID0gdGhpcztcbiAgICBsZXQgc2xvdCA9ICcnO1xuICAgIGxldCBzZWxlY3RvciA9ICcnO1xuICAgIGlmICgnc2xvdCcgaW4gdWkpIHtcbiAgICAgICAgc2xvdCA9IHVpLnNsb3Q7XG4gICAgICAgIHNlbGVjdG9yID0gYCMke3Nsb3R9YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNlbGVjdG9yID0gdWkucGF0aDtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0b3IgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLmRlYnVnVGFnfSBjYW4gbm90IHJlc29sdmUgc2VsZWN0b3IgdGFyZ2V0ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgJHt1aS5rZXl9LSR7c2xvdH0tJHtwbC5pZH1gO1xuICAgIGNvbnN0IGtleSA9IGAke3VpLmtleX0tJHtwbC5pZH1gO1xuICAgIGxldCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2lkfWApO1xuICAgIGlmIChlbCkge1xuICAgICAgICBlbC5pbm5lckhUTUwgPSB1aS50ZW1wbGF0ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLmlkID0gaWQ7XG4gICAgZWwuZGF0YXNldC5pbmplY3RlZFVpID0ga2V5IHx8ICcnO1xuICAgIC8vIFRPRE86IFN1cHBvcnQgbW9yZVxuICAgIGVsLmlubmVySFRNTCA9IHVpLnRlbXBsYXRlO1xuICAgIGF0dHJzICYmIE9iamVjdC5lbnRyaWVzKGF0dHJzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKGssIHYpO1xuICAgIH0pO1xuICAgIHRhcmdldC5hcHBlbmRDaGlsZChlbCk7XG4gICAgLy8gVE9ETzogSG93IGhhbmRsZSBldmVudHNcbiAgICBbJ2NsaWNrJywgJ2ZvY3VzJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnYmx1cicsICdkYmxjbGljaycsXG4gICAgICAgICdrZXl1cCcsICdrZXlwcmVzcycsICdrZXlkb3duJywgJ2NoYW5nZScsICdpbnB1dCddLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGFyZ2V0LmNsb3Nlc3QoYFtkYXRhLW9uLSR7dHlwZX1dYCk7XG4gICAgICAgICAgICBpZiAoIXRyaWdnZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbXNnVHlwZSA9IHRyaWdnZXIuZGF0YXNldFtgb24ke3VjRmlyc3QodHlwZSl9YF07XG4gICAgICAgICAgICBtc2dUeXBlICYmIHBsLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChtc2dUeXBlLCB0cmFuc2Zvcm1hYmxlRXZlbnQodHJpZ2dlciwgZSkpO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGVsKTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybWFibGVFdmVudCh0YXJnZXQsIGUpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IGRzID0gdGFyZ2V0LmRhdGFzZXQ7XG4gICAgICAgIGNvbnN0IEZMQUdfUkVDVCA9ICdyZWN0JztcbiAgICAgICAgWyd2YWx1ZScsICdpZCcsICdjbGFzc05hbWUnLFxuICAgICAgICAgICAgJ2RhdGFzZXQnLCBGTEFHX1JFQ1RcbiAgICAgICAgXS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICBsZXQgdjtcbiAgICAgICAgICAgIHN3aXRjaCAoaykge1xuICAgICAgICAgICAgICAgIGNhc2UgRkxBR19SRUNUOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRzLmhhc093blByb3BlcnR5KEZMQUdfUkVDVCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHYgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9KU09OKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHYgPSB0YXJnZXRba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdiA9IHsgLi4udiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqW2tdID0gdjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5sZXQgaW5qZWN0ZWRUaGVtZUVmZmVjdCA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbmplY3RlZFRoZW1lKHVybCkge1xuICAgIGluamVjdGVkVGhlbWVFZmZlY3Q/LmNhbGwoKTtcbiAgICBpZiAoIXVybClcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgbGluay5ocmVmID0gdXJsO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgcmV0dXJuIChpbmplY3RlZFRoZW1lRWZmZWN0ID0gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICBpbmplY3RlZFRoZW1lRWZmZWN0ID0gbnVsbDtcbiAgICB9KTtcbn1cbiIsIi8vIEZvcmsgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZG9sbGFyc2hhdmVjbHViL3Bvc3RtYXRlXG4vKipcbiAqIFRoZSB0eXBlIG9mIG1lc3NhZ2VzIG91ciBmcmFtZXMgb3VyIHNlbmRpbmdcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlVHlwZSA9ICdhcHBsaWNhdGlvbi94LXBvc3RtYXRlLXYxK2pzb24nO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gc2VuZCBhIGhhbmRzaGFrZSByZXF1ZXN0IHRvIHRoZSBwYXJlbnRcbiAqIEB0eXBlIHtOdW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBtYXhIYW5kc2hha2VSZXF1ZXN0cyA9IDU7XG4vKipcbiAqIEEgdW5pcXVlIG1lc3NhZ2UgSUQgdGhhdCBpcyB1c2VkIHRvIGVuc3VyZSByZXNwb25zZXMgYXJlIHNlbnQgdG8gdGhlIGNvcnJlY3QgcmVxdWVzdHNcbiAqIEB0eXBlIHtOdW1iZXJ9XG4gKi9cbmxldCBfbWVzc2FnZUlkID0gMDtcbi8qKlxuICogSW5jcmVtZW50cyBhbmQgcmV0dXJucyBhIG1lc3NhZ2UgSURcbiAqIEByZXR1cm4ge051bWJlcn0gQSB1bmlxdWUgSUQgZm9yIGEgbWVzc2FnZVxuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVOZXdNZXNzYWdlSWQgPSAoKSA9PiArK19tZXNzYWdlSWQ7XG4vKipcbiAqIFBvc3RtYXRlIGxvZ2dpbmcgZnVuY3Rpb24gdGhhdCBlbmFibGVzL2Rpc2FibGVzIHZpYSBjb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiBQb3N0bWF0ZS5kZWJ1ZyA/IGNvbnNvbGUubG9nKC4uLmFyZ3MpIDogbnVsbDtcbi8qKlxuICogVGFrZXMgYSBVUkwgYW5kIHJldHVybnMgdGhlIG9yaWdpblxuICogQHBhcmFtICB7U3RyaW5nfSB1cmwgVGhlIGZ1bGwgVVJMIGJlaW5nIHJlcXVlc3RlZFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgVGhlIFVSTHMgb3JpZ2luXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlT3JpZ2luID0gKHVybCkgPT4ge1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGNvbnN0IHByb3RvY29sID0gYS5wcm90b2NvbC5sZW5ndGggPiA0ID8gYS5wcm90b2NvbCA6IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbDtcbiAgICBjb25zdCBob3N0ID0gYS5ob3N0Lmxlbmd0aCA/ICgoYS5wb3J0ID09PSAnODAnIHx8IGEucG9ydCA9PT0gJzQ0MycpID8gYS5ob3N0bmFtZSA6IGEuaG9zdCkgOiB3aW5kb3cubG9jYXRpb24uaG9zdDtcbiAgICByZXR1cm4gYS5vcmlnaW4gfHwgYCR7cHJvdG9jb2x9Ly8ke2hvc3R9YDtcbn07XG5jb25zdCBtZXNzYWdlVHlwZXMgPSB7XG4gICAgaGFuZHNoYWtlOiAxLFxuICAgICdoYW5kc2hha2UtcmVwbHknOiAxLFxuICAgIGNhbGw6IDEsXG4gICAgZW1pdDogMSxcbiAgICByZXBseTogMSxcbiAgICByZXF1ZXN0OiAxLFxufTtcbi8qKlxuICogRW5zdXJlcyB0aGF0IGEgbWVzc2FnZSBpcyBzYWZlIHRvIGludGVycHJldFxuICogQHBhcmFtICB7T2JqZWN0fSBtZXNzYWdlIFRoZSBwb3N0bWF0ZSBtZXNzYWdlIGJlaW5nIHNlbnRcbiAqIEBwYXJhbSAge1N0cmluZ3xCb29sZWFufSBhbGxvd2VkT3JpZ2luIFRoZSB3aGl0ZWxpc3RlZCBvcmlnaW4gb3IgZmFsc2UgdG8gc2tpcCBvcmlnaW4gY2hlY2tcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBjb25zdCBzYW5pdGl6ZSA9IChtZXNzYWdlLCBhbGxvd2VkT3JpZ2luKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBhbGxvd2VkT3JpZ2luID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBtZXNzYWdlLm9yaWdpbiAhPT0gYWxsb3dlZE9yaWdpbilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghbWVzc2FnZS5kYXRhKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlLmRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAgICEoJ3Bvc3RtYXRlJyBpbiBtZXNzYWdlLmRhdGEpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1lc3NhZ2UuZGF0YS50eXBlICE9PSBtZXNzYWdlVHlwZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghbWVzc2FnZVR5cGVzW21lc3NhZ2UuZGF0YS5wb3N0bWF0ZV0pXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbiAqIFRha2VzIGEgbW9kZWwsIGFuZCBzZWFyY2hlcyBmb3IgYSB2YWx1ZSBieSB0aGUgcHJvcGVydHlcbiAqIEBwYXJhbSAge09iamVjdH0gbW9kZWwgICAgIFRoZSBkaWN0aW9uYXJ5IHRvIHNlYXJjaCBhZ2FpbnN0XG4gKiBAcGFyYW0gIHtTdHJpbmd9IHByb3BlcnR5ICBBIHBhdGggd2l0aGluIGEgZGljdGlvbmFyeSAoaS5lLiAnd2luZG93LmxvY2F0aW9uLmhyZWYnKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGZ1bmN0aW9ucyBpbiB0aGUgY2hpbGQgbW9kZWxcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlVmFsdWUgPSAobW9kZWwsIHByb3BlcnR5KSA9PiB7XG4gICAgY29uc3QgdW53cmFwcGVkQ29udGV4dCA9IHR5cGVvZiBtb2RlbFtwcm9wZXJ0eV0gPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBtb2RlbFtwcm9wZXJ0eV0oKSA6IG1vZGVsW3Byb3BlcnR5XTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVud3JhcHBlZENvbnRleHQpO1xufTtcbi8qKlxuICogQ29tcG9zZXMgYW4gQVBJIHRvIGJlIHVzZWQgYnkgdGhlIHBhcmVudFxuICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mb3JtYXRpb24gb24gdGhlIGNvbnN1bWVyXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJlbnRBUEkge1xuICAgIHBhcmVudDtcbiAgICBmcmFtZTtcbiAgICBjaGlsZDtcbiAgICBldmVudHMgPSB7fTtcbiAgICBjaGlsZE9yaWdpbjtcbiAgICBsaXN0ZW5lcjtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gaW5mby5wYXJlbnQ7XG4gICAgICAgIHRoaXMuZnJhbWUgPSBpbmZvLmZyYW1lO1xuICAgICAgICB0aGlzLmNoaWxkID0gaW5mby5jaGlsZDtcbiAgICAgICAgdGhpcy5jaGlsZE9yaWdpbiA9IGluZm8uY2hpbGRPcmlnaW47XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coJ1BhcmVudDogUmVnaXN0ZXJpbmcgQVBJJyk7XG4gICAgICAgICAgICBsb2coJ1BhcmVudDogQXdhaXRpbmcgbWVzc2FnZXMuLi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RlbmVyID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmICghc2FuaXRpemUoZSwgdGhpcy5jaGlsZE9yaWdpbikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB0aGUgYXNzaWdubWVudHMgYmVsb3cgZW5zdXJlcyB0aGF0IGUsIGRhdGEsIGFuZCB2YWx1ZSBhcmUgYWxsIGRlZmluZWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBuYW1lIH0gPSAoKChlIHx8IHt9KS5kYXRhIHx8IHt9KS52YWx1ZSB8fCB7fSk7XG4gICAgICAgICAgICBpZiAoZS5kYXRhLnBvc3RtYXRlID09PSAnZW1pdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBsb2coYFBhcmVudDogUmVjZWl2ZWQgZXZlbnQgZW1pc3Npb246ICR7bmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgaW4gdGhpcy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudHNbbmFtZV0uZm9yRWFjaChjYWxsYmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coJ1BhcmVudDogQXdhaXRpbmcgZXZlbnQgZW1pc3Npb25zIGZyb20gQ2hpbGQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQocHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAvLyBFeHRyYWN0IGRhdGEgZnJvbSByZXNwb25zZSBhbmQga2lsbCBsaXN0ZW5lcnNcbiAgICAgICAgICAgIGNvbnN0IHVpZCA9IGdlbmVyYXRlTmV3TWVzc2FnZUlkKCk7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2FjdCA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YS51aWQgPT09IHVpZCAmJiBlLmRhdGEucG9zdG1hdGUgPT09ICdyZXBseScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRyYW5zYWN0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZS5kYXRhLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gUHJlcGFyZSBmb3IgcmVzcG9uc2UgZnJvbSBDaGlsZC4uLlxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRyYW5zYWN0LCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBUaGVuIGFzayBjaGlsZCBmb3IgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIHRoaXMuY2hpbGQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHBvc3RtYXRlOiAncmVxdWVzdCcsXG4gICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgdWlkLFxuICAgICAgICAgICAgfSwgdGhpcy5jaGlsZE9yaWdpbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYWxsKHByb3BlcnR5LCBkYXRhKSB7XG4gICAgICAgIC8vIFNlbmQgaW5mb3JtYXRpb24gdG8gdGhlIGNoaWxkXG4gICAgICAgIHRoaXMuY2hpbGQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgcG9zdG1hdGU6ICdjYWxsJyxcbiAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9LCB0aGlzLmNoaWxkT3JpZ2luKTtcbiAgICB9XG4gICAgb24oZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50c1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IERlc3Ryb3lpbmcgUG9zdG1hdGUgaW5zdGFuY2UnKTtcbiAgICAgICAgfVxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMubGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZnJhbWUpO1xuICAgIH1cbn1cbi8qKlxuICogQ29tcG9zZXMgYW4gQVBJIHRvIGJlIHVzZWQgYnkgdGhlIGNoaWxkXG4gKiBAcGFyYW0ge09iamVjdH0gaW5mbyBJbmZvcm1hdGlvbiBvbiB0aGUgY29uc3VtZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENoaWxkQVBJIHtcbiAgICBtb2RlbDtcbiAgICBwYXJlbnQ7XG4gICAgcGFyZW50T3JpZ2luO1xuICAgIGNoaWxkO1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IGluZm8ubW9kZWw7XG4gICAgICAgIHRoaXMucGFyZW50ID0gaW5mby5wYXJlbnQ7XG4gICAgICAgIHRoaXMucGFyZW50T3JpZ2luID0gaW5mby5wYXJlbnRPcmlnaW47XG4gICAgICAgIHRoaXMuY2hpbGQgPSBpbmZvLmNoaWxkO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdDaGlsZDogUmVnaXN0ZXJpbmcgQVBJJyk7XG4gICAgICAgICAgICBsb2coJ0NoaWxkOiBBd2FpdGluZyBtZXNzYWdlcy4uLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNhbml0aXplKGUsIHRoaXMucGFyZW50T3JpZ2luKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFJlY2VpdmVkIHJlcXVlc3QnLCBlLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBwcm9wZXJ0eSwgdWlkLCBkYXRhIH0gPSBlLmRhdGE7XG4gICAgICAgICAgICBpZiAoZS5kYXRhLnBvc3RtYXRlID09PSAnY2FsbCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgaW4gdGhpcy5tb2RlbCAmJiB0eXBlb2YgdGhpcy5tb2RlbFtwcm9wZXJ0eV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtwcm9wZXJ0eV0oZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlcGx5IHRvIFBhcmVudFxuICAgICAgICAgICAgcmVzb2x2ZVZhbHVlKHRoaXMubW9kZWwsIHByb3BlcnR5KVxuICAgICAgICAgICAgICAgIC50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZS5zb3VyY2UucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdyZXBseScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICAgICAgICAgICAgICB1aWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIH0sIGUub3JpZ2luKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW1pdChuYW1lLCBkYXRhKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coYENoaWxkOiBFbWl0dGluZyBFdmVudCBcIiR7bmFtZX1cImAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHBvc3RtYXRlOiAnZW1pdCcsXG4gICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSwgdGhpcy5wYXJlbnRPcmlnaW4pO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGVudHJ5IHBvaW50IG9mIHRoZSBQYXJlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0bWF0ZSB7XG4gICAgc3RhdGljIGRlYnVnID0gZmFsc2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICBjb250YWluZXI7XG4gICAgcGFyZW50O1xuICAgIGZyYW1lO1xuICAgIGNoaWxkO1xuICAgIGNoaWxkT3JpZ2luO1xuICAgIHVybDtcbiAgICBtb2RlbDtcbiAgICBzdGF0aWMgTW9kZWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gb3B0cy5jb250YWluZXI7XG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmw7XG4gICAgICAgIHRoaXMucGFyZW50ID0gd2luZG93O1xuICAgICAgICB0aGlzLmZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgIGlmIChvcHRzLmlkKVxuICAgICAgICAgICAgdGhpcy5mcmFtZS5pZCA9IG9wdHMuaWQ7XG4gICAgICAgIGlmIChvcHRzLm5hbWUpXG4gICAgICAgICAgICB0aGlzLmZyYW1lLm5hbWUgPSBvcHRzLm5hbWU7XG4gICAgICAgIHRoaXMuZnJhbWUuY2xhc3NMaXN0LmFkZC5hcHBseSh0aGlzLmZyYW1lLmNsYXNzTGlzdCwgb3B0cy5jbGFzc0xpc3RBcnJheSB8fCBbXSk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpO1xuICAgICAgICB0aGlzLmNoaWxkID0gdGhpcy5mcmFtZS5jb250ZW50V2luZG93O1xuICAgICAgICB0aGlzLm1vZGVsID0gb3B0cy5tb2RlbCB8fCB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmVnaW5zIHRoZSBoYW5kc2hha2Ugc3RyYXRlZ3lcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIHNlbmQgYSBoYW5kc2hha2UgcmVxdWVzdCB0b1xuICAgICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlXG4gICAgICovXG4gICAgc2VuZEhhbmRzaGFrZSh1cmwpIHtcbiAgICAgICAgdXJsID0gdXJsIHx8IHRoaXMudXJsO1xuICAgICAgICBjb25zdCBjaGlsZE9yaWdpbiA9IHJlc29sdmVPcmlnaW4odXJsKTtcbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICBsZXQgcmVzcG9uc2VJbnRlcnZhbDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcGx5ID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNhbml0aXplKGUsIGNoaWxkT3JpZ2luKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdoYW5kc2hha2UtcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmVzcG9uc2VJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1BhcmVudDogUmVjZWl2ZWQgaGFuZHNoYWtlIHJlcGx5IGZyb20gQ2hpbGQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVwbHksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE9yaWdpbiA9IGUub3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IFNhdmluZyBDaGlsZCBvcmlnaW4nLCB0aGlzLmNoaWxkT3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgUGFyZW50QVBJKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTWlnaHQgbmVlZCB0byByZW1vdmUgc2luY2UgcGFyZW50IG1pZ2h0IGJlIHJlY2VpdmluZyBkaWZmZXJlbnQgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGRpZmZlcmVudCBob3N0c1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnUGFyZW50OiBJbnZhbGlkIGhhbmRzaGFrZSByZXBseScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdGYWlsZWQgaGFuZHNoYWtlJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlcGx5LCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBkb1NlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgUGFyZW50OiBTZW5kaW5nIGhhbmRzaGFrZSBhdHRlbXB0ICR7YXR0ZW1wdH1gLCB7IGNoaWxkT3JpZ2luIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgICAgICAgICAgfSwgY2hpbGRPcmlnaW4pO1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID09PSBtYXhIYW5kc2hha2VSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJlc3BvbnNlSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9TZW5kKCk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VJbnRlcnZhbCA9IHNldEludGVydmFsKGRvU2VuZCwgNTAwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkZWQpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsb2coJ1BhcmVudDogTG9hZGluZyBmcmFtZScsIHsgdXJsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mcmFtZS5zcmMgPSB1cmw7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGVudHJ5IHBvaW50IG9mIHRoZSBDaGlsZFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuICAgIGNoaWxkO1xuICAgIG1vZGVsO1xuICAgIHBhcmVudDtcbiAgICBwYXJlbnRPcmlnaW47XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNoaWxkLCBtb2RlbCwgcGFyZW50LCBhbmQgcmVzcG9uZHMgdG8gdGhlIFBhcmVudHMgaGFuZHNoYWtlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIEhhc2ggb2YgdmFsdWVzLCBmdW5jdGlvbnMsIG9yIHByb21pc2VzXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgVGhlIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBoYW5kc2hha2UgaGFzIGJlZW4gcmVjZWl2ZWRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbCkge1xuICAgICAgICB0aGlzLmNoaWxkID0gd2luZG93O1xuICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5jaGlsZC5wYXJlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc3BvbmRzIHRvIGEgaGFuZHNoYWtlIGluaXRpYXRlZCBieSB0aGUgUGFyZW50XG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgYW4gb2JqZWN0IHRoYXQgZXhwb3NlcyBhbiBBUEkgZm9yIHRoZSBDaGlsZFxuICAgICAqL1xuICAgIHNlbmRIYW5kc2hha2VSZXBseSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNoYWtlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWUuZGF0YS5wb3N0bWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdoYW5kc2hha2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBSZWNlaXZlZCBoYW5kc2hha2UgZnJvbSBQYXJlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzaGFrZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDaGlsZDogU2VuZGluZyBoYW5kc2hha2UgcmVwbHkgdG8gUGFyZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZS5zb3VyY2UucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdoYW5kc2hha2UtcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0sIGUub3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRPcmlnaW4gPSBlLm9yaWdpbjtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIG1vZGVsIHdpdGggdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRzID0gZS5kYXRhLm1vZGVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtrZXldID0gZGVmYXVsdHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBJbmhlcml0ZWQgYW5kIGV4dGVuZGVkIG1vZGVsIGZyb20gUGFyZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFNhdmluZyBQYXJlbnQgb3JpZ2luJywgdGhpcy5wYXJlbnRPcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG5ldyBDaGlsZEFQSSh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ0hhbmRzaGFrZSBSZXBseSBGYWlsZWQnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmNoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzaGFrZSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEEgc3RvcmFnZSBiYXNlZCBvbiBsb2NhbCBmaWxlcyB1bmRlciBzcGVjaWZpYyBjb250ZXh0XG4gKi9cbmNsYXNzIExTUGx1Z2luRmlsZVN0b3JhZ2Uge1xuICAgIGN0eDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY3R4XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY3R4KSB7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBwbHVnaW4gaWRcbiAgICAgKi9cbiAgICBnZXQgY3R4SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5iYXNlSW5mby5pZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleSBBIHN0cmluZyBhcyBmaWxlIG5hbWUgdGhhdCBzdXBwb3J0IG5lc3RlZCBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gdmFsdWUgU3RvcmFnZSB2YWx1ZVxuICAgICAqL1xuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdHguY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICd3cml0ZS1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXksIHZhbHVlXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbEFzeW5jKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlYWQtcGx1Z2luLXN0b3JhZ2UtZmlsZScsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZCwga2V5XVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICd1bmxpbmstcGx1Z2luLXN0b3JhZ2UtZmlsZScsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZCwga2V5XVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBzdG9yYWdlXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdjbGVhci1wbHVnaW4tc3RvcmFnZS1maWxlcycsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZF1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBrZXlcbiAgICAgKi9cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdHguY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdleGlzdC1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXldXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCB7IExTUGx1Z2luRmlsZVN0b3JhZ2UgfTtcbiIsImltcG9ydCB7IGRlZXBNZXJnZSwgc2FmZXR5UGF0aEpvaW4gfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTFNQbHVnaW5DYWxsZXIgfSBmcm9tICcuL0xTUGx1Z2luLmNhbGxlcic7XG5pbXBvcnQgRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnc25ha2UtY2FzZSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgTFNQbHVnaW5GaWxlU3RvcmFnZSB9IGZyb20gJy4vbW9kdWxlcy9MU1BsdWdpbi5TdG9yYWdlJztcbmNvbnN0IFBST1hZX0NPTlRJTlVFID0gU3ltYm9sLmZvcigncHJveHktY29udGludWUnKTtcbmNvbnN0IGRlYnVnID0gRGVidWcoJ0xTUGx1Z2luOnVzZXInKTtcbi8qKlxuICogQHBhcmFtIHR5cGVcbiAqIEBwYXJhbSBvcHRzXG4gKiBAcGFyYW0gYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZCh0eXBlLCBvcHRzLCBhY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHsga2V5LCBsYWJlbCB9ID0gb3B0cztcbiAgICBjb25zdCBldmVudEtleSA9IGBTaW1wbGVDb21tYW5kSG9vayR7a2V5fSR7KytyZWdpc3RlcmVkQ21kVWlkfWA7XG4gICAgdGhpcy5FZGl0b3JbJ29uJyArIGV2ZW50S2V5XShhY3Rpb24pO1xuICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgbWV0aG9kOiAncmVnaXN0ZXItcGx1Z2luLXNpbXBsZS1jb21tYW5kJyxcbiAgICAgICAgYXJnczogW3RoaXMuYmFzZUluZm8uaWQsIFt7IGtleSwgbGFiZWwsIHR5cGUgfSwgWydlZGl0b3IvaG9vaycsIGV2ZW50S2V5XV1dXG4gICAgfSk7XG59XG5jb25zdCBhcHAgPSB7XG4gICAgcmVnaXN0ZXJVSUl0ZW0odHlwZSwgb3B0cykge1xuICAgICAgICBjb25zdCBwaWQgPSB0aGlzLmJhc2VJbmZvLmlkO1xuICAgICAgICAvLyBvcHRzLmtleSA9IGAke3BpZH1fJHtvcHRzLmtleX1gXG4gICAgICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlZ2lzdGVyLXBsdWdpbi11aS1pdGVtJyxcbiAgICAgICAgICAgIGFyZ3M6IFtwaWQsIHR5cGUsIG9wdHNdXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJQYWdlTWVudUl0ZW0odGFnLCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSB0YWcgKyAnXycgKyB0aGlzLmJhc2VJbmZvLmlkO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRhZztcbiAgICAgICAgY29uc3QgdHlwZSA9ICdwYWdlLW1lbnUtaXRlbSc7XG4gICAgICAgIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZC5jYWxsKHRoaXMsIHR5cGUsIHtcbiAgICAgICAgICAgIGtleSwgbGFiZWxcbiAgICAgICAgfSwgYWN0aW9uKTtcbiAgICB9XG59O1xubGV0IHJlZ2lzdGVyZWRDbWRVaWQgPSAwO1xuY29uc3QgZWRpdG9yID0ge1xuICAgIHJlZ2lzdGVyU2xhc2hDb21tYW5kKHRhZywgYWN0aW9ucykge1xuICAgICAgICBkZWJ1ZygnUmVnaXN0ZXIgc2xhc2ggY29tbWFuZCAjJywgdGhpcy5iYXNlSW5mby5pZCwgdGFnLCBhY3Rpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBhY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgIFsnZWRpdG9yL2NsZWFyLWN1cnJlbnQtc2xhc2gnLCBmYWxzZV0sXG4gICAgICAgICAgICAgICAgWydlZGl0b3IvcmVzdG9yZS1zYXZlZC1jdXJzb3InXSxcbiAgICAgICAgICAgICAgICBbJ2VkaXRvci9ob29rJywgYWN0aW9uc11cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgYWN0aW9ucyA9IGFjdGlvbnMubWFwKChpdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW3RhZywgLi4uYXJnc10gPSBpdDtcbiAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZWRpdG9yL2hvb2snOlxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsZXI/LmNhbGxVc2VyTW9kZWwoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50S2V5ID0gYFNsYXNoQ29tbWFuZEhvb2ske3RhZ30keysrcmVnaXN0ZXJlZENtZFVpZH1gO1xuICAgICAgICAgICAgICAgICAgICBpdFsxXSA9IGV2ZW50S2V5O1xuICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBjb21tYW5kIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRWRpdG9yWydvbicgKyBldmVudEtleV0oZm4pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYWxsZXI/LmNhbGwoYGFwaTpjYWxsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAncmVnaXN0ZXItcGx1Z2luLXNsYXNoLWNvbW1hbmQnLFxuICAgICAgICAgICAgYXJnczogW3RoaXMuYmFzZUluZm8uaWQsIFt0YWcsIGFjdGlvbnNdXVxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyQmxvY2tDb250ZXh0TWVudUl0ZW0odGFnLCBhY3Rpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSB0YWcgKyAnXycgKyB0aGlzLmJhc2VJbmZvLmlkO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRhZztcbiAgICAgICAgY29uc3QgdHlwZSA9ICdibG9jay1jb250ZXh0LW1lbnUtaXRlbSc7XG4gICAgICAgIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZC5jYWxsKHRoaXMsIHR5cGUsIHtcbiAgICAgICAgICAgIGtleSwgbGFiZWxcbiAgICAgICAgfSwgYWN0aW9uKTtcbiAgICB9LFxuICAgIHNjcm9sbFRvQmxvY2tJblBhZ2UocGFnZU5hbWUsIGJsb2NrSWQpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gYGJsb2NrLWNvbnRlbnQtYCArIGJsb2NrSWQ7XG4gICAgICAgIHRoaXMuQXBwLnB1c2hTdGF0ZSgncGFnZScsIHsgbmFtZTogcGFnZU5hbWUgfSwgeyBhbmNob3IgfSk7XG4gICAgfVxufTtcbmNvbnN0IGRiID0ge307XG5jb25zdCBLRVlfTUFJTl9VSSA9IDA7XG4vKipcbiAqIFVzZXIgcGx1Z2luIGluc3RhbmNlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBMU1BsdWdpblVzZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIF9iYXNlSW5mbztcbiAgICBfY2FsbGVyO1xuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIHVpIGZyYW1lIGlkZW50aXRpZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91aSA9IG5ldyBNYXAoKTtcbiAgICBfZmlsZVN0b3JhZ2U7XG4gICAgLyoqXG4gICAgICogaGFuZGxlciBvZiBiZWZvcmUgdW5sb2FkIHBsdWdpblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2JlZm9yZXVubG9hZENhbGxiYWNrO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBfYmFzZUluZm9cbiAgICAgKiBAcGFyYW0gX2NhbGxlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9iYXNlSW5mbywgX2NhbGxlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9iYXNlSW5mbyA9IF9iYXNlSW5mbztcbiAgICAgICAgdGhpcy5fY2FsbGVyID0gX2NhbGxlcjtcbiAgICAgICAgX2NhbGxlci5vbignc2V0dGluZ3M6Y2hhbmdlZCcsIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBjb25zdCBhID0gT2JqZWN0LmFzc2lnbih0aGlzLl9iYXNlSW5mby5zZXR0aW5ncywgcGF5bG9hZCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3NldHRpbmdzOmNoYW5nZWQnLCB7IC4uLmEgfSwgYik7XG4gICAgICAgIH0pO1xuICAgICAgICBfY2FsbGVyLm9uKCdiZWZvcmV1bmxvYWQnLCBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhY3RvciwgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gdGhpcy5fYmVmb3JldW5sb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNiICYmIGF3YWl0IGNiKHJlc3QpO1xuICAgICAgICAgICAgICAgIGFjdG9yPy5yZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGAke19jYWxsZXIuZGVidWdUYWd9IFtiZWZvcmV1bmxvYWRdIGAsIGUpO1xuICAgICAgICAgICAgICAgIGFjdG9yPy5yZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBtb2R1bGVzXG4gICAgICAgIHRoaXMuX2ZpbGVTdG9yYWdlID0gbmV3IExTUGx1Z2luRmlsZVN0b3JhZ2UodGhpcyk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWR5KG1vZGVsLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5fY29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2RlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbW9kZWw7XG4gICAgICAgICAgICAgICAgbW9kZWwgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBiYXNlSW5mbyA9IGF3YWl0IHRoaXMuX2NhbGxlci5jb25uZWN0VG9QYXJlbnQobW9kZWwpO1xuICAgICAgICAgICAgYmFzZUluZm8gPSBkZWVwTWVyZ2UodGhpcy5fYmFzZUluZm8sIGJhc2VJbmZvKTtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoYmFzZUluZm8/LmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbGVyLmRlYnVnVGFnID0gYCMke2Jhc2VJbmZvLmlkfSBbJHtiYXNlSW5mby5uYW1lfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2suY2FsbCh0aGlzLCBiYXNlSW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tMU1BsdWdpbiBSZWFkeSBFcnJvcl0nLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbnN1cmVDb25uZWN0ZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBjb25uZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiZWZvcmV1bmxvYWQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fYmVmb3JldW5sb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgcHJvdmlkZU1vZGVsKG1vZGVsKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLl9leHRlbmRVc2VyTW9kZWwobW9kZWwpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHJvdmlkZVRoZW1lKHRoZW1lKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3Byb3ZpZGVyOnRoZW1lJywgdGhlbWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHJvdmlkZVN0eWxlKHN0eWxlKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3Byb3ZpZGVyOnN0eWxlJywgc3R5bGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcHJvdmlkZVVJKHVpKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3Byb3ZpZGVyOnVpJywgdWkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdXBkYXRlU2V0dGluZ3MoYXR0cnMpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnc2V0dGluZ3M6dXBkYXRlJywgYXR0cnMpO1xuICAgICAgICAvLyBUT0RPOiB1cGRhdGUgYXNzb2NpYXRlZCBiYXNlSW5mbyBzZXR0aW5nc1xuICAgIH1cbiAgICBzZXRNYWluVUlBdHRycyhhdHRycykge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdtYWluLXVpOmF0dHJzJywgYXR0cnMpO1xuICAgIH1cbiAgICBzZXRNYWluVUlJbmxpbmVTdHlsZShzdHlsZSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdtYWluLXVpOnN0eWxlJywgc3R5bGUpO1xuICAgIH1cbiAgICBoaWRlTWFpblVJKG9wdHMpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsga2V5OiBLRVlfTUFJTl9VSSwgdmlzaWJsZTogZmFsc2UsIGN1cnNvcjogb3B0cz8ucmVzdG9yZUVkaXRpbmdDdXJzb3IgfTtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTp2aXNpYmxlJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdCgndWk6dmlzaWJsZTpjaGFuZ2VkJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuX3VpLnNldChwYXlsb2FkLmtleSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIHNob3dNYWluVUkoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IGtleTogS0VZX01BSU5fVUksIHZpc2libGU6IHRydWUgfTtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTp2aXNpYmxlJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdCgndWk6dmlzaWJsZTpjaGFuZ2VkJywgcGF5bG9hZCk7XG4gICAgICAgIHRoaXMuX3VpLnNldChwYXlsb2FkLmtleSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIHRvZ2dsZU1haW5VSSgpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsga2V5OiBLRVlfTUFJTl9VSSwgdG9nZ2xlOiB0cnVlIH07XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fdWkuZ2V0KHBheWxvYWQua2V5KTtcbiAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU1haW5VSSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93TWFpblVJKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzTWFpblVJVmlzaWJsZSgpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl91aS5nZXQoMCk7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHN0YXRlICYmIHN0YXRlLnZpc2libGUpO1xuICAgIH1cbiAgICBnZXQgY29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGVkO1xuICAgIH1cbiAgICBnZXQgYmFzZUluZm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlSW5mbztcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlSW5mbz8uc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBjYWxsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsZXI7XG4gICAgfVxuICAgIHJlc29sdmVSZXNvdXJjZUZ1bGxVcmwoZmlsZVBhdGgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVDb25uZWN0ZWQoKTtcbiAgICAgICAgaWYgKCFmaWxlUGF0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9eWy5cXFxcL10rLywgJycpO1xuICAgICAgICByZXR1cm4gc2FmZXR5UGF0aEpvaW4odGhpcy5fYmFzZUluZm8ubHNyLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9tYWtlVXNlclByb3h5KHRhcmdldCwgdGFnKSB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICBjb25zdCBjYWxsZXIgPSB0aGlzLmNhbGxlcjtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3BLZXksIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ01ldGhvZCA9IHRhcmdldFtwcm9wS2V5XTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdNZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IG9yaWdNZXRob2QuYXBwbHkodGhhdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9PSBQUk9YWV9DT05USU5VRSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9va01hdGNoZXIgPSBwcm9wS2V5LnRvU3RyaW5nKCkubWF0Y2goL14ob25jZXxvZmZ8b24pL2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvb2tNYXRjaGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmID0gaG9va01hdGNoZXJbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaG9va01hdGNoZXIuaW5wdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHMuc2xpY2UoZi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBgaG9vazoke3RhZ306JHtzbmFrZUNhc2UoZSl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJbZl0odHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYgIT09ICdvZmYnID8gKCkgPT4gKGNhbGxlci5vZmYodHlwZSwgaGFuZGxlcikpIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgaG9zdFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJmYWNlIG1ldGhvZHMgb2Yge0BsaW5rIElBcHBQcm94eX1cbiAgICAgKi9cbiAgICBnZXQgQXBwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVVzZXJQcm94eShhcHAsICdhcHAnKTtcbiAgICB9XG4gICAgZ2V0IEVkaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VVc2VyUHJveHkoZWRpdG9yLCAnZWRpdG9yJyk7XG4gICAgfVxuICAgIGdldCBEQigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VVc2VyUHJveHkoZGIpO1xuICAgIH1cbiAgICBnZXQgRmlsZVN0b3JhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlU3RvcmFnZTtcbiAgICB9XG59XG5leHBvcnQgKiBmcm9tICcuL0xTUGx1Z2luJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFBsdWdpblVzZXJJbnN0YW5jZShwbHVnaW5CYXNlSW5mbywgcGx1Z2luQ2FsbGVyKSB7XG4gICAgcmV0dXJuIG5ldyBMU1BsdWdpblVzZXIocGx1Z2luQmFzZUluZm8sIHBsdWdpbkNhbGxlcik7XG59XG5pZiAod2luZG93Ll9fTFNQX19IT1NUX18gPT0gbnVsbCkgeyAvLyBFbnRyeSBvZiBpZnJhbWUgbW9kZVxuICAgIGNvbnN0IGNhbGxlciA9IG5ldyBMU1BsdWdpbkNhbGxlcihudWxsKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93LmxvZ3NlcSA9IHNldHVwUGx1Z2luVXNlckluc3RhbmNlKHt9LCBjYWxsZXIpO1xufVxuIiwiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IExTUGx1Z2luVXNlciB9IGZyb20gJy4vTFNQbHVnaW4udXNlcic7XG4vLyBAdHMtaWdub3JlXG5jb25zdCB7IGltcG9ydEhUTUwsIGNyZWF0ZVNhbmRib3hDb250YWluZXIgfSA9IHdpbmRvdy5RU2FuZGJveCB8fCB7fTtcbmZ1bmN0aW9uIHVzZXJGZXRjaCh1cmwsIG9wdHMpIHtcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJ2ZpbGU6Ly8nLCAnJyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB3aW5kb3cuYXBpcy5kb0FjdGlvbihbJ3JlYWRGaWxlJywgdXJsXSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaCh1cmwsIG9wdHMpO1xufVxuY2xhc3MgTFNQbHVnaW5TaGFkb3dGcmFtZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3BsdWdpbkxvY2FsO1xuICAgIF9mcmFtZTtcbiAgICBfcm9vdDtcbiAgICBfbG9hZGVkID0gZmFsc2U7XG4gICAgX3VubW91bnRGbnMgPSBbXTtcbiAgICBjb25zdHJ1Y3RvcihfcGx1Z2luTG9jYWwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fcGx1Z2luTG9jYWwgPSBfcGx1Z2luTG9jYWw7XG4gICAgICAgIF9wbHVnaW5Mb2NhbC5fZGlzcG9zZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91bm1vdW50KCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIGVudHJ5IH0gPSB0aGlzLl9wbHVnaW5Mb2NhbC5vcHRpb25zO1xuICAgICAgICBpZiAodGhpcy5sb2FkZWQgfHwgIWVudHJ5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IHRlbXBsYXRlLCBleGVjU2NyaXB0cyB9ID0gYXdhaXQgaW1wb3J0SFRNTChlbnRyeSwgeyBmZXRjaDogdXNlckZldGNoIH0pO1xuICAgICAgICB0aGlzLl9tb3VudCh0ZW1wbGF0ZSwgZG9jdW1lbnQuYm9keSk7XG4gICAgICAgIGNvbnN0IHNhbmRib3ggPSBjcmVhdGVTYW5kYm94Q29udGFpbmVyKG5hbWUsIHtcbiAgICAgICAgICAgIGVsZW1lbnRHZXR0ZXI6ICgpID0+IHRoaXMuX3Jvb3Q/LmZpcnN0Q2hpbGQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBnbG9iYWwgPSBzYW5kYm94Lmluc3RhbmNlLnByb3h5O1xuICAgICAgICBnbG9iYWwuX19zaGFkb3dfbW9kZV9fID0gdHJ1ZTtcbiAgICAgICAgZ2xvYmFsLkxTUGx1Z2luTG9jYWwgPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgZ2xvYmFsLkxTUGx1Z2luU2hhZG93ID0gdGhpcztcbiAgICAgICAgZ2xvYmFsLkxTUGx1Z2luVXNlciA9IGdsb2JhbC5sb2dzZXEgPSBuZXcgTFNQbHVnaW5Vc2VyKHRoaXMuX3BsdWdpbkxvY2FsLnRvSlNPTigpLCB0aGlzLl9wbHVnaW5Mb2NhbC5jYWxsZXIpO1xuICAgICAgICAvLyBUT0RPOiB7bW91bnQsIHVubW91bnR9XG4gICAgICAgIGNvbnN0IGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjU2NyaXB0cyhnbG9iYWwsIHRydWUpO1xuICAgICAgICB0aGlzLl91bm1vdW50Rm5zLnB1c2goZXhlY1Jlc3VsdC51bm1vdW50KTtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgX21vdW50KGNvbnRlbnQsIGNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuX2ZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZyYW1lLmNsYXNzTGlzdC5hZGQoJ2xzcC1zaGFkb3ctc2FuZGJveCcpO1xuICAgICAgICBmcmFtZS5pZCA9IHRoaXMuX3BsdWdpbkxvY2FsLmlkO1xuICAgICAgICB0aGlzLl9yb290ID0gZnJhbWUuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICB0aGlzLl9yb290LmlubmVySFRNTCA9IGA8ZGl2PiR7Y29udGVudH08L2Rpdj5gO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhbWUpO1xuICAgICAgICB0aGlzLmVtaXQoJ21vdW50ZWQnKTtcbiAgICB9XG4gICAgX3VubW91bnQoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5fdW5tb3VudEZucykge1xuICAgICAgICAgICAgZm4gJiYgZm4uY2FsbChudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmZyYW1lPy5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lKTtcbiAgICB9XG4gICAgZ2V0IGxvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZDtcbiAgICB9XG4gICAgZ2V0IGRvY3VtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdD8uZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgZ2V0IGZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWU7XG4gICAgfVxufVxuZXhwb3J0IHsgTFNQbHVnaW5TaGFkb3dGcmFtZSB9O1xuIiwiaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IFBvc3RtYXRlLCBNb2RlbCB9IGZyb20gJy4vcG9zdG1hdGUnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IGRlZmVycmVkLCBJU19ERVYgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTFNQbHVnaW5TaGFkb3dGcmFtZSB9IGZyb20gJy4vTFNQbHVnaW4uc2hhZG93JztcbmNvbnN0IGRlYnVnID0gRGVidWcoJ0xTUGx1Z2luOmNhbGxlcicpO1xuZXhwb3J0IGNvbnN0IEZMQUdfQVdBSVQgPSAnI2F3YWl0I3Jlc3BvbnNlIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHID0gJyNsc3Btc2cjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfRVJST1JfVEFHID0gJyNsc3Btc2cjZXJyb3IjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfU0VUVElOR1MgPSAnI2xzcG1zZyNzZXR0aW5ncyMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19CRUZPUkVfVU5MT0FEID0gJyNsc3Btc2cjYmVmb3JldW5sb2FkIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX1NZTkMgPSAnI2xzcG1zZyNyZXBseSMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19SRUFEWSA9ICcjbHNwbXNnI3JlYWR5Iyc7XG5leHBvcnQgY29uc3QgTFNQTVNHRm4gPSAoaWQpID0+IGAke0xTUE1TR30ke2lkfWA7XG5leHBvcnQgY29uc3QgQVdBSVRfTFNQTVNHRm4gPSAoaWQpID0+IGAke0ZMQUdfQVdBSVR9JHtpZH1gO1xuLyoqXG4gKiBDYWxsIGJldHdlZW4gY29yZSBhbmQgdXNlclxuICovXG5jbGFzcyBMU1BsdWdpbkNhbGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3BsdWdpbkxvY2FsO1xuICAgIF9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBfcGFyZW50O1xuICAgIF9jaGlsZDtcbiAgICBfc2hhZG93O1xuICAgIF9zdGF0dXM7XG4gICAgX3VzZXJNb2RlbCA9IHt9O1xuICAgIF9jYWxsO1xuICAgIF9jYWxsVXNlck1vZGVsO1xuICAgIF9kZWJ1Z1RhZyA9ICcnO1xuICAgIGNvbnN0cnVjdG9yKF9wbHVnaW5Mb2NhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbCA9IF9wbHVnaW5Mb2NhbDtcbiAgICAgICAgaWYgKF9wbHVnaW5Mb2NhbCkge1xuICAgICAgICAgICAgdGhpcy5fZGVidWdUYWcgPSBfcGx1Z2luTG9jYWwuZGVidWdUYWc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY29ubmVjdFRvQ2hpbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHsgc2hhZG93IH0gPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgaWYgKHNoYWRvdykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0dXBTaGFkb3dTYW5kYm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXR1cElmcmFtZVNhbmRib3goKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBjb25uZWN0VG9QYXJlbnQodXNlck1vZGVsID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgY2FsbGVyID0gdGhpcztcbiAgICAgICAgY29uc3QgaXNTaGFkb3dNb2RlID0gdGhpcy5fcGx1Z2luTG9jYWwgIT0gbnVsbDtcbiAgICAgICAgbGV0IHN5bmNHQ1RpbWVyID0gMDtcbiAgICAgICAgbGV0IHN5bmNUYWcgPSAwO1xuICAgICAgICBjb25zdCBzeW5jQWN0b3JzID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCByZWFkeURlZmVycmVkID0gZGVmZXJyZWQoMTAwMCAqIDUpO1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2V4dGVuZFVzZXJNb2RlbCh7XG4gICAgICAgICAgICBbTFNQTVNHX1JFQURZXTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtMU1BNU0dfQkVGT1JFX1VOTE9BRF06IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0b3IgPSBkZWZlcnJlZCgxMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KCdiZWZvcmV1bmxvYWQnLCBPYmplY3QuYXNzaWduKHsgYWN0b3IgfSwgZSkpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFjdG9yLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR19TRVRUSU5HU106IGFzeW5jICh7IHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KCdzZXR0aW5nczpjaGFuZ2VkJywgcGF5bG9hZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR106IGFzeW5jICh7IG5zLCB0eXBlLCBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhgW2NhbGwgZnJvbSBob3N0XSAke3RoaXMuX2RlYnVnVGFnfWAsIG5zLCB0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICBpZiAobnMgJiYgbnMuc3RhcnRzV2l0aCgnaG9vaycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KGAke25zfToke3R5cGV9YCwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQodHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR19TWU5DXTogKHsgX3N5bmMsIHJlc3VsdCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgZGVidWcoYFtzeW5jIHJlcGx5XSAjJHtfc3luY31gLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzeW5jQWN0b3JzLmhhcyhfc3luYykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0b3IgPSBzeW5jQWN0b3JzLmdldChfc3luYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8uaGFzT3duUHJvcGVydHkoTFNQTVNHX0VSUk9SX1RBRykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rvci5yZWplY3QocmVzdWx0W0xTUE1TR19FUlJPUl9UQUddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdG9yLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNBY3RvcnMuZGVsZXRlKF9zeW5jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi51c2VyTW9kZWxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc1NoYWRvd01vZGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX3BsdWdpbkxvY2FsPy50b0pTT04oKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBtID0gbmV3IE1vZGVsKG1vZGVsKTtcbiAgICAgICAgY29uc3QgaGFuZHNoYWtlID0gcG0uc2VuZEhhbmRzaGFrZVJlcGx5KCk7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9ICdwZW5kaW5nJztcbiAgICAgICAgYXdhaXQgaGFuZHNoYWtlLnRoZW4oKHJlZlBhcmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2hpbGQgPSByZWZQYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY2FsbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkID0ge30sIGFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9ICsrc3luY1RhZztcbiAgICAgICAgICAgICAgICAgICAgc3luY0FjdG9ycy5zZXQodGFnLCBhY3Rvcik7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQuX3N5bmMgPSB0YWc7XG4gICAgICAgICAgICAgICAgICAgIGFjdG9yLnNldFRhZyhgYXN5bmMgY2FsbCAjJHt0YWd9YCk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKCdhc3luYyBjYWxsICMnLCB0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWZQYXJlbnQuZW1pdChMU1BNU0dGbihtb2RlbC5iYXNlSW5mby5pZCksIHsgdHlwZSwgcGF5bG9hZCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0b3I/LnByb21pc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJNb2RlbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxbdHlwZV0ocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbbW9kZWwgbWV0aG9kXSAjJHt0eXBlfSBub3QgZXhpc3RlZGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBhY3RvcnMgR0NcbiAgICAgICAgICAgIHN5bmNHQ1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzeW5jQWN0b3JzLnNpemUgPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2Ygc3luY0FjdG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuc2V0dGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNBY3RvcnMuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMTAwMCAqIDYwICogMzApO1xuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIG1vZGVsLmJhc2VJbmZvO1xuICAgIH1cbiAgICBhc3luYyBjYWxsKHR5cGUsIHBheWxvYWQgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbD8uY2FsbCh0aGlzLCB0eXBlLCBwYXlsb2FkKTtcbiAgICB9XG4gICAgYXN5bmMgY2FsbEFzeW5jKHR5cGUsIHBheWxvYWQgPSB7fSkge1xuICAgICAgICBjb25zdCBhY3RvciA9IGRlZmVycmVkKDEwMDAgKiAxMCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsPy5jYWxsKHRoaXMsIHR5cGUsIHBheWxvYWQsIGFjdG9yKTtcbiAgICB9XG4gICAgYXN5bmMgY2FsbFVzZXJNb2RlbCh0eXBlLCBwYXlsb2FkID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxVc2VyTW9kZWw/LmNhbGwodGhpcywgdHlwZSwgcGF5bG9hZCk7XG4gICAgfVxuICAgIGFzeW5jIF9zZXR1cElmcmFtZVNhbmRib3goKSB7XG4gICAgICAgIGNvbnN0IGNudCA9IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy5fcGx1Z2luTG9jYWw7XG4gICAgICAgIGNvbnN0IGlkID0gcGwuaWQ7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGwub3B0aW9ucy5lbnRyeSk7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXNcbiAgICAgICAgICAgIC5zZXQoYF9fdl9fYCwgSVNfREVWID8gRGF0ZS5ub3coKS50b1N0cmluZygpIDogcGwub3B0aW9ucy52ZXJzaW9uKTtcbiAgICAgICAgLy8gY2xlYXIgem9tYmllIHNhbmRib3hcbiAgICAgICAgY29uc3QgemIgPSBjbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9YCk7XG4gICAgICAgIGlmICh6YilcbiAgICAgICAgICAgIHpiLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoemIpO1xuICAgICAgICBjb25zdCBwdCA9IG5ldyBQb3N0bWF0ZSh7XG4gICAgICAgICAgICBpZCwgY29udGFpbmVyOiBjbnQsIHVybDogdXJsLmhyZWYsXG4gICAgICAgICAgICBjbGFzc0xpc3RBcnJheTogWydsc3AtaWZyYW1lLXNhbmRib3gnXSxcbiAgICAgICAgICAgIG1vZGVsOiB7IGJhc2VJbmZvOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBsLnRvSlNPTigpKSkgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGhhbmRzaGFrZSA9IHB0LnNlbmRIYW5kc2hha2UoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAvLyB0aW1lb3V0IGZvciBoYW5kc2hha2VcbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBoYW5kc2hha2UgVGltZW91dGApKTtcbiAgICAgICAgICAgIH0sIDMgKiAxMDAwKTsgLy8gM3NlY3NcbiAgICAgICAgICAgIGhhbmRzaGFrZS50aGVuKChyZWZDaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHJlZkNoaWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICByZWZDaGlsZC5vbihMU1BNU0dGbihwbC5pZCksICh7IHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgW2NhbGwgZnJvbSBwbHVnaW5dIGAsIHR5cGUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbD8uZW1pdCh0eXBlLCBwYXlsb2FkIHx8IHt9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsID0gYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGFsbCB3aWxsIGdldCBtZXNzYWdlIGJlZm9yZSBoYW5kc2hha2VkXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlZkNoaWxkLmNhbGwoTFNQTVNHRm4ocGwuaWQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhcmdzWzBdLCBwYXlsb2FkOiBPYmplY3QuYXNzaWduKGFyZ3NbMV0gfHwge30sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJHBpZDogcGwuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJNb2RlbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoRkxBR19BV0FJVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGF0dGFjaCBwYXlsb2FkIHdpdGggbWV0aG9kIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWZDaGlsZC5nZXQodHlwZS5yZXBsYWNlKEZMQUdfQVdBSVQsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZDaGlsZC5jYWxsKHR5cGUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgIGRlYnVnKCdbaWZyYW1lIHNhbmRib3hdIGVycm9yJywgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF9zZXR1cFNoYWRvd1NhbmRib3goKSB7XG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy5fcGx1Z2luTG9jYWw7XG4gICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuX3NoYWRvdyA9IG5ldyBMU1BsdWdpblNoYWRvd0ZyYW1lKHBsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9ICdwZW5kaW5nJztcbiAgICAgICAgICAgIGF3YWl0IHNoYWRvdy5sb2FkKCk7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGwgPSBhc3luYyAodHlwZSwgcGF5bG9hZCA9IHt9LCBhY3RvcikgPT4ge1xuICAgICAgICAgICAgICAgIGFjdG9yICYmIChwYXlsb2FkLmFjdG9yID0gYWN0b3IpO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgQ2FsbCBpbiBzYW1lIHRocmVhZFxuICAgICAgICAgICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsPy5lbWl0KHR5cGUsIE9iamVjdC5hc3NpZ24ocGF5bG9hZCwge1xuICAgICAgICAgICAgICAgICAgICAkJHBpZDogcGwuaWRcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdG9yPy5wcm9taXNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxVc2VyTW9kZWwgPSBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZT8uc3RhcnRzV2l0aChGTEFHX0FXQUlUKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS5yZXBsYWNlKEZMQUdfQVdBSVQsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGFyZ3NbMV0gfHwge307XG4gICAgICAgICAgICAgICAgY29uc3QgZm4gPSB0aGlzLl91c2VyTW9kZWxbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmbi5jYWxsKG51bGwsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbc2hhZG93IHNhbmRib3hdIGVycm9yJywgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9leHRlbmRVc2VyTW9kZWwobW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlck1vZGVsLCBtb2RlbCk7XG4gICAgfVxuICAgIF9nZXRTYW5kYm94SWZyYW1lQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Py5mcmFtZTtcbiAgICB9XG4gICAgX2dldFNhbmRib3hTaGFkb3dDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaGFkb3c/LmZyYW1lO1xuICAgIH1cbiAgICBzZXQgZGVidWdUYWcodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZGVidWdUYWcgPSB2YWx1ZTtcbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcGFyZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2hhZG93KSB7XG4gICAgICAgICAgICB0aGlzLl9zaGFkb3cuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IHsgTFNQbHVnaW5DYWxsZXIgfTtcbiIsImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIHNldHVwSW5qZWN0ZWRTdHlsZSwgZ2VuSUQsIHNldHVwSW5qZWN0ZWRUaGVtZSwgc2V0dXBJbmplY3RlZFVJLCBkZWZlcnJlZCwgaW52b2tlSG9zdEV4cG9ydGVkQXBpLCBpc09iamVjdCwgd2l0aEZpbGVQcm90b2NvbCwgZ2V0U0RLUGF0aFJvb3QsIFBST1RPQ09MX0ZJTEUsIFVSTF9MU1AsIHNhZmV0eVBhdGhKb2luLCBwYXRoLCBzYWZldHlQYXRoTm9ybWFsaXplIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCAqIGFzIHBsdWdpbkhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCBEZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyBMU1BsdWdpbkNhbGxlciwgTFNQTVNHX1JFQURZLCBMU1BNU0dfU1lOQywgTFNQTVNHLCBMU1BNU0dfU0VUVElOR1MsIExTUE1TR19FUlJPUl9UQUcsIExTUE1TR19CRUZPUkVfVU5MT0FELCBBV0FJVF9MU1BNU0dGbiB9IGZyb20gJy4vTFNQbHVnaW4uY2FsbGVyJztcbmltcG9ydCB7IHNuYWtlQ2FzZSB9IGZyb20gJ3NuYWtlLWNhc2UnO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuY29uc3QgZGVidWcgPSBEZWJ1ZygnTFNQbHVnaW46Y29yZScpO1xuY29uc3QgRElSX1BMVUdJTlMgPSAncGx1Z2lucyc7XG4vKipcbiAqIFVzZXIgc2V0dGluZ3NcbiAqL1xuY2xhc3MgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIF91c2VyUGx1Z2luU2V0dGluZ3M7XG4gICAgX3NldHRpbmdzID0ge1xuICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICB9O1xuICAgIGNvbnN0cnVjdG9yKF91c2VyUGx1Z2luU2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdXNlclBsdWdpblNldHRpbmdzID0gX3VzZXJQbHVnaW5TZXR0aW5ncztcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9zZXR0aW5ncywgX3VzZXJQbHVnaW5TZXR0aW5ncyk7XG4gICAgfVxuICAgIGdldChrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc1trXTtcbiAgICB9XG4gICAgc2V0KGssIHYpIHtcbiAgICAgICAgY29uc3QgbyA9IGRlZXBNZXJnZSh7fSwgdGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICBpZiAodHlwZW9mIGsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3Nba10gPT0gdilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QoaykpIHtcbiAgICAgICAgICAgIGRlZXBNZXJnZSh0aGlzLl9zZXR0aW5ncywgayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9zZXR0aW5ncyksIG8pO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcbiAgICB9XG59XG5jbGFzcyBQbHVnaW5Mb2dnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIF90YWc7XG4gICAgX2xvZ3MgPSBbXTtcbiAgICBjb25zdHJ1Y3RvcihfdGFnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3RhZyA9IF90YWc7XG4gICAgfVxuICAgIHdyaXRlKHR5cGUsIHBheWxvYWQpIHtcbiAgICAgICAgbGV0IG1zZyA9IHBheWxvYWQucmVkdWNlKChhYywgaXQpID0+IHtcbiAgICAgICAgICAgIGlmIChpdCAmJiBpdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgYWMgKz0gYCR7aXQubWVzc2FnZX0gJHtpdC5zdGFja31gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWMgKz0gaXQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhYztcbiAgICAgICAgfSwgYFske3RoaXMuX3RhZ31dWyR7bmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKX1dIGApO1xuICAgICAgICB0aGlzLl9sb2dzLnB1c2goW3R5cGUsIG1zZ10pO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fbG9ncyA9IFtdO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScpO1xuICAgIH1cbiAgICBpbmZvKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZSgnSU5GTycsIGFyZ3MpO1xuICAgIH1cbiAgICBlcnJvciguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGUoJ0VSUk9SJywgYXJncyk7XG4gICAgfVxuICAgIHdhcm4oLi4uYXJncykge1xuICAgICAgICB0aGlzLndyaXRlKCdXQVJOJywgYXJncyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ3M7XG4gICAgfVxufVxudmFyIFBsdWdpbkxvY2FsTG9hZFN0YXR1cztcbihmdW5jdGlvbiAoUGx1Z2luTG9jYWxMb2FkU3RhdHVzKSB7XG4gICAgUGx1Z2luTG9jYWxMb2FkU3RhdHVzW1wiTE9BRElOR1wiXSA9IFwibG9hZGluZ1wiO1xuICAgIFBsdWdpbkxvY2FsTG9hZFN0YXR1c1tcIlVOTE9BRElOR1wiXSA9IFwidW5sb2FkaW5nXCI7XG4gICAgUGx1Z2luTG9jYWxMb2FkU3RhdHVzW1wiTE9BREVEXCJdID0gXCJsb2FkZWRcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJVTkxPQURFRFwiXSA9IFwidW5sb2FkXCI7XG4gICAgUGx1Z2luTG9jYWxMb2FkU3RhdHVzW1wiRVJST1JcIl0gPSBcImVycm9yXCI7XG59KShQbHVnaW5Mb2NhbExvYWRTdGF0dXMgfHwgKFBsdWdpbkxvY2FsTG9hZFN0YXR1cyA9IHt9KSk7XG5mdW5jdGlvbiBpbml0VXNlclNldHRpbmdzSGFuZGxlcnMocGx1Z2luTG9jYWwpIHtcbiAgICBjb25zdCBfID0gKGxhYmVsKSA9PiBgc2V0dGluZ3M6JHtsYWJlbH1gO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3VwZGF0ZScpLCAoYXR0cnMpID0+IHtcbiAgICAgICAgaWYgKCFhdHRycylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcGx1Z2luTG9jYWwuc2V0dGluZ3M/LnNldChhdHRycyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpbml0TWFpblVJSGFuZGxlcnMocGx1Z2luTG9jYWwpIHtcbiAgICBjb25zdCBfID0gKGxhYmVsKSA9PiBgbWFpbi11aToke2xhYmVsfWA7XG4gICAgcGx1Z2luTG9jYWwub24oXygndmlzaWJsZScpLCAoeyB2aXNpYmxlLCB0b2dnbGUsIGN1cnNvciB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsID0gcGx1Z2luTG9jYWwuZ2V0TWFpblVJKCk7XG4gICAgICAgIGVsPy5jbGFzc0xpc3RbdG9nZ2xlID8gJ3RvZ2dsZScgOiAodmlzaWJsZSA/ICdhZGQnIDogJ3JlbW92ZScpXSgndmlzaWJsZScpO1xuICAgICAgICAvLyBwbHVnaW5Mb2NhbC5jYWxsZXIhLmNhbGxVc2VyTW9kZWwoTFNQTVNHLCB7IHR5cGU6IF8oJ3Zpc2libGUnKSwgcGF5bG9hZDogdmlzaWJsZSB9KVxuICAgICAgICAvLyBhdXRvIGZvY3VzIGZyYW1lXG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICBpZiAoIXBsdWdpbkxvY2FsLnNoYWRvdyAmJiBlbCkge1xuICAgICAgICAgICAgICAgIGVsLmNvbnRlbnRXaW5kb3c/LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdyZXN0b3JlX2VkaXRpbmdfY3Vyc29yJyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCdhdHRycycpLCAoYXR0cnMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBwbHVnaW5Mb2NhbC5nZXRNYWluVUkoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgZWw/LnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGx1Z2luTG9jYWwub24oXygnc3R5bGUnKSwgKHN0eWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsID0gcGx1Z2luTG9jYWwuZ2V0TWFpblVJKCk7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHN0eWxlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGVsLnN0eWxlW2tdID0gdjtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpbml0UHJvdmlkZXJIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGxldCBfID0gKGxhYmVsKSA9PiBgcHJvdmlkZXI6JHtsYWJlbH1gO1xuICAgIGxldCB0aGVtZWQgPSBmYWxzZTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd0aGVtZScpLCAodGhlbWUpID0+IHtcbiAgICAgICAgcGx1Z2luTG9jYWwudGhlbWVNZ3IucmVnaXN0ZXJUaGVtZShwbHVnaW5Mb2NhbC5pZCwgdGhlbWUpO1xuICAgICAgICBpZiAoIXRoZW1lZCkge1xuICAgICAgICAgICAgcGx1Z2luTG9jYWwuX2Rpc3Bvc2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBsdWdpbkxvY2FsLnRoZW1lTWdyLnVucmVnaXN0ZXJUaGVtZShwbHVnaW5Mb2NhbC5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoZW1lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCdzdHlsZScpLCAoc3R5bGUpID0+IHtcbiAgICAgICAgbGV0IGtleTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGtleSA9IHN0eWxlLmtleTtcbiAgICAgICAgICAgIHN0eWxlID0gc3R5bGUuc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdHlsZSB8fCAhc3R5bGUudHJpbSgpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBwbHVnaW5Mb2NhbC5fZGlzcG9zZShzZXR1cEluamVjdGVkU3R5bGUoc3R5bGUsIHtcbiAgICAgICAgICAgICdkYXRhLWluamVjdGVkLXN0eWxlJzoga2V5ID8gYCR7a2V5fS0ke3BsdWdpbkxvY2FsLmlkfWAgOiAnJyxcbiAgICAgICAgICAgICdkYXRhLXJlZic6IHBsdWdpbkxvY2FsLmlkXG4gICAgICAgIH0pKTtcbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd1aScpLCAodWkpID0+IHtcbiAgICAgICAgcGx1Z2luTG9jYWwuX29uSG9zdE1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gc2FmZSB0ZW1wbGF0ZVxuICAgICAgICAgICAgdWkudGVtcGxhdGUgPSBET01QdXJpZnkuc2FuaXRpemUodWkudGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgICBBRERfVEFHUzogWydpZnJhbWUnXSxcbiAgICAgICAgICAgICAgICBBTExPV19VTktOT1dOX1BST1RPQ09MUzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBBRERfQVRUUjogWydhbGxvdycsICdzcmMnLCAnYWxsb3dmdWxsc2NyZWVuJywgJ2ZyYW1lYm9yZGVyJywgJ3Njcm9sbGluZyddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBsdWdpbkxvY2FsLl9kaXNwb3NlKHNldHVwSW5qZWN0ZWRVSS5jYWxsKHBsdWdpbkxvY2FsLCB1aSwge1xuICAgICAgICAgICAgICAgICdkYXRhLXJlZic6IHBsdWdpbkxvY2FsLmlkXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaW5pdEFwaVByb3h5SGFuZGxlcnMocGx1Z2luTG9jYWwpIHtcbiAgICBsZXQgXyA9IChsYWJlbCkgPT4gYGFwaToke2xhYmVsfWA7XG4gICAgcGx1Z2luTG9jYWwub24oXygnY2FsbCcpLCBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICBsZXQgcmV0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0ID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKHBheWxvYWQubWV0aG9kLCAuLi5wYXlsb2FkLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXQgPSB7XG4gICAgICAgICAgICAgICAgW0xTUE1TR19FUlJPUl9UQUddOiBlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IF9zeW5jIH0gPSBwYXlsb2FkO1xuICAgICAgICBpZiAocGx1Z2luTG9jYWwuc2hhZG93KSB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5hY3Rvcikge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0b3IucmVzb2x2ZShyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfc3luYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByZXBseSA9IChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBwbHVnaW5Mb2NhbC5jYWxsZXI/LmNhbGxVc2VyTW9kZWwoTFNQTVNHX1NZTkMsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBfc3luY1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXQpLnRoZW4ocmVwbHksIHJlcGx5KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gY29udmVydFRvTFNQUmVzb3VyY2UoZnVsbFVybCwgZG90UGx1Z2luUm9vdCkge1xuICAgIGlmIChkb3RQbHVnaW5Sb290ICYmXG4gICAgICAgIGZ1bGxVcmwuc3RhcnRzV2l0aChQUk9UT0NPTF9GSUxFICsgZG90UGx1Z2luUm9vdCkpIHtcbiAgICAgICAgZnVsbFVybCA9IHNhZmV0eVBhdGhKb2luKFVSTF9MU1AsIGZ1bGxVcmwuc3Vic3RyKFBST1RPQ09MX0ZJTEUubGVuZ3RoICsgZG90UGx1Z2luUm9vdC5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxVcmw7XG59XG5jbGFzcyBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IElsbGVnYWxQbHVnaW5QYWNrYWdlRXJyb3IubmFtZTtcbiAgICB9XG59XG5jbGFzcyBFeGlzdGVkSW1wb3J0ZWRQbHVnaW5QYWNrYWdlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yLm5hbWU7XG4gICAgfVxufVxuLyoqXG4gKiBIb3N0IHBsdWdpbiBmb3IgbG9jYWxcbiAqL1xuY2xhc3MgUGx1Z2luTG9jYWwgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIF9vcHRpb25zO1xuICAgIF90aGVtZU1ncjtcbiAgICBfY3R4O1xuICAgIF9kaXNwb3NlcyA9IFtdO1xuICAgIF9pZDtcbiAgICBfc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLlVOTE9BREVEO1xuICAgIF9sb2FkRXJyO1xuICAgIF9sb2NhbFJvb3Q7XG4gICAgX2RvdFNldHRpbmdzRmlsZTtcbiAgICBfY2FsbGVyO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBfb3B0aW9uc1xuICAgICAqIEBwYXJhbSBfdGhlbWVNZ3JcbiAgICAgKiBAcGFyYW0gX2N0eFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zLCBfdGhlbWVNZ3IsIF9jdHgpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLl90aGVtZU1nciA9IF90aGVtZU1ncjtcbiAgICAgICAgdGhpcy5fY3R4ID0gX2N0eDtcbiAgICAgICAgdGhpcy5faWQgPSBfb3B0aW9ucy5rZXkgfHwgZ2VuSUQoKTtcbiAgICAgICAgaW5pdFVzZXJTZXR0aW5nc0hhbmRsZXJzKHRoaXMpO1xuICAgICAgICBpbml0TWFpblVJSGFuZGxlcnModGhpcyk7XG4gICAgICAgIGluaXRQcm92aWRlckhhbmRsZXJzKHRoaXMpO1xuICAgICAgICBpbml0QXBpUHJveHlIYW5kbGVycyh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgX3NldHVwVXNlclNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCB7IF9vcHRpb25zIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBfb3B0aW9ucy5sb2dnZXIgPSBuZXcgUGx1Z2luTG9nZ2VyKCdMb2FkZXInKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IFt1c2VyU2V0dGluZ3NGaWxlUGF0aCwgdXNlclNldHRpbmdzXSA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSgnbG9hZF9wbHVnaW5fdXNlcl9zZXR0aW5ncycsIHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5fZG90U2V0dGluZ3NGaWxlID0gdXNlclNldHRpbmdzRmlsZVBhdGg7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IF9vcHRpb25zLnNldHRpbmdzID0gbmV3IFBsdWdpblNldHRpbmdzKHVzZXJTZXR0aW5ncyk7XG4gICAgICAgICAgICAvLyBvYnNlcnZlIHNldHRpbmdzXG4gICAgICAgICAgICBzZXR0aW5ncy5vbignY2hhbmdlJywgKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnbGlua2VkIHNldHRpbmdzIGNoYW5nZScsIGEpO1xuICAgICAgICAgICAgICAgIGlmICghYS5kaXNhYmxlZCAmJiBiLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBwbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhLmRpc2FibGVkICYmICFiLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgcGx1Z2luXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGludm9rZUhvc3RFeHBvcnRlZEFwaShgc2F2ZV9wbHVnaW5fdXNlcl9zZXR0aW5nc2AsIHRoaXMuaWQsIGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW2xvYWQgcGx1Z2luIHVzZXIgc2V0dGluZ3MgRXJyb3JdJywgZSk7XG4gICAgICAgICAgICBsb2dnZXI/LmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldE1haW5VSSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsZXI/Ll9nZXRTYW5kYm94U2hhZG93Q29udGFpbmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGVyPy5fZ2V0U2FuZGJveElmcmFtZUNvbnRhaW5lcigpO1xuICAgIH1cbiAgICBfcmVzb2x2ZVJlc291cmNlRnVsbFVybChmaWxlUGF0aCwgbG9jYWxSb290KSB7XG4gICAgICAgIGlmICghZmlsZVBhdGg/LnRyaW0oKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbG9jYWxSb290ID0gbG9jYWxSb290IHx8IHRoaXMuX2xvY2FsUm9vdDtcbiAgICAgICAgY29uc3QgcmVnID0gL14oaHR0cHxmaWxlKS87XG4gICAgICAgIGlmICghcmVnLnRlc3QoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBwYXRoLmpvaW4obG9jYWxSb290LCBmaWxlUGF0aCk7XG4gICAgICAgICAgICBmaWxlUGF0aCA9IHJlZy50ZXN0KHVybCkgPyB1cmwgOiAoUFJPVE9DT0xfRklMRSArIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICghdGhpcy5vcHRpb25zLmVmZmVjdCAmJiB0aGlzLmlzSW5zdGFsbGVkSW5Eb3RSb290KSA/XG4gICAgICAgICAgICBjb252ZXJ0VG9MU1BSZXNvdXJjZShmaWxlUGF0aCwgdGhpcy5kb3RQbHVnaW5zUm9vdCkgOiBmaWxlUGF0aDtcbiAgICB9XG4gICAgYXN5bmMgX3ByZXBhcmVQYWNrYWdlQ29uZmlncygpIHtcbiAgICAgICAgY29uc3QgeyB1cmwgfSA9IHRoaXMuX29wdGlvbnM7XG4gICAgICAgIGxldCBwa2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCByZXNvbHZlIHBhY2thZ2UgY29uZmlnIGxvY2F0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1ZygncHJlcGFyZSBwYWNrYWdlIHJvb3QnLCB1cmwpO1xuICAgICAgICAgICAgcGtnID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdsb2FkX3BsdWdpbl9jb25maWcnLCB1cmwpO1xuICAgICAgICAgICAgaWYgKCFwa2cgfHwgKHBrZyA9IEpTT04ucGFyc2UocGtnKSwgIXBrZykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcnNlIHBhY2thZ2UgY29uZmlnIGVycm9yICMke3VybH0vcGFja2FnZS5qc29uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGljayBsZWdhbCBhdHRyc1xuICAgICAgICBbJ25hbWUnLCAnYXV0aG9yJywgJ3JlcG9zaXRvcnknLCAndmVyc2lvbicsXG4gICAgICAgICAgICAnZGVzY3JpcHRpb24nLCAncmVwbycsICd0aXRsZScsICdlZmZlY3QnXG4gICAgICAgIF0uZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNba10gPSBwa2dba107XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBsb2NhbFJvb3QgPSB0aGlzLl9sb2NhbFJvb3QgPSBzYWZldHlQYXRoTm9ybWFsaXplKHVybCk7XG4gICAgICAgIGNvbnN0IGxvZ3NlcSA9IHBrZy5sb2dzZXEgfHwge307XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlTWFpbiA9IChtYWluKSA9PiBtYWluICYmIC9cXC4oanN8aHRtbCkkLy50ZXN0KG1haW4pO1xuICAgICAgICAvLyBFbnRyeSBmcm9tIG1haW5cbiAgICAgICAgaWYgKHZhbGlkYXRlTWFpbihwa2cubWFpbikpIHsgLy8gVGhlbWUgaGFzIG5vIG1haW5cbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuZW50cnkgPSB0aGlzLl9yZXNvbHZlUmVzb3VyY2VGdWxsVXJsKHBrZy5tYWluLCBsb2NhbFJvb3QpO1xuICAgICAgICAgICAgaWYgKGxvZ3NlcS5tb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5tb2RlID0gbG9nc2VxLm1vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGl0bGUgPSBsb2dzZXEudGl0bGUgfHwgcGtnLnRpdGxlO1xuICAgICAgICBjb25zdCBpY29uID0gbG9nc2VxLmljb24gfHwgcGtnLmljb247XG4gICAgICAgIHRoaXMuX29wdGlvbnMudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy5pY29uID0gaWNvbiAmJlxuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZVJlc291cmNlRnVsbFVybChpY29uKTtcbiAgICAgICAgLy8gVE9ETzogc3RyYXRlZ3kgZm9yIExvZ3NlcSBwbHVnaW5zIGNlbnRlclxuICAgICAgICBpZiAodGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCkge1xuICAgICAgICAgICAgdGhpcy5faWQgPSBwYXRoLmJhc2VuYW1lKGxvY2FsUm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobG9nc2VxLmlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faWQgPSBsb2dzZXEuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dzZXEuaWQgPSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSgnc2F2ZV9wbHVnaW5fY29uZmlnJywgdXJsLCB7IC4uLnBrZywgbG9nc2VxIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnW3NhdmUgcGx1Z2luIElEIEVycm9yXSAnLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgaWRcbiAgICAgICAgY29uc3QgeyByZWdpc3RlcmVkUGx1Z2lucywgaXNSZWdpc3RlcmluZyB9ID0gdGhpcy5fY3R4O1xuICAgICAgICBpZiAoaXNSZWdpc3RlcmluZyAmJiByZWdpc3RlcmVkUGx1Z2lucy5oYXMobG9nc2VxLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvcigncHJlcGFyZSBwYWNrYWdlIEVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gMC4gSW5zdGFsbCBUaGVtZXNcbiAgICAgICAgICAgICAgICBsZXQgdGhlbWVzID0gbG9nc2VxLnRoZW1lcztcbiAgICAgICAgICAgICAgICBpZiAodGhlbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2xvYWRDb25maWdUaGVtZXMoQXJyYXkuaXNBcnJheSh0aGVtZXMpID8gdGhlbWVzIDogW3RoZW1lc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ1twcmVwYXJlIHBhY2thZ2UgZWZmZWN0IEVycm9yXScsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyBfdHJ5VG9Ob3JtYWxpemVFbnRyeSgpIHtcbiAgICAgICAgbGV0IHsgZW50cnksIHNldHRpbmdzIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGxldCBkZXZFbnRyeSA9IHNldHRpbmdzPy5nZXQoJ19kZXZFbnRyeScpO1xuICAgICAgICBpZiAoZGV2RW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuZW50cnkgPSBkZXZFbnRyeTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudHJ5LmVuZHNXaXRoKCcuanMnKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IGRpclBhdGhJbnN0YWxsZWQgPSBudWxsO1xuICAgICAgICBsZXQgdG1wX2ZpbGVfbWV0aG9kID0gJ3dyaXRlX3VzZXJfdG1wX2ZpbGUnO1xuICAgICAgICBpZiAodGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCkge1xuICAgICAgICAgICAgdG1wX2ZpbGVfbWV0aG9kID0gJ3dyaXRlX2RvdGRpcl9maWxlJztcbiAgICAgICAgICAgIGRpclBhdGhJbnN0YWxsZWQgPSB0aGlzLl9sb2NhbFJvb3QucmVwbGFjZSh0aGlzLmRvdFBsdWdpbnNSb290LCAnJyk7XG4gICAgICAgICAgICBkaXJQYXRoSW5zdGFsbGVkID0gcGF0aC5qb2luKERJUl9QTFVHSU5TLCBkaXJQYXRoSW5zdGFsbGVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2RrUGF0aFJvb3QgPSBhd2FpdCBnZXRTREtQYXRoUm9vdCgpO1xuICAgICAgICBsZXQgZW50cnlQYXRoID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKHRtcF9maWxlX21ldGhvZCwgYCR7dGhpcy5faWR9X2luZGV4Lmh0bWxgLCBgPCFkb2N0eXBlIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCI+XG4gICAgPHRpdGxlPmxvZ3NlcSBwbHVnaW4gZW50cnk8L3RpdGxlPlxuICAgIDxzY3JpcHQgc3JjPVwiJHtzZGtQYXRoUm9vdH0vbHNwbHVnaW4udXNlci5qc1wiPjwvc2NyaXB0PlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICA8ZGl2IGlkPVwiYXBwXCI+PC9kaXY+XG4gIDxzY3JpcHQgc3JjPVwiJHtlbnRyeX1cIj48L3NjcmlwdD5cbiAgPC9ib2R5PlxuPC9odG1sPmAsIGRpclBhdGhJbnN0YWxsZWQpO1xuICAgICAgICBlbnRyeSA9IGNvbnZlcnRUb0xTUFJlc291cmNlKHdpdGhGaWxlUHJvdG9jb2wocGF0aC5ub3JtYWxpemUoZW50cnlQYXRoKSksIHRoaXMuZG90UGx1Z2luc1Jvb3QpO1xuICAgICAgICB0aGlzLl9vcHRpb25zLmVudHJ5ID0gZW50cnk7XG4gICAgfVxuICAgIGFzeW5jIF9sb2FkQ29uZmlnVGhlbWVzKHRoZW1lcykge1xuICAgICAgICB0aGVtZXMuZm9yRWFjaCgob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSAmJiB0aGlzLl9sb2NhbFJvb3QpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IHBhdGguam9pbih0aGlzLl9sb2NhbFJvb3QsIG9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgICAgICAvLyBmaWxlOi8vIGZvciBuYXRpdmVcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6JykpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSAnYXNzZXRzOi8vJyArIG9wdGlvbnMudXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncHJvdmlkZXI6dGhlbWUnLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQocmVhZHlJbmRpY2F0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5MT0FESU5HO1xuICAgICAgICB0aGlzLl9sb2FkRXJyID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gaWYgKCF0aGlzLm9wdGlvbnMuZW50cnkpIHsgLy8gVGhlbWVzIHBhY2thZ2Ugbm8gZW50cnkgZmllbGRcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGxldCBpbnN0YWxsUGFja2FnZVRoZW1lcyA9IGF3YWl0IHRoaXMuX3ByZXBhcmVQYWNrYWdlQ29uZmlncygpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0dXBVc2VyU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGluc3RhbGxQYWNrYWdlVGhlbWVzLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5vcHRpb25zLmVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fdHJ5VG9Ob3JtYWxpemVFbnRyeSgpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGVyID0gbmV3IExTUGx1Z2luQ2FsbGVyKHRoaXMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2FsbGVyLmNvbm5lY3RUb0NoaWxkKCk7XG4gICAgICAgICAgICBjb25zdCByZWFkeUZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0dfUkVBRFkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZWFkeUluZGljYXRvcikge1xuICAgICAgICAgICAgICAgIHJlYWR5SW5kaWNhdG9yLnByb21pc2UudGhlbihyZWFkeUZuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlYWR5Rm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGxlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbTG9hZCBQbHVnaW4gRXJyb3JdICcsIGUpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXI/LmVycm9yKGUpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLkVSUk9SO1xuICAgICAgICAgICAgdGhpcy5fbG9hZEVyciA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2xvYWRFcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FERUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BREVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWxvYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jdHguZW1pdCgnYmVmb3JlcmVsb2FkJywgdGhpcyk7XG4gICAgICAgIGF3YWl0IHRoaXMudW5sb2FkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgICAgICB0aGlzLl9jdHguZW1pdCgncmVsb2FkZWQnLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHVucmVnaXN0ZXIgSWYgdHJ1ZSBkZWxldGUgcGx1Z2luIGZpbGVzXG4gICAgICovXG4gICAgYXN5bmMgdW5sb2FkKHVucmVnaXN0ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVucmVnaXN0ZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5lbWl0KCd1bmxpbmstcGx1Z2luJywgdGhpcy5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURJTkc7XG4gICAgICAgICAgICBjb25zdCBldmVudEJlZm9yZVVubG9hZCA9IHsgdW5yZWdpc3RlciB9O1xuICAgICAgICAgICAgLy8gc3luYyBjYWxsXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGxlcj8uY2FsbFVzZXJNb2RlbChBV0FJVF9MU1BNU0dGbihMU1BNU0dfQkVGT1JFX1VOTE9BRCksIGV2ZW50QmVmb3JlVW5sb2FkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZXVubG9hZCcsIGV2ZW50QmVmb3JlVW5sb2FkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2JlZm9yZXVubG9hZCBFcnJvcl0nLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1bmxvYWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW3BsdWdpbiB1bmxvYWQgRXJyb3JdJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FERUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZGlzcG9zZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLl9kaXNwb3Nlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmbiAmJiAoYXdhaXQgZm4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5kZWJ1Z1RhZywgJ2Rpc3Bvc2UgRXJyb3InLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhclxuICAgICAgICB0aGlzLl9kaXNwb3NlcyA9IFtdO1xuICAgIH1cbiAgICBfZGlzcG9zZShmbikge1xuICAgICAgICBpZiAoIWZuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9kaXNwb3Nlcy5wdXNoKGZuKTtcbiAgICB9XG4gICAgX29uSG9zdE1vdW50ZWQoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgYWN0b3IgPSB0aGlzLl9jdHguaG9zdE1vdW50ZWRBY3RvcjtcbiAgICAgICAgaWYgKCFhY3RvciB8fCBhY3Rvci5zZXR0bGVkKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWN0b3I/LnByb21pc2UudGhlbihjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzSW5zdGFsbGVkSW5Eb3RSb290KCkge1xuICAgICAgICBjb25zdCBkb3RSb290ID0gdGhpcy5kb3RDb25maWdSb290O1xuICAgICAgICBjb25zdCBwbGdSb290ID0gdGhpcy5sb2NhbFJvb3Q7XG4gICAgICAgIHJldHVybiBkb3RSb290ICYmIHBsZ1Jvb3QgJiYgcGxnUm9vdC5zdGFydHNXaXRoKGRvdFJvb3QpO1xuICAgIH1cbiAgICBnZXQgbG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzID09PSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BREVEO1xuICAgIH1cbiAgICBnZXQgcGVuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIFtQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BRElORywgUGx1Z2luTG9jYWxMb2FkU3RhdHVzLlVOTE9BRElOR11cbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLl9zdGF0dXMpO1xuICAgIH1cbiAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBsb2dnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9nZ2VyO1xuICAgIH1cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5nZXQoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICAgIGdldCBjYWxsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsZXI7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cbiAgICBnZXQgc2hhZG93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1vZGUgPT09ICdzaGFkb3cnO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIGdldCB0aGVtZU1ncigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RoZW1lTWdyO1xuICAgIH1cbiAgICBnZXQgZGVidWdUYWcoKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9vcHRpb25zPy5uYW1lO1xuICAgICAgICByZXR1cm4gYCMke3RoaXMuX2lkfSAke25hbWUgPz8gJyd9YDtcbiAgICB9XG4gICAgZ2V0IGxvY2FsUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9vcHRpb25zLnVybDtcbiAgICB9XG4gICAgZ2V0IGxvYWRFcnIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkRXJyO1xuICAgIH1cbiAgICBnZXQgZG90Q29uZmlnUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGgubm9ybWFsaXplKHRoaXMuX2N0eC5vcHRpb25zLmRvdENvbmZpZ1Jvb3QpO1xuICAgIH1cbiAgICBnZXQgZG90U2V0dGluZ3NGaWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG90U2V0dGluZ3NGaWxlO1xuICAgIH1cbiAgICBnZXQgZG90UGx1Z2luc1Jvb3QoKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kb3RDb25maWdSb290LCBESVJfUExVR0lOUyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHsgLi4udGhpcy5vcHRpb25zIH07XG4gICAgICAgIGpzb24uaWQgPSB0aGlzLmlkO1xuICAgICAgICBqc29uLmVyciA9IHRoaXMubG9hZEVycjtcbiAgICAgICAganNvbi51c2YgPSB0aGlzLmRvdFNldHRpbmdzRmlsZTtcbiAgICAgICAganNvbi5paXIgPSB0aGlzLmlzSW5zdGFsbGVkSW5Eb3RSb290O1xuICAgICAgICBqc29uLmxzciA9IHRoaXMuX3Jlc29sdmVSZXNvdXJjZUZ1bGxVcmwoJycpO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG59XG4vKipcbiAqIEhvc3QgcGx1Z2luIGNvcmVcbiAqL1xuY2xhc3MgTFNQbHVnaW5Db3JlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfb3B0aW9ucztcbiAgICBfaXNSZWdpc3RlcmluZyA9IGZhbHNlO1xuICAgIF9yZWFkeUluZGljYXRvcjtcbiAgICBfaG9zdE1vdW50ZWRBY3RvciA9IGRlZmVycmVkKCk7XG4gICAgX3VzZXJQcmVmZXJlbmNlcyA9IHt9O1xuICAgIF9yZWdpc3RlcmVkVGhlbWVzID0gbmV3IE1hcCgpO1xuICAgIF9yZWdpc3RlcmVkUGx1Z2lucyA9IG5ldyBNYXAoKTtcbiAgICBfY3VycmVudFRoZW1lO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBfb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICB9XG4gICAgYXN5bmMgbG9hZFVzZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKGBsb2FkX3VzZXJfcHJlZmVyZW5jZXNgKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlclByZWZlcmVuY2VzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbbG9hZCB1c2VyIHByZWZlcmVuY2VzIEVycm9yXScsIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNhdmVVc2VyUHJlZmVyZW5jZXMoc2V0dGluZ3MpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlclByZWZlcmVuY2VzLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoYHNhdmVfdXNlcl9wcmVmZXJlbmNlc2AsIHRoaXMuX3VzZXJQcmVmZXJlbmNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbc2F2ZSB1c2VyIHByZWZlcmVuY2VzIEVycm9yXScsIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGFjdGl2YXRlVXNlclByZWZlcmVuY2VzKCkge1xuICAgICAgICBjb25zdCB7IHRoZW1lIH0gPSB0aGlzLl91c2VyUHJlZmVyZW5jZXM7XG4gICAgICAgIC8vIDAuIHRoZW1lXG4gICAgICAgIGlmICh0aGVtZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RUaGVtZSh0aGVtZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwbHVnaW5zXG4gICAgICogQHBhcmFtIGluaXRpYWxcbiAgICAgKi9cbiAgICBhc3luYyByZWdpc3RlcihwbHVnaW5zLCBpbml0aWFsID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyKFtwbHVnaW5zXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGVyZlRhYmxlID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBkZWJ1Z1BlcmZJbmZvID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEFycmF5LmZyb20ocGVyZlRhYmxlLnZhbHVlcygpKS5yZWR1Y2UoKGFjLCBpdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgb3B0aW9ucywgc3RhdHVzLCBkaXNhYmxlZCB9ID0gaXQubztcbiAgICAgICAgICAgICAgICBhY1tpdC5vLmlkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBlbnRyeTogb3B0aW9ucy5lbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHR5cGVvZiBkaXNhYmxlZCA9PT0gJ2Jvb2xlYW4nID8gKCFkaXNhYmxlZCA/ICfwn5+iJyA6ICfimqvvuI8nKSA6ICfwn5S0JyxcbiAgICAgICAgICAgICAgICAgICAgcGVyZjogIWl0LmUgPyBpdC5vLmxvYWRFcnIgOiBgJHsoaXQuZSAtIGl0LnMpLnRvRml4ZWQoMil9bXNgXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5fX2RlYnVnUGx1Z2luc1BlcmZJbmZvID0gZGVidWdQZXJmSW5mbztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVnaXN0ZXJpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdXNlckNvbmZpZ1Jvb3QgPSB0aGlzLl9vcHRpb25zLmRvdENvbmZpZ1Jvb3Q7XG4gICAgICAgICAgICBjb25zdCByZWFkeUluZGljYXRvciA9IHRoaXMuX3JlYWR5SW5kaWNhdG9yID0gZGVmZXJyZWQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFVzZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICAgICAgY29uc3QgZXh0ZXJuYWxzID0gbmV3IFNldCh0aGlzLl91c2VyUHJlZmVyZW5jZXMuZXh0ZXJuYWxzIHx8IFtdKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2lucyA9IHBsdWdpbnMuY29uY2F0KFsuLi5leHRlcm5hbHNdLmZpbHRlcih1cmwgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXBsdWdpbnMubGVuZ3RoIHx8IHBsdWdpbnMuZXZlcnkoKHApID0+ICFwLmVudHJ5ICYmIChwLnVybCAhPT0gdXJsKSk7XG4gICAgICAgICAgICAgICAgfSkubWFwKHVybCA9PiAoeyB1cmwgfSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luT3B0aW9ucyBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IHBsdWdpbk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luTG9jYWwgPSBuZXcgUGx1Z2luTG9jYWwocGx1Z2luT3B0aW9ucywgdGhpcywgdGhpcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZkluZm8gPSB7IG86IHBsdWdpbkxvY2FsLCBzOiBwZXJmb3JtYW5jZS5ub3coKSwgZTogMCB9O1xuICAgICAgICAgICAgICAgIHBlcmZUYWJsZS5zZXQocGx1Z2luTG9jYWwuaWQsIHBlcmZJbmZvKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBwbHVnaW5Mb2NhbC5sb2FkKHJlYWR5SW5kaWNhdG9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGxvYWRFcnIgfSA9IHBsdWdpbkxvY2FsO1xuICAgICAgICAgICAgICAgIGlmIChsb2FkRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbRmFpbGVkIExPQUQgUGx1Z2luXSAjYCwgcGx1Z2luT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBsb2FkRXJyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRFcnIgaW5zdGFuY2VvZiBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkRXJyIGluc3RhbmNlb2YgRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkgZ2xvYmFsIGxvZyBzeXN0ZW0/XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwZXJmSW5mby5lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuc2V0dGluZ3M/Lm9uKCdjaGFuZ2UnLCAoYSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NldHRpbmdzLWNoYW5nZWQnLCBwbHVnaW5Mb2NhbC5pZCwgYSk7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbkxvY2FsLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0dfU0VUVElOR1MsIHsgcGF5bG9hZDogYSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucy5zZXQocGx1Z2luTG9jYWwuaWQsIHBsdWdpbkxvY2FsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCBwbHVnaW5Mb2NhbCk7XG4gICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgcGx1Z2luc1xuICAgICAgICAgICAgICAgIGlmICghcGx1Z2luTG9jYWwuaXNJbnN0YWxsZWRJbkRvdFJvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxzLmFkZCh1cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVVzZXJQcmVmZXJlbmNlcyh7IGV4dGVybmFsczogQXJyYXkuZnJvbShleHRlcm5hbHMpIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZVVzZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICAgICAgcmVhZHlJbmRpY2F0b3IucmVzb2x2ZSgncmVhZHknKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVnaXN0ZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRlYnVnUGVyZkluZm8oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWxvYWQocGx1Z2lucykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGx1Z2lucykpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkKFtwbHVnaW5zXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuc3VyZVBsdWdpbihpZGVudGl0eSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcC5yZWxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgdW5yZWdpc3RlcihwbHVnaW5zKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwbHVnaW5zKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51bnJlZ2lzdGVyKFtwbHVnaW5zXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdW5yZWdpc3RlcmVkRXh0ZXJuYWxzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5zdXJlUGx1Z2luKGlkZW50aXR5KTtcbiAgICAgICAgICAgIGlmICghcC5pc0luc3RhbGxlZEluRG90Um9vdCkge1xuICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJlZEV4dGVybmFscy5wdXNoKHAub3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgcC51bmxvYWQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucy5kZWxldGUoaWRlbnRpdHkpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1bnJlZ2lzdGVyZWQnLCBpZGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4dGVybmFscyA9IHRoaXMuX3VzZXJQcmVmZXJlbmNlcy5leHRlcm5hbHMgfHwgW107XG4gICAgICAgIGlmIChleHRlcm5hbHMubGVuZ3RoICYmIHVucmVnaXN0ZXJlZEV4dGVybmFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVVzZXJQcmVmZXJlbmNlcyh7XG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxzOiBleHRlcm5hbHMuZmlsdGVyKChpdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXVucmVnaXN0ZXJlZEV4dGVybmFscy5pbmNsdWRlcyhpdCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGVuYWJsZShwbHVnaW4pIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5zdXJlUGx1Z2luKHBsdWdpbik7XG4gICAgICAgIGlmIChwLnBlbmRpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuZW1pdCgnYmVmb3JlZW5hYmxlJyk7XG4gICAgICAgIHAuc2V0dGluZ3M/LnNldCgnZGlzYWJsZWQnLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZW1pdCgnZW5hYmxlZCcsIHAuaWQpO1xuICAgIH1cbiAgICBhc3luYyBkaXNhYmxlKHBsdWdpbikge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5lbnN1cmVQbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgaWYgKHAucGVuZGluZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5lbWl0KCdiZWZvcmVkaXNhYmxlJyk7XG4gICAgICAgIHAuc2V0dGluZ3M/LnNldCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgdGhpcy5lbWl0KCdkaXNhYmxlZCcsIHAuaWQpO1xuICAgIH1cbiAgICBhc3luYyBfaG9vayhucywgdHlwZSwgcGF5bG9hZCwgcGlkKSB7XG4gICAgICAgIGZvciAoY29uc3QgW18sIHBdIG9mIHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zKSB7XG4gICAgICAgICAgICBpZiAoIXBpZCB8fCBwaWQgPT09IHAuaWQpIHtcbiAgICAgICAgICAgICAgICBwLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0csIHtcbiAgICAgICAgICAgICAgICAgICAgbnMsIHR5cGU6IHNuYWtlQ2FzZSh0eXBlKSwgcGF5bG9hZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGhvb2tBcHAodHlwZSwgcGF5bG9hZCwgcGlkKSB7XG4gICAgICAgIHRoaXMuX2hvb2soYGhvb2s6YXBwYCwgdHlwZSwgcGF5bG9hZCwgcGlkKTtcbiAgICB9XG4gICAgaG9va0VkaXRvcih0eXBlLCBwYXlsb2FkLCBwaWQpIHtcbiAgICAgICAgdGhpcy5faG9vayhgaG9vazplZGl0b3JgLCB0eXBlLCBwYXlsb2FkLCBwaWQpO1xuICAgIH1cbiAgICBfZXhlY0RpcmVjdGl2ZSh0YWcsIC4uLnBhcmFtcykge1xuICAgIH1cbiAgICBlbnN1cmVQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIGlmIChwbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW5Mb2NhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnMuZ2V0KHBsdWdpbik7XG4gICAgICAgIGlmICghcCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwbHVnaW4gIyR7cGx1Z2lufSBub3QgZXhpc3RlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgaG9zdE1vdW50ZWQoKSB7XG4gICAgICAgIHRoaXMuX2hvc3RNb3VudGVkQWN0b3IucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBnZXQgcmVnaXN0ZXJlZFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICAgIH1cbiAgICBnZXQgcmVhZHlJbmRpY2F0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkeUluZGljYXRvcjtcbiAgICB9XG4gICAgZ2V0IGhvc3RNb3VudGVkQWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ob3N0TW91bnRlZEFjdG9yO1xuICAgIH1cbiAgICBnZXQgaXNSZWdpc3RlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmVnaXN0ZXJpbmc7XG4gICAgfVxuICAgIGdldCB0aGVtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkVGhlbWVzO1xuICAgIH1cbiAgICBhc3luYyByZWdpc3RlclRoZW1lKGlkLCBvcHQpIHtcbiAgICAgICAgZGVidWcoJ3JlZ2lzdGVyZWQgVGhlbWUgIycsIGlkLCBvcHQpO1xuICAgICAgICBpZiAoIWlkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdGhlbWVzID0gdGhpcy5fcmVnaXN0ZXJlZFRoZW1lcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIXRoZW1lcykge1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFRoZW1lcy5zZXQoaWQsIHRoZW1lcyA9IFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGVtZXMucHVzaChvcHQpO1xuICAgICAgICB0aGlzLmVtaXQoJ3RoZW1lLWNoYW5nZWQnLCB0aGlzLnRoZW1lcywgeyBpZCwgLi4ub3B0IH0pO1xuICAgIH1cbiAgICBhc3luYyBzZWxlY3RUaGVtZShvcHQsIGVmZmVjdCA9IHRydWUpIHtcbiAgICAgICAgLy8gY2xlYXIgY3VycmVudFxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGhlbWUuZGlzPy4oKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNJbmplY3RlZFRoZW1lID0gc2V0dXBJbmplY3RlZFRoZW1lKG9wdD8udXJsKTtcbiAgICAgICAgdGhpcy5lbWl0KCd0aGVtZS1zZWxlY3RlZCcsIG9wdCk7XG4gICAgICAgIGVmZmVjdCAmJiBhd2FpdCB0aGlzLnNhdmVVc2VyUHJlZmVyZW5jZXMoeyB0aGVtZTogb3B0Py51cmwgPyBvcHQgOiBudWxsIH0pO1xuICAgICAgICBpZiAob3B0Py51cmwpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaGVtZSA9IHtcbiAgICAgICAgICAgICAgICBkaXM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzSW5qZWN0ZWRUaGVtZSgpO1xuICAgICAgICAgICAgICAgICAgICBlZmZlY3QgJiYgdGhpcy5zYXZlVXNlclByZWZlcmVuY2VzKHsgdGhlbWU6IG51bGwgfSk7XG4gICAgICAgICAgICAgICAgfSwgb3B0LCBwaWQ6IG9wdC5waWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgdW5yZWdpc3RlclRoZW1lKGlkLCBlZmZlY3QgPSB0cnVlKSB7XG4gICAgICAgIGRlYnVnKCd1bnJlZ2lzdGVyZWQgVGhlbWUgIycsIGlkKTtcbiAgICAgICAgaWYgKCF0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLmhhcyhpZCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5lbWl0KCd0aGVtZS1jaGFuZ2VkJywgdGhpcy50aGVtZXMsIHsgaWQgfSk7XG4gICAgICAgIGlmIChlZmZlY3QgJiYgdGhpcy5fY3VycmVudFRoZW1lPy5waWQgPT0gaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaGVtZS5kaXM/LigpO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRoZW1lID0gbnVsbDtcbiAgICAgICAgICAgIC8vIHJlc2V0IGN1cnJlbnQgdGhlbWVcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndGhlbWUtc2VsZWN0ZWQnLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldHVwUGx1Z2luQ29yZShvcHRpb25zKSB7XG4gICAgY29uc3QgcGx1Z2luQ29yZSA9IG5ldyBMU1BsdWdpbkNvcmUob3B0aW9ucyk7XG4gICAgZGVidWcoJz09PSDwn5SXIFNldHVwIExvZ3NlcSBQbHVnaW4gU3lzdGVtIPCflJcgPT09Jyk7XG4gICAgd2luZG93LkxTUGx1Z2luQ29yZSA9IHBsdWdpbkNvcmU7XG59XG5leHBvcnQgeyBQbHVnaW5Mb2NhbCwgcGx1Z2luSGVscGVycywgc2V0dXBQbHVnaW5Db3JlIH07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsImZvcm1hdEFyZ3MiLCJhcmdzIiwidGhpcyIsInVzZUNvbG9ycyIsIm5hbWVzcGFjZSIsImh1bWFuaXplIiwiZGlmZiIsImMiLCJjb2xvciIsInNwbGljZSIsImluZGV4IiwibGFzdEMiLCJyZXBsYWNlIiwibWF0Y2giLCJzYXZlIiwibmFtZXNwYWNlcyIsInN0b3JhZ2UiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVycm9yIiwibG9hZCIsInIiLCJnZXRJdGVtIiwicHJvY2VzcyIsImVudiIsIkRFQlVHIiwid2luZG93IiwidHlwZSIsIl9fbndqcyIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsInRvTG93ZXJDYXNlIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzdHlsZSIsIldlYmtpdEFwcGVhcmFuY2UiLCJjb25zb2xlIiwiZmlyZWJ1ZyIsImV4Y2VwdGlvbiIsInRhYmxlIiwicGFyc2VJbnQiLCJSZWdFeHAiLCIkMSIsImxvY2FsU3RvcmFnZSIsImxvY2Fsc3RvcmFnZSIsImRlc3Ryb3kiLCJ3YXJuZWQiLCJ3YXJuIiwiY29sb3JzIiwibG9nIiwiZGVidWciLCJmb3JtYXR0ZXJzIiwiaiIsInYiLCJKU09OIiwic3RyaW5naWZ5IiwibWVzc2FnZSIsImNyZWF0ZURlYnVnIiwicHJldlRpbWUiLCJuYW1lc3BhY2VzQ2FjaGUiLCJlbmFibGVkQ2FjaGUiLCJlbmFibGVPdmVycmlkZSIsImVuYWJsZWQiLCJjdXJyIiwiTnVtYmVyIiwiRGF0ZSIsIm1zIiwicHJldiIsImNvZXJjZSIsInVuc2hpZnQiLCJmb3JtYXQiLCJmb3JtYXR0ZXIiLCJ2YWwiLCJjYWxsIiwiYXBwbHkiLCJzZWxlY3RDb2xvciIsImV4dGVuZCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsImdldCIsInNldCIsImluaXQiLCJkZWxpbWl0ZXIiLCJuZXdEZWJ1ZyIsInRvTmFtZXNwYWNlIiwicmVnZXhwIiwidG9TdHJpbmciLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJkZWZhdWx0IiwiRXJyb3IiLCJzdGFjayIsImRpc2FibGUiLCJuYW1lcyIsIm1hcCIsInNraXBzIiwiam9pbiIsImVuYWJsZSIsImkiLCJzcGxpdCIsImxlbiIsInB1c2giLCJzdWJzdHIiLCJuYW1lIiwidGVzdCIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwiaGFzaCIsImNoYXJDb2RlQXQiLCJNYXRoIiwiYWJzIiwiaGFzT3duUHJvcGVydHkiLCJzZXRQcm90b3R5cGVPZiIsImlzRnJvemVuIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJmcmVlemUiLCJzZWFsIiwiY3JlYXRlIiwiX3JlZiIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJmdW4iLCJ0aGlzVmFsdWUiLCJ4IiwiRnVuYyIsIkZ1bmN0aW9uIiwicHJvdG90eXBlIiwiYmluZCIsImNvbmNhdCIsImFyciIsIkFycmF5IiwiaXNBcnJheSIsImFycjIiLCJmcm9tIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiZnVuYyIsImFycmF5Rm9yRWFjaCIsInVuYXBwbHkiLCJhcnJheVBvcCIsInBvcCIsImFycmF5UHVzaCIsInN0cmluZ1RvTG93ZXJDYXNlIiwiU3RyaW5nIiwic3RyaW5nTWF0Y2giLCJzdHJpbmdSZXBsYWNlIiwic3RyaW5nSW5kZXhPZiIsImluZGV4T2YiLCJzdHJpbmdUcmltIiwidHJpbSIsInJlZ0V4cFRlc3QiLCJ0eXBlRXJyb3JDcmVhdGUiLCJUeXBlRXJyb3IiLCJfbGVuMiIsImFyZ3VtZW50cyIsIl9rZXkyIiwidGhpc0FyZyIsIl9sZW4iLCJfa2V5IiwiYWRkVG9TZXQiLCJhcnJheSIsImwiLCJlbGVtZW50IiwibGNFbGVtZW50IiwiY2xvbmUiLCJvYmplY3QiLCJuZXdPYmplY3QiLCJwcm9wZXJ0eSIsImxvb2t1cEdldHRlciIsInByb3AiLCJkZXNjIiwidmFsdWUiLCJodG1sIiwic3ZnIiwic3ZnRmlsdGVycyIsInN2Z0Rpc2FsbG93ZWQiLCJtYXRoTWwiLCJtYXRoTWxEaXNhbGxvd2VkIiwidGV4dCIsImh0bWwkMSIsInN2ZyQxIiwibWF0aE1sJDEiLCJ4bWwiLCJNVVNUQUNIRV9FWFBSIiwiRVJCX0VYUFIiLCJEQVRBX0FUVFIiLCJBUklBX0FUVFIiLCJJU19BTExPV0VEX1VSSSIsIklTX1NDUklQVF9PUl9EQVRBIiwiQVRUUl9XSElURVNQQUNFIiwiX3R5cGVvZiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwib2JqIiwiY29uc3RydWN0b3IiLCJfdG9Db25zdW1hYmxlQXJyYXkkMSIsImdldEdsb2JhbCIsIl9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kiLCJ0cnVzdGVkVHlwZXMiLCJjcmVhdGVQb2xpY3kiLCJzdWZmaXgiLCJBVFRSX05BTUUiLCJjdXJyZW50U2NyaXB0IiwiaGFzQXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwicG9saWN5TmFtZSIsImNyZWF0ZUhUTUwiLCJodG1sJCQxIiwiXyIsImNyZWF0ZURPTVB1cmlmeSIsInVuZGVmaW5lZCIsIkRPTVB1cmlmeSIsInZlcnNpb24iLCJyZW1vdmVkIiwibm9kZVR5cGUiLCJpc1N1cHBvcnRlZCIsIm9yaWdpbmFsRG9jdW1lbnQiLCJEb2N1bWVudEZyYWdtZW50IiwiSFRNTFRlbXBsYXRlRWxlbWVudCIsIk5vZGUiLCJFbGVtZW50IiwiTm9kZUZpbHRlciIsIl93aW5kb3ckTmFtZWROb2RlTWFwIiwiTmFtZWROb2RlTWFwIiwiTW96TmFtZWRBdHRyTWFwIiwiVGV4dCIsIkNvbW1lbnQiLCJET01QYXJzZXIiLCJFbGVtZW50UHJvdG90eXBlIiwiY2xvbmVOb2RlIiwiZ2V0TmV4dFNpYmxpbmciLCJnZXRDaGlsZE5vZGVzIiwiZ2V0UGFyZW50Tm9kZSIsInRlbXBsYXRlIiwiY3JlYXRlRWxlbWVudCIsImNvbnRlbnQiLCJvd25lckRvY3VtZW50IiwidHJ1c3RlZFR5cGVzUG9saWN5IiwiZW1wdHlIVE1MIiwiUkVUVVJOX1RSVVNURURfVFlQRSIsIl9kb2N1bWVudCIsImltcGxlbWVudGF0aW9uIiwiY3JlYXRlTm9kZUl0ZXJhdG9yIiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaW1wb3J0Tm9kZSIsImRvY3VtZW50TW9kZSIsImhvb2tzIiwiY3JlYXRlSFRNTERvY3VtZW50IiwiTVVTVEFDSEVfRVhQUiQkMSIsIkVSQl9FWFBSJCQxIiwiREFUQV9BVFRSJCQxIiwiQVJJQV9BVFRSJCQxIiwiSVNfU0NSSVBUX09SX0RBVEEkJDEiLCJBVFRSX1dISVRFU1BBQ0UkJDEiLCJJU19BTExPV0VEX1VSSSQkMSIsIkFMTE9XRURfVEFHUyIsIkRFRkFVTFRfQUxMT1dFRF9UQUdTIiwiQUxMT1dFRF9BVFRSIiwiREVGQVVMVF9BTExPV0VEX0FUVFIiLCJGT1JCSURfVEFHUyIsIkZPUkJJRF9BVFRSIiwiQUxMT1dfQVJJQV9BVFRSIiwiQUxMT1dfREFUQV9BVFRSIiwiQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMiLCJTQUZFX0ZPUl9URU1QTEFURVMiLCJXSE9MRV9ET0NVTUVOVCIsIlNFVF9DT05GSUciLCJGT1JDRV9CT0RZIiwiUkVUVVJOX0RPTSIsIlJFVFVSTl9ET01fRlJBR01FTlQiLCJSRVRVUk5fRE9NX0lNUE9SVCIsIlNBTklUSVpFX0RPTSIsIktFRVBfQ09OVEVOVCIsIklOX1BMQUNFIiwiVVNFX1BST0ZJTEVTIiwiRk9SQklEX0NPTlRFTlRTIiwiREVGQVVMVF9GT1JCSURfQ09OVEVOVFMiLCJEQVRBX1VSSV9UQUdTIiwiREVGQVVMVF9EQVRBX1VSSV9UQUdTIiwiVVJJX1NBRkVfQVRUUklCVVRFUyIsIkRFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyIsIk1BVEhNTF9OQU1FU1BBQ0UiLCJTVkdfTkFNRVNQQUNFIiwiSFRNTF9OQU1FU1BBQ0UiLCJOQU1FU1BBQ0UiLCJJU19FTVBUWV9JTlBVVCIsIkNPTkZJRyIsImZvcm1FbGVtZW50IiwiX3BhcnNlQ29uZmlnIiwiY2ZnIiwiQUREX1VSSV9TQUZFX0FUVFIiLCJBRERfREFUQV9VUklfVEFHUyIsIkFMTE9XRURfVVJJX1JFR0VYUCIsIkFERF9UQUdTIiwiQUREX0FUVFIiLCJ0Ym9keSIsIk1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UUyIsIkhUTUxfSU5URUdSQVRJT05fUE9JTlRTIiwiQUxMX1NWR19UQUdTIiwiQUxMX01BVEhNTF9UQUdTIiwiX2NoZWNrVmFsaWROYW1lc3BhY2UiLCJwYXJlbnQiLCJ0YWdOYW1lIiwibmFtZXNwYWNlVVJJIiwicGFyZW50VGFnTmFtZSIsIkJvb2xlYW4iLCJjb21tb25TdmdBbmRIVE1MRWxlbWVudHMiLCJfZm9yY2VSZW1vdmUiLCJub2RlIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwib3V0ZXJIVE1MIiwicmVtb3ZlIiwiX3JlbW92ZUF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZU5vZGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJfaW5pdERvY3VtZW50IiwiZGlydHkiLCJkb2MiLCJsZWFkaW5nV2hpdGVzcGFjZSIsIm1hdGNoZXMiLCJkaXJ0eVBheWxvYWQiLCJwYXJzZUZyb21TdHJpbmciLCJjcmVhdGVEb2N1bWVudCIsImlubmVySFRNTCIsImJvZHkiLCJpbnNlcnRCZWZvcmUiLCJjcmVhdGVUZXh0Tm9kZSIsImNoaWxkTm9kZXMiLCJfY3JlYXRlSXRlcmF0b3IiLCJTSE9XX0VMRU1FTlQiLCJTSE9XX0NPTU1FTlQiLCJTSE9XX1RFWFQiLCJfaXNDbG9iYmVyZWQiLCJlbG0iLCJub2RlTmFtZSIsInRleHRDb250ZW50IiwiYXR0cmlidXRlcyIsIl9pc05vZGUiLCJfZXhlY3V0ZUhvb2siLCJlbnRyeVBvaW50IiwiY3VycmVudE5vZGUiLCJkYXRhIiwiaG9vayIsIl9zYW5pdGl6ZUVsZW1lbnRzIiwiYWxsb3dlZFRhZ3MiLCJmaXJzdEVsZW1lbnRDaGlsZCIsIl9pc1ZhbGlkQXR0cmlidXRlIiwibGNUYWciLCJsY05hbWUiLCJfc2FuaXRpemVBdHRyaWJ1dGVzIiwiYXR0ciIsImhvb2tFdmVudCIsImF0dHJOYW1lIiwiYXR0clZhbHVlIiwia2VlcEF0dHIiLCJhbGxvd2VkQXR0cmlidXRlcyIsIl9hdHRyIiwiZm9yY2VLZWVwQXR0ciIsInNldEF0dHJpYnV0ZU5TIiwiX3Nhbml0aXplU2hhZG93RE9NIiwiZnJhZ21lbnQiLCJzaGFkb3dOb2RlIiwic2hhZG93SXRlcmF0b3IiLCJuZXh0Tm9kZSIsInNhbml0aXplIiwiaW1wb3J0ZWROb2RlIiwib2xkTm9kZSIsInJldHVybk5vZGUiLCJ0b1N0YXRpY0hUTUwiLCJhcHBlbmRDaGlsZCIsImZpcnN0Q2hpbGQiLCJub2RlSXRlcmF0b3IiLCJzZXJpYWxpemVkSFRNTCIsInNldENvbmZpZyIsImNsZWFyQ29uZmlnIiwiaXNWYWxpZEF0dHJpYnV0ZSIsInRhZyIsImFkZEhvb2siLCJob29rRnVuY3Rpb24iLCJyZW1vdmVIb29rIiwicmVtb3ZlSG9va3MiLCJyZW1vdmVBbGxIb29rcyIsImhhcyIsInByZWZpeCIsIkV2ZW50cyIsIkVFIiwiZm4iLCJjb250ZXh0Iiwib25jZSIsImFkZExpc3RlbmVyIiwiZW1pdHRlciIsImV2ZW50IiwibGlzdGVuZXIiLCJldnQiLCJfZXZlbnRzIiwiX2V2ZW50c0NvdW50IiwiY2xlYXJFdmVudCIsIkV2ZW50RW1pdHRlciIsIl9fcHJvdG9fXyIsImV2ZW50TmFtZXMiLCJldmVudHMiLCJzbGljZSIsImdldE93blByb3BlcnR5U3ltYm9scyIsImxpc3RlbmVycyIsImhhbmRsZXJzIiwiZWUiLCJsaXN0ZW5lckNvdW50IiwiZW1pdCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJyZW1vdmVMaXN0ZW5lciIsIm9uIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwib2ZmIiwicHJlZml4ZWQiLCJjdG9yIiwic3VwZXJDdG9yIiwic3VwZXJfIiwid3JpdGFibGUiLCJUZW1wQ3RvciIsInMiLCJtIiwiaCIsImQiLCJwbHVyYWwiLCJtc0FicyIsIm4iLCJpc1BsdXJhbCIsInJvdW5kIiwib3B0aW9ucyIsInN0ciIsImV4ZWMiLCJwYXJzZUZsb2F0IiwicGFyc2UiLCJpc0Zpbml0ZSIsImxvbmciLCJmbXRTaG9ydCIsImlzV2luZG93cyIsInBsYXRmb3JtIiwidXRpbCIsIm5vcm1hbGl6ZUFycmF5IiwicGFydHMiLCJhbGxvd0Fib3ZlUm9vdCIsInJlcyIsInAiLCJ0cmltQXJyYXkiLCJsYXN0SW5kZXgiLCJzdGFydCIsImVuZCIsInNwbGl0RGV2aWNlUmUiLCJzcGxpdFRhaWxSZSIsIndpbjMyIiwid2luMzJTcGxpdFBhdGgiLCJmaWxlbmFtZSIsInJlc3VsdCIsImRldmljZSIsInRhaWwiLCJyZXN1bHQyIiwid2luMzJTdGF0UGF0aCIsInBhdGgiLCJpc1VuYyIsImlzQWJzb2x1dGUiLCJub3JtYWxpemVVTkNSb290IiwicmVzb2x2ZSIsInJlc29sdmVkRGV2aWNlIiwicmVzb2x2ZWRUYWlsIiwicmVzb2x2ZWRBYnNvbHV0ZSIsImN3ZCIsImlzU3RyaW5nIiwibm9ybWFsaXplIiwidHJhaWxpbmdTbGFzaCIsInBhdGhzIiwiYXJnIiwiam9pbmVkIiwicmVsYXRpdmUiLCJ0byIsImxvd2VyRnJvbSIsImxvd2VyVG8iLCJ0b1BhcnRzIiwibG93ZXJGcm9tUGFydHMiLCJsb3dlclRvUGFydHMiLCJtaW4iLCJzYW1lUGFydHNMZW5ndGgiLCJvdXRwdXRQYXJ0cyIsIl9tYWtlTG9uZyIsInJlc29sdmVkUGF0aCIsImRpcm5hbWUiLCJkaXIiLCJiYXNlbmFtZSIsImV4dCIsImYiLCJleHRuYW1lIiwicGF0aE9iamVjdCIsImlzT2JqZWN0IiwiYmFzZSIsInNlcCIsInBhdGhTdHJpbmciLCJhbGxQYXJ0cyIsInNwbGl0UGF0aFJlIiwicG9zaXgiLCJwb3NpeFNwbGl0UGF0aCIsImNoYXJBdCIsInNlZ21lbnQiLCJmcm9tUGFydHMiLCJjYWNoZWRTZXRUaW1lb3V0IiwiY2FjaGVkQ2xlYXJUaW1lb3V0IiwiZGVmYXVsdFNldFRpbW91dCIsImRlZmF1bHRDbGVhclRpbWVvdXQiLCJydW5UaW1lb3V0Iiwic2V0VGltZW91dCIsImUiLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImRyYWluUXVldWUiLCJ0aW1lb3V0IiwicnVuIiwibWFya2VyIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsIm5vb3AiLCJuZXh0VGljayIsInRpdGxlIiwiYnJvd3NlciIsImFyZ3YiLCJ2ZXJzaW9ucyIsInByZXBlbmRMaXN0ZW5lciIsInByZXBlbmRPbmNlTGlzdGVuZXIiLCJiaW5kaW5nIiwiY2hkaXIiLCJ1bWFzayIsImNvcHkiLCJmaWxsIiwicmVhZFVJbnQ4IiwiZm9ybWF0UmVnRXhwIiwib2JqZWN0cyIsImluc3BlY3QiLCJpc051bGwiLCJkZXByZWNhdGUiLCJtc2ciLCJpc1VuZGVmaW5lZCIsImciLCJub0RlcHJlY2F0aW9uIiwidGhyb3dEZXByZWNhdGlvbiIsInRyYWNlRGVwcmVjYXRpb24iLCJ0cmFjZSIsImRlYnVnRW52aXJvbiIsImRlYnVncyIsIm9wdHMiLCJjdHgiLCJzZWVuIiwic3R5bGl6ZSIsInN0eWxpemVOb0NvbG9yIiwiZGVwdGgiLCJpc0Jvb2xlYW4iLCJzaG93SGlkZGVuIiwiX2V4dGVuZCIsImN1c3RvbUluc3BlY3QiLCJzdHlsaXplV2l0aENvbG9yIiwiZm9ybWF0VmFsdWUiLCJzdHlsZVR5cGUiLCJzdHlsZXMiLCJyZWN1cnNlVGltZXMiLCJpc0Z1bmN0aW9uIiwicmV0IiwicHJpbWl0aXZlIiwic2ltcGxlIiwiaXNOdW1iZXIiLCJmb3JtYXRQcmltaXRpdmUiLCJ2aXNpYmxlS2V5cyIsImlkeCIsImFycmF5VG9IYXNoIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImlzRXJyb3IiLCJmb3JtYXRFcnJvciIsImlzUmVnRXhwIiwiaXNEYXRlIiwib3V0cHV0IiwiYnJhY2VzIiwidG9VVENTdHJpbmciLCJmb3JtYXRQcm9wZXJ0eSIsImZvcm1hdEFycmF5IiwicmVkdWNlIiwiY3VyIiwicmVkdWNlVG9TaW5nbGVTdHJpbmciLCJsaW5lIiwiYXIiLCJyZSIsIm9iamVjdFRvU3RyaW5nIiwibyIsInBhZCIsImRlYnVnbG9nIiwiTk9ERV9ERUJVRyIsInRvVXBwZXJDYXNlIiwicGlkIiwiaXNOdWxsT3JVbmRlZmluZWQiLCJpc1N5bWJvbCIsImlzUHJpbWl0aXZlIiwiaXNCdWZmZXIiLCJtb250aHMiLCJ0aW1lc3RhbXAiLCJ0aW1lIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldERhdGUiLCJnZXRNb250aCIsImluaGVyaXRzIiwib3JpZ2luIiwiYWRkIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJhIiwiZGVmaW5pdGlvbiIsImdsb2JhbFRoaXMiLCJ0b1N0cmluZ1RhZyIsIl9fYXNzaWduIiwiYXNzaWduIiwidCIsImxvd2VyQ2FzZSIsIkRFRkFVTFRfU1BMSVRfUkVHRVhQIiwiREVGQVVMVF9TVFJJUF9SRUdFWFAiLCJpbnB1dCIsInNuYWtlQ2FzZSIsIl9hIiwic3BsaXRSZWdleHAiLCJfYiIsInN0cmlwUmVnZXhwIiwiX2MiLCJ0cmFuc2Zvcm0iLCJfZCIsIm5vQ2FzZSIsImRvdENhc2UiLCJJU19ERVYiLCJQUk9UT0NPTF9GSUxFIiwiUFJPVE9DT0xfTFNQIiwiVVJMX0xTUCIsIl9hcHBQYXRoUm9vdCIsImFzeW5jIiwiZ2V0QXBwUGF0aFJvb3QiLCJpbnZva2VIb3N0RXhwb3J0ZWRBcGkiLCJnZXRTREtQYXRoUm9vdCIsInNhZmV0eVBhdGhKb2luIiwiaXRlbSIsImRlZXBNZXJnZSIsInRhcmdldCIsInNvdXJjZXMiLCJTZXQiLCJnZW5JRCIsInJhbmRvbSIsInVjRmlyc3QiLCJ3aXRoRmlsZVByb3RvY29sIiwiYmFzZVBhdGgiLCJ1cmwiLCJVUkwiLCJmdWxsUGF0aCIsInNhZmV0eVBhdGhOb3JtYWxpemUiLCJkZWZlcnJlZCIsInJlamVjdCIsInNldHRsZWQiLCJ0aW1lRm4iLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUxIiwicmVqZWN0MSIsImNyZWF0ZWQiLCJub3ciLCJzZXRUYWciLCJtZXRob2QiLCJtZXRob2QxIiwibG9nc2VxSG9zdEV4cG9ydGVkQXBpIiwibG9nc2VxIiwiYXBpIiwiYXBpcyIsInNldHVwSWZyYW1lU2FuZGJveCIsInByb3BzIiwiaWZyYW1lIiwiY2xhc3NMaXN0IiwiZW50cmllcyIsImsiLCJzZXR1cEluamVjdGVkU3R5bGUiLCJhdHRycyIsImVsIiwicXVlcnlTZWxlY3RvciIsImhlYWQiLCJhcHBlbmQiLCJzZXR1cEluamVjdGVkVUkiLCJ1aSIsInBsIiwic2xvdCIsInNlbGVjdG9yIiwiZGVidWdUYWciLCJpZCIsImRhdGFzZXQiLCJpbmplY3RlZFVpIiwiYWRkRXZlbnRMaXN0ZW5lciIsInRyaWdnZXIiLCJjbG9zZXN0IiwibXNnVHlwZSIsImNhbGxlciIsImNhbGxVc2VyTW9kZWwiLCJ0cmFuc2Zvcm1hYmxlRXZlbnQiLCJkcyIsIkZMQUdfUkVDVCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRvSlNPTiIsImluamVjdGVkVGhlbWVFZmZlY3QiLCJzZXR1cEluamVjdGVkVGhlbWUiLCJsaW5rIiwicmVsIiwiaHJlZiIsIm1lc3NhZ2VUeXBlIiwiX21lc3NhZ2VJZCIsIm1lc3NhZ2VUeXBlcyIsImhhbmRzaGFrZSIsInJlcGx5IiwicmVxdWVzdCIsImFsbG93ZWRPcmlnaW4iLCJwb3N0bWF0ZSIsIlBhcmVudEFQSSIsImZyYW1lIiwiY2hpbGQiLCJjaGlsZE9yaWdpbiIsImluZm8iLCJjYWxsYmFjayIsInVpZCIsInRyYW5zYWN0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBvc3RNZXNzYWdlIiwiZXZlbnROYW1lIiwiQ2hpbGRBUEkiLCJtb2RlbCIsInBhcmVudE9yaWdpbiIsInVud3JhcHBlZENvbnRleHQiLCJyZXNvbHZlVmFsdWUiLCJ0aGVuIiwic291cmNlIiwiUG9zdG1hdGUiLCJjb250YWluZXIiLCJjbGFzc0xpc3RBcnJheSIsImNvbnRlbnRXaW5kb3ciLCJzZW5kSGFuZHNoYWtlIiwicHJvdG9jb2wiLCJsb2NhdGlvbiIsImhvc3QiLCJwb3J0IiwiaG9zdG5hbWUiLCJyZXNvbHZlT3JpZ2luIiwicmVzcG9uc2VJbnRlcnZhbCIsImF0dGVtcHQiLCJjbGVhckludGVydmFsIiwiZG9TZW5kIiwic2V0SW50ZXJ2YWwiLCJzcmMiLCJNb2RlbCIsInNlbmRIYW5kc2hha2VSZXBseSIsInNoYWtlIiwiZGVmYXVsdHMiLCJMU1BsdWdpbkZpbGVTdG9yYWdlIiwiYmFzZUluZm8iLCJjYWxsQXN5bmMiLCJjdHhJZCIsImNsZWFyIiwiaGFzSXRlbSIsIlBST1hZX0NPTlRJTlVFIiwiZm9yIiwicmVnaXN0ZXJTaW1wbGVDb21tYW5kIiwiYWN0aW9uIiwibGFiZWwiLCJldmVudEtleSIsInJlZ2lzdGVyZWRDbWRVaWQiLCJFZGl0b3IiLCJhcHAiLCJyZWdpc3RlclVJSXRlbSIsInJlZ2lzdGVyUGFnZU1lbnVJdGVtIiwiZWRpdG9yIiwicmVnaXN0ZXJTbGFzaENvbW1hbmQiLCJhY3Rpb25zIiwiaXQiLCJyZWdpc3RlckJsb2NrQ29udGV4dE1lbnVJdGVtIiwic2Nyb2xsVG9CbG9ja0luUGFnZSIsInBhZ2VOYW1lIiwiYmxvY2tJZCIsImFuY2hvciIsIkFwcCIsInB1c2hTdGF0ZSIsImRiIiwiTFNQbHVnaW5Vc2VyIiwiX2Jhc2VJbmZvIiwiX2NhbGxlciIsIl9jb25uZWN0ZWQiLCJfdWkiLCJNYXAiLCJfZmlsZVN0b3JhZ2UiLCJfYmVmb3JldW5sb2FkQ2FsbGJhY2siLCJzdXBlciIsInBheWxvYWQiLCJiIiwic2V0dGluZ3MiLCJhY3RvciIsInJlc3QiLCJjYiIsImNvbm5lY3RUb1BhcmVudCIsImVuc3VyZUNvbm5lY3RlZCIsImJlZm9yZXVubG9hZCIsInByb3ZpZGVNb2RlbCIsIl9leHRlbmRVc2VyTW9kZWwiLCJwcm92aWRlVGhlbWUiLCJ0aGVtZSIsInByb3ZpZGVTdHlsZSIsInByb3ZpZGVVSSIsInVwZGF0ZVNldHRpbmdzIiwic2V0TWFpblVJQXR0cnMiLCJzZXRNYWluVUlJbmxpbmVTdHlsZSIsImhpZGVNYWluVUkiLCJ2aXNpYmxlIiwiY3Vyc29yIiwicmVzdG9yZUVkaXRpbmdDdXJzb3IiLCJzaG93TWFpblVJIiwidG9nZ2xlTWFpblVJIiwic3RhdGUiLCJyZXNvbHZlUmVzb3VyY2VGdWxsVXJsIiwiZmlsZVBhdGgiLCJsc3IiLCJfbWFrZVVzZXJQcm94eSIsInRoYXQiLCJQcm94eSIsInByb3BLZXkiLCJyZWNlaXZlciIsIm9yaWdNZXRob2QiLCJob29rTWF0Y2hlciIsImhhbmRsZXIiLCJfX0xTUF9fSE9TVF9fIiwiTFNQbHVnaW5DYWxsZXIiLCJpbXBvcnRIVE1MIiwiY3JlYXRlU2FuZGJveENvbnRhaW5lciIsIlFTYW5kYm94IiwidXNlckZldGNoIiwic3RhcnRzV2l0aCIsImZldGNoIiwiZG9BY3Rpb24iLCJMU1BsdWdpblNoYWRvd0ZyYW1lIiwiX3BsdWdpbkxvY2FsIiwiX2ZyYW1lIiwiX3Jvb3QiLCJfbG9hZGVkIiwiX3VubW91bnRGbnMiLCJfZGlzcG9zZSIsIl91bm1vdW50IiwiZW50cnkiLCJsb2FkZWQiLCJleGVjU2NyaXB0cyIsIl9tb3VudCIsImdsb2JhbCIsImVsZW1lbnRHZXR0ZXIiLCJpbnN0YW5jZSIsInByb3h5IiwiX19zaGFkb3dfbW9kZV9fIiwiTFNQbHVnaW5Mb2NhbCIsIkxTUGx1Z2luU2hhZG93IiwiZXhlY1Jlc3VsdCIsInVubW91bnQiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwiRkxBR19BV0FJVCIsIkxTUE1TRyIsIkxTUE1TR19FUlJPUl9UQUciLCJMU1BNU0dfU0VUVElOR1MiLCJMU1BNU0dfQkVGT1JFX1VOTE9BRCIsIkxTUE1TR19TWU5DIiwiTFNQTVNHX1JFQURZIiwiTFNQTVNHRm4iLCJfcGFyZW50IiwiX2NoaWxkIiwiX3NoYWRvdyIsIl9zdGF0dXMiLCJfdXNlck1vZGVsIiwiX2NhbGwiLCJfY2FsbFVzZXJNb2RlbCIsIl9kZWJ1Z1RhZyIsInNoYWRvdyIsIl9zZXR1cFNoYWRvd1NhbmRib3giLCJfc2V0dXBJZnJhbWVTYW5kYm94IiwidXNlck1vZGVsIiwiaXNTaGFkb3dNb2RlIiwic3luY0dDVGltZXIiLCJzeW5jVGFnIiwic3luY0FjdG9ycyIsInJlYWR5RGVmZXJyZWQiLCJucyIsIl9zeW5jIiwiZGVsZXRlIiwicmVmUGFyZW50Iiwic2l6ZSIsImZpbmFsbHkiLCJjbnQiLCJzZWFyY2hQYXJhbXMiLCJ6YiIsInBhcmVudEVsZW1lbnQiLCJ0aW1lciIsInJlZkNoaWxkIiwiJCRwaWQiLCJjYXRjaCIsIl9nZXRTYW5kYm94SWZyYW1lQ29udGFpbmVyIiwiX2dldFNhbmRib3hTaGFkb3dDb250YWluZXIiLCJESVJfUExVR0lOUyIsIlBsdWdpblNldHRpbmdzIiwiX3VzZXJQbHVnaW5TZXR0aW5ncyIsIl9zZXR0aW5ncyIsImRpc2FibGVkIiwiUGx1Z2luTG9nZ2VyIiwiX3RhZyIsIl9sb2dzIiwid3JpdGUiLCJhYyIsInRvTG9jYWxlVGltZVN0cmluZyIsIlBsdWdpbkxvY2FsTG9hZFN0YXR1cyIsImNvbnZlcnRUb0xTUFJlc291cmNlIiwiZnVsbFVybCIsImRvdFBsdWdpblJvb3QiLCJJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yIiwiRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yIiwiUGx1Z2luTG9jYWwiLCJfb3B0aW9ucyIsIl90aGVtZU1nciIsIl9jdHgiLCJfZGlzcG9zZXMiLCJfaWQiLCJVTkxPQURFRCIsIl9sb2FkRXJyIiwiX2xvY2FsUm9vdCIsIl9kb3RTZXR0aW5nc0ZpbGUiLCJwbHVnaW5Mb2NhbCIsInRvZ2dsZSIsImdldE1haW5VSSIsImZvY3VzIiwiaW5pdE1haW5VSUhhbmRsZXJzIiwidGhlbWVkIiwidGhlbWVNZ3IiLCJyZWdpc3RlclRoZW1lIiwidW5yZWdpc3RlclRoZW1lIiwiX29uSG9zdE1vdW50ZWQiLCJpbml0UHJvdmlkZXJIYW5kbGVycyIsImluaXRBcGlQcm94eUhhbmRsZXJzIiwibG9nZ2VyIiwidXNlclNldHRpbmdzRmlsZVBhdGgiLCJ1c2VyU2V0dGluZ3MiLCJ1bmxvYWQiLCJfcmVzb2x2ZVJlc291cmNlRnVsbFVybCIsImxvY2FsUm9vdCIsInJlZyIsImVmZmVjdCIsImlzSW5zdGFsbGVkSW5Eb3RSb290IiwiZG90UGx1Z2luc1Jvb3QiLCJwa2ciLCJtYWluIiwiaWNvbiIsInJlZ2lzdGVyZWRQbHVnaW5zIiwiaXNSZWdpc3RlcmluZyIsInRoZW1lcyIsIl9sb2FkQ29uZmlnVGhlbWVzIiwiZGV2RW50cnkiLCJlbmRzV2l0aCIsImRpclBhdGhJbnN0YWxsZWQiLCJ0bXBfZmlsZV9tZXRob2QiLCJzZGtQYXRoUm9vdCIsImVudHJ5UGF0aCIsInJlYWR5SW5kaWNhdG9yIiwicGVuZGluZyIsIkxPQURJTkciLCJpbnN0YWxsUGFja2FnZVRoZW1lcyIsIl9wcmVwYXJlUGFja2FnZUNvbmZpZ3MiLCJfc2V0dXBVc2VyU2V0dGluZ3MiLCJfdHJ5VG9Ob3JtYWxpemVFbnRyeSIsImNvbm5lY3RUb0NoaWxkIiwicmVhZHlGbiIsIkVSUk9SIiwiTE9BREVEIiwidW5yZWdpc3RlciIsIlVOTE9BRElORyIsImV2ZW50QmVmb3JlVW5sb2FkIiwiZGlzcG9zZSIsImhvc3RNb3VudGVkQWN0b3IiLCJkb3RSb290IiwiZG90Q29uZmlnUm9vdCIsInBsZ1Jvb3QiLCJpbmNsdWRlcyIsImpzb24iLCJlcnIiLCJsb2FkRXJyIiwidXNmIiwiZG90U2V0dGluZ3NGaWxlIiwiaWlyIiwiTFNQbHVnaW5Db3JlIiwiX2lzUmVnaXN0ZXJpbmciLCJfcmVhZHlJbmRpY2F0b3IiLCJfaG9zdE1vdW50ZWRBY3RvciIsIl91c2VyUHJlZmVyZW5jZXMiLCJfcmVnaXN0ZXJlZFRoZW1lcyIsIl9yZWdpc3RlcmVkUGx1Z2lucyIsIl9jdXJyZW50VGhlbWUiLCJzZWxlY3RUaGVtZSIsInBsdWdpbnMiLCJpbml0aWFsIiwicmVnaXN0ZXIiLCJwZXJmVGFibGUiLCJkZWJ1Z1BlcmZJbmZvIiwidmFsdWVzIiwic3RhdHVzIiwicGVyZiIsInRvRml4ZWQiLCJfX2RlYnVnUGx1Z2luc1BlcmZJbmZvIiwibG9hZFVzZXJQcmVmZXJlbmNlcyIsImV4dGVybmFscyIsImZpbHRlciIsImV2ZXJ5IiwicGx1Z2luT3B0aW9ucyIsInBlcmZJbmZvIiwicGVyZm9ybWFuY2UiLCJzYXZlVXNlclByZWZlcmVuY2VzIiwiYWN0aXZhdGVVc2VyUHJlZmVyZW5jZXMiLCJpZGVudGl0eSIsImVuc3VyZVBsdWdpbiIsInJlbG9hZCIsInVucmVnaXN0ZXJlZEV4dGVybmFscyIsInBsdWdpbiIsImhvb2tBcHAiLCJfaG9vayIsImhvb2tFZGl0b3IiLCJfZXhlY0RpcmVjdGl2ZSIsInBhcmFtcyIsImhvc3RNb3VudGVkIiwib3B0IiwiZGlzIiwiZGlzSW5qZWN0ZWRUaGVtZSIsInNldHVwUGx1Z2luQ29yZSIsInBsdWdpbkNvcmUiXSwic291cmNlUm9vdCI6IiJ9