lsplugin.core.js 502 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 E=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),T=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),O=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),L=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"]),k=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"]),I=o(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),F=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]/),z=s(/^aria-[\-\w]+$/),$=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),H=s(/^(?:\w+script|data):/i),W=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),B="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 q(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 G=function(){return"undefined"==typeof window?null:window},J=function(e,t){if("object"!==(void 0===e?"undefined":B(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]:G(),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=z,ve=H,_e=W,be=$,we=null,Ce=x({},[].concat(q(E),q(T),q(O),q(k),q(F))),xe=null,Se=x({},[].concat(q(R),q(M),q(j),q(P))),Ae=null,Ee=null,Te=!0,Oe=!0,Le=!1,ke=!1,Ie=!1,Fe=!1,Re=!1,Me=!1,je=!1,Pe=!0,De=!1,Ne=!0,Ue=!0,ze=!1,$e={},He=null,We=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"]),Be=null,qe=x({},["audio","video","img","source","image","track"]),Ge=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":B(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,Ge="ADD_URI_SAFE_ATTR"in e?x(S(Je),e.ADD_URI_SAFE_ATTR):Je,Be="ADD_DATA_URI_TAGS"in e?x(S(qe),e.ADD_DATA_URI_TAGS):qe,He="FORBID_CONTENTS"in e?x({},e.FORBID_CONTENTS):We,Ae="FORBID_TAGS"in e?x({},e.FORBID_TAGS):{},Ee="FORBID_ATTR"in e?x({},e.FORBID_ATTR):{},$e="USE_PROFILES"in e&&e.USE_PROFILES,Te=!1!==e.ALLOW_ARIA_ATTR,Oe=!1!==e.ALLOW_DATA_ATTR,Le=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ke=e.SAFE_FOR_TEMPLATES||!1,Ie=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,ze=e.IN_PLACE||!1,be=e.ALLOWED_URI_REGEXP||be,Ye=e.NAMESPACE||Ve,ke&&(Oe=!1),je&&(Me=!0),$e&&(we=x({},[].concat(q(F))),xe=[],!0===$e.html&&(x(we,E),x(xe,R)),!0===$e.svg&&(x(we,T),x(xe,M),x(xe,P)),!0===$e.svgFilters&&(x(we,O),x(xe,M),x(xe,P)),!0===$e.mathMl&&(x(we,k),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(Ge,e.ADD_URI_SAFE_ATTR),e.FORBID_CONTENTS&&(He===We&&(He=S(He)),x(He,e.FORBID_CONTENTS)),Ue&&(we["#text"]=!0),Ie&&x(we,["html","head","body"]),we.table&&(x(we,["tbody"]),delete Ae.tbody),o&&o(e),Qe=e)},nt=x({},["mi","mo","mn","ms","mtext"]),rt=x({},["foreignobject","desc","title","annotation-xml"]),it=x({},T);x(it,O),x(it,L);var ot=x({},k);x(ot,I);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,Ie?"html":"body")[0]:Ie?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":B(l))?e instanceof l:e&&"object"===(void 0===e?"undefined":B(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)?(ke&&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(Oe&&!Ee[t]&&b(me,t));else if(Te&&b(ye,t));else{if(!xe[t]||Ee[t])return!1;if(Ge[t]);else if(b(be,y(n,_e,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==v(n,"data:")||!Be[e])if(Le&&!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{ke&&(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"===B(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(Fe||tt(i),n.removed=[],"string"==typeof e&&(ze=!1),ze);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&&!ke&&!Ie&&-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(ze?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,ze)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=Ie?o.outerHTML:o.innerHTML;return ke&&(p=y(p,fe," "),p=y(p,ge," ")),ie&&De?ie.createHTML(p):p},n.setConfig=function(e){tt(e),Fe=!0},n.clearConfig=function(){Qe=null,Fe=!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)O(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")),O(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 E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function T(){var e=new Date,t=[A(e.getHours()),A(e.getMinutes()),A(e.getSeconds())].join(":");return[e.getDate(),E[e.getMonth()],t].join(" ")}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",T(),t.format.apply(t,arguments))},t.inherits=n(717),t._extend=function(e,t){if(!t||!b(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{"use strict";n.r(r),n.d(r,{PluginLocal:()=>Ae,pluginHelpers:()=>e,setupPluginCore:()=>Te});var e={};n.r(e),n.d(e,{IS_DEV:()=>g,PROTOCOL_FILE:()=>m,PROTOCOL_LSP:()=>y,URL_LSP:()=>v,deepMerge:()=>x,deferred:()=>L,genID:()=>S,getAppPathRoot:()=>b,getSDKPathRoot:()=>w,invokeHostExportedApi:()=>k,isObject:()=>C,path:()=>f,safetyPathJoin:()=>T,safetyPathNormalize:()=>O,setupIframeSandbox:()=>I,setupInjectedStyle:()=>F,setupInjectedTheme:()=>D,setupInjectedUI:()=>M,transformableEvent:()=>j,ucFirst:()=>A,withFileProtocol:()=>E});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),h=n(856),p=n.n(h);const f="win32"===navigator.platform.toLowerCase()?d.win32:d.posix,g=!1,m="file://",y="lsp://",v=y+"logseq.io/";let _;async function b(){return _||(_=await k("_callApplication","getAppPath"))}async function w(){return g?localStorage.getItem("LSP_DEV_SDK_ROOT")||"http://localhost:8080":T(await b(),"js")}function C(e){return e===Object(e)&&!Array.isArray(e)}function x(e,...t){if(!t.length)return e;const n=e;if(C(n)){const e=t.length;for(let r=0;r<e;r+=1){const e=t[r];if(C(e))for(const t in e)e.hasOwnProperty(t)&&(C(e[t])?(n[t]&&C(n[t])||(n[t]={}),x(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 S(){return"_"+Math.random().toString(36).substr(2,9)}function A(e){return e.charAt(0).toUpperCase()+e.slice(1)}function E(e){return e?(/^(http|file|lsp)/.test(e)||(e=m+e),e):""}function T(e,...t){try{const n=new URL(e);if(!n.origin)throw new Error(null);const r=f.join(e.substr(n.origin.length),...t);return n.origin+r}catch(n){return f.join(e,...t)}}function O(e){return e?.match(/^(http?|lsp|assets):/)||(e=f.normalize(e)),e}function L(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 k(e,...t){const n=u(e=e?.startsWith("_call")?e:e?.replace(/^[_$]+/,"")),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 I(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 F(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}const R=new Map;function M(e,t,n){let r,i,o="";const s=this;"slot"in e?(o=e.slot,r=`#${o}`):"path"in e?r=e.path:i=!0;const a=`${e.key}-${o}-${s.id}`,l=`${e.key}--${s.id}`,c=i?document.body:r&&document.querySelector(r);if(!c)return void console.error(`${this.debugTag} can not resolve selector target ${r}`);if(!e.template)return void R.get(a)?.call(null);e.template=p().sanitize(e.template,{ADD_TAGS:["iframe"],ALLOW_UNKNOWN_PROTOCOLS:!0,ADD_ATTR:["allow","src","allowfullscreen","frameborder","scrolling"]});let u,d,h=document.querySelector(`#${a}`),f=i?h?.querySelector(".ls-ui-float-content"):h;if(!f)return h=document.createElement("div"),h.id=a,h.dataset.injectedUi=l||"",i?(f=document.createElement("div"),f.classList.add("ls-ui-float-content"),h.appendChild(f)):f=h,f.innerHTML=e.template,t&&Object.entries(t).forEach((([e,t])=>{h.setAttribute(e,t)})),e.style&&Object.entries(e.style).forEach((([e,t])=>{h.style[e]=t})),i&&(h.setAttribute("draggable","true"),h.setAttribute("resizable","true"),e.close&&(h.dataset.close=e.close),h.classList.add("lsp-ui-float-container","visible"),s._setupResizableContainer(h,l),d=s._setupDraggableContainer(h,{key:l,close:()=>u(),title:t?.title})),o&&e.reset&&Array.from(c.querySelectorAll("[data-injected-ui]")).map((e=>e.id))?.forEach((e=>{R.get(e)?.call(null)})),c.appendChild(h),["click","focus","focusin","focusout","blur","dblclick","keyup","keypress","keydown","change","input"].forEach((e=>{h.addEventListener(e,(t=>{const n=t.target.closest(`[data-on-${e}]`);if(!n)return;const r=n.dataset[`on${A(e)}`];r&&s.caller?.callUserModel(r,j(n))}),!1)})),n?.({el:h,float:i}),u=()=>{d?.(),R.delete(a),c.removeChild(h)},R.set(a,u),u;{f.innerHTML=e.template,t&&Object.entries(t).forEach((([e,t])=>{h.setAttribute(e,t)}));let n=null!=h.dataset.dx;e.style&&Object.entries(e.style).forEach((([e,t])=>{n&&["left","top","bottom","right","width","height"].includes(e)||(h.style[e]=t)}))}}function j(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 P=null;function D(e){if(P?.call(),!e)return;const t=document.createElement("link");return t.rel="stylesheet",t.href=e,document.head.appendChild(t),P=()=>{try{document.head.removeChild(t)}catch(e){console.error(e)}P=null}}var N=n(227),U=n.n(N);const z="application/x-postmate-v1+json";let $=0;const H={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1},W=(e,t)=>!("string"==typeof t&&e.origin!==t||!e.data||"object"==typeof e.data&&!("postmate"in e.data)||e.data.type!==z||!H[e.data.postmate]);class B{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(!W(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=++$,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:z,property:e,uid:n},this.childOrigin)}))}call(e,t){this.child.postMessage({postmate:"call",type:z,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 q{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(!W(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:z,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:z,value:{name:e,data:t}},this.parentOrigin)}}class G{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=>!!W(e,t)&&("handshake-reply"===e.data.postmate?(clearInterval(n),this.parent.removeEventListener("message",s,!1),this.childOrigin=e.origin,i(new B(this))):o("Failed handshake"));this.parent.addEventListener("message",s,!1);const a=()=>{r++,this.child.postMessage({postmate:"handshake",type:z,model:this.model},t),5===r&&clearInterval(n)};this.frame.addEventListener("load",(()=>{a(),n=setInterval(a,500)})),this.frame.src=e}))}}class J{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:z},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 q(this))}return t("Handshake Reply Failed")}};this.child.addEventListener("message",n,!1)}))}}class Z{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 K=Symbol.for("proxy-continue"),V=U()("LSPlugin:user");function Y(e,t,n){if("function"!=typeof n)return!1;const{key:r,label:i,desc:o,palette:s,keybinding:a}=t,l=`SimpleCommandHook${r}${++Q}`;this.Editor["on"+l](n),this.caller?.call("api:call",{method:"register-plugin-simple-command",args:[this.baseInfo.id,[{key:r,label:i,type:e,desc:o,keybinding:a},["editor/hook",l]],s]})}const X={registerCommand:Y,registerCommandPalette(e,t){const{key:n,label:r,keybinding:i}=e;return Y.call(this,"global-palette-command",{key:n,label:r,palette:!0,keybinding:i},t)},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;Y.call(this,"page-menu-item",{key:n,label:r},t)},setFullScreen(e){const t=(...e)=>this._callWin("setFullScreen",...e);"toggle"===e?this._callWin("isFullScreen").then((e=>{e?t():t(!0)})):e?t(!0):t()}};let Q=0;const ee={registerSlashCommand(e,t){V("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}${++Q}`;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;Y.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})}},te={};class ne extends(i()){_baseInfo;_caller;_connected=!1;_ui=new Map;_fileStorage;_beforeunloadCallback;constructor(e,t){super(),this._baseInfo=e,this._caller=t,t.on("sys:ui:visible",(e=>{e?.toggle&&this.toggleMainUI()})),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 Z(this)}async ready(e,t){if(!this._connected)try{"function"==typeof e&&(t=e,e={});let n=await this._caller.connectToParent(e);n=x(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(/^[.\\/]+/,""),T(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)===K){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",{tag:t,method:i,args:e})}}}})}_callWin(...e){return this._caller.callAsync("api:call",{method:"_callMainWin",args:e})}get App(){return this._makeUserProxy(X,"app")}get Editor(){return this._makeUserProxy(ee,"editor")}get DB(){return this._makeUserProxy(te)}get FileStorage(){return this._fileStorage}}if(null==window.__LSP__HOST__){const e=new me(null);window.logseq=new ne({},e)}const{importHTML:re,createSandboxContainer:ie}=window.QSandbox||{};function oe(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 se 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 re(t,{fetch:oe});this._mount(n,document.body);const i=ie(e,{elementGetter:()=>this._root?.firstChild}).instance.proxy;i.__shadow_mode__=!0,i.LSPluginLocal=this._pluginLocal,i.LSPluginShadow=this,i.LSPluginUser=i.logseq=new ne(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 ae=U()("LSPlugin:caller"),le="#await#response#",ce="#lspmsg#",ue="#lspmsg#error#",de="#lspmsg#settings#",he="#lspmsg#beforeunload#",pe="#lspmsg#reply#",fe="#lspmsg#ready#",ge=e=>`#lspmsg#${e}`;class me 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=L(5e3),a=this._extendUserModel({[fe]:async e=>{a[ge(e?.pid)]=({type:e,payload:n})=>{ae(`[call from host (_call)] ${this._debugTag}`,e,n),t.emit(e,n)},await s.resolve()},[he]:async e=>{const n=L(1e4);t.emit("beforeunload",Object.assign({actor:n},e)),await n.promise},[de]:async({type:e,payload:n})=>{t.emit("settings:changed",n)},[ce]:async({ns:e,type:n,payload:r})=>{ae(`[call from host (async)] ${this._debugTag}`,e,n,r),e&&e.startsWith("hook")?t.emit(`${e}:${n}`,r):t.emit(n,r)},[pe]:({_sync:e,result:t})=>{if(ae(`[sync reply] #${e}`,t),o.has(e)){const n=o.get(e);n&&(t?.hasOwnProperty(ue)?n.reject(t[ue]):n.resolve(t),o.delete(e))}},...e});if(n)return await s.promise,JSON.parse(JSON.stringify(this._pluginLocal?.toJSON()));const l=new J(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}`),ae("async call #",e)}return e.emit(ge(a.baseInfo.id),{type:t,payload:n}),r?.promise},this._callUserModel=async(e,t)=>{try{a[e](t)}catch(t){ae(`[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=L(1e4);return this._call?.call(this,e,t,n)}async callUserModel(e,t={}){return this._callUserModel?.call(this,e,t)}async _setupIframeSandbox(){const e=this._pluginLocal,t=e.id,n=new URL(e.options.entry);n.searchParams.set("__v__",g?Date.now().toString():e.options.version);const r=document.querySelector(`#${t}`);r&&r.parentElement.removeChild(r);const i=document.createElement("div");i.classList.add("lsp-iframe-sandbox-container"),i.id=t;{const e=this._pluginLocal.settings.get("layout")?.[0];if(e){i.dataset.inited_layout="true";const{width:t,height:n,left:r,top:o}=e;Object.assign(i.style,{width:t+"px",height:n+"px",left:r+"px",top:o+"px"})}}document.body.appendChild(i);let o,s=new G({id:t+"_iframe",container:i,url:n.href,classListArray:["lsp-iframe-sandbox"],model:{baseInfo:JSON.parse(JSON.stringify(e.toJSON()))}}).sendHandshake();return this._status="pending",new Promise(((t,n)=>{o=setTimeout((()=>{n(new Error("handshake Timeout"))}),3e3),s.then((n=>{this._parent=n,this._connected=!0,this.emit("connected"),n.on(ge(e.id),(({type:e,payload:t})=>{ae("[call from plugin] ",e,t),this._pluginLocal?.emit(e,t||{})})),this._call=async(...t)=>{await n.call(ge(e.id),{type:t[0],payload:Object.assign(t[1]||{},{$$pid:e.id})})},this._callUserModel=async(e,t)=>{if(e.startsWith(le))return await n.get(e.replace(le,""));n.call(e,t)},t(null)})).catch((e=>{n(e)})).finally((()=>{clearTimeout(o)}))})).catch((e=>{throw ae("[iframe sandbox] error",e),e})).finally((()=>{this._status=void 0}))}async _setupShadowSandbox(){const e=this._pluginLocal,t=this._shadow=new se(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(le)&&(t=t.replace(le,""));const n=e[1]||{},r=this._userModel[t];"function"==typeof r&&await r.call(null,n)}}catch(e){throw ae("[shadow sandbox] error",e),e}finally{this._status=void 0}}_extendUserModel(e){return Object.assign(this._userModel,e)}_getSandboxIframeContainer(){return this._parent?.frame.parentNode}_getSandboxShadowContainer(){return this._shadow?.frame.parentNode}_getSandboxIframeRoot(){return this._parent?.frame}_getSandboxShadowRoot(){return this._shadow?.frame}set debugTag(e){this._debugTag=e}async destroy(){let e=null;this._parent&&(e=this._getSandboxIframeContainer(),await this._parent.destroy()),this._shadow&&(e=this._getSandboxShadowContainer(),this._shadow.destroy()),e?.parentNode.removeChild(e)}}const ye=U()("LSPlugin:core"),ve="plugins";class _e 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=x({},this._settings);if("string"==typeof e){if(this._settings[e]==t)return;this._settings[e]=t}else{if(!C(e))return;x(this._settings,e)}this.emit("change",Object.assign({},this._settings),n)}toJSON(){return this._settings}}class be 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 we;function Ce(e,t){return t&&e.startsWith(m+t)&&(e=T(v,e.substr(m.length+t.length))),e}!function(e){e.LOADING="loading",e.UNLOADING="unloading",e.LOADED="loaded",e.UNLOADED="unload",e.ERROR="error"}(we||(we={}));class xe extends Error{constructor(e){super(e),this.name=xe.name}}class Se extends Error{constructor(e){super(e),this.name=Se.name}}class Ae extends(i()){_options;_themeMgr;_ctx;_disposes=[];_id;_status=we.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||S(),(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.getMainUIContainer();i?.classList[n?"toggle":t?"add":"remove"]("visible"),t&&!e.shadow&&i&&i.querySelector("iframe")?.contentWindow?.focus(),r&&k("restore_editing_cursor")})),e.on(t("attrs"),(t=>{const n=e.getMainUIContainer();Object.entries(t).forEach((([t,r])=>{n?.setAttribute(t,r),"draggable"===t&&r&&e._dispose(e._setupDraggableContainer(n,{title:e.options.name,close:()=>{e.caller.call("sys:ui:visible",{toggle:!0})}})),"resizable"===t&&r&&e._dispose(e._setupResizableContainer(n))}))})),e.on(t("style"),(t=>{const n=e.getMainUIContainer(),r=!!n.dataset.inited_layout;Object.entries(t).forEach((([e,t])=>{r&&["left","top","bottom","right","width","height"].includes(e)||(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(F(t,{"data-injected-style":n?`${n}-${e.id}`:"","data-ref":e.id}))})),e.on(t("ui"),(t=>{e._onHostMounted((()=>{e._dispose(M.call(e,t,Object.assign({"data-ref":e.id},t.attrs||{}),(({el:t,float:n})=>{if(!n)return;const r=t.dataset.identity;e.layoutCore.move_container_to_top(r)})))}))}))}(this),function(e){e.on("api:call",(async t=>{let n;try{n=await k(t.method,...t.args)}catch(e){n={[ue]:e}}const{_sync:r}=t;if(e.shadow)t.actor&&t.actor.resolve(n);else if(null!=r){const t=t=>{e.caller?.callUserModel(pe,{result:t,_sync:r})};Promise.resolve(n).then(t,t)}}))}(this)}async _setupUserSettings(){const{_options:e}=this,t=e.logger=new be("Loader");try{const[t,n]=await k("load_plugin_user_settings",this.id);this._dotSettingsFile=t,(e.settings=new _e(n)).on("change",((e,t)=>{ye("linked settings change",e),!e.disabled&&t.disabled&&this.load(),e.disabled&&!t.disabled&&this.unload(),e&&k("save_plugin_user_settings",this.id,e)}))}catch(e){ye("[load plugin user settings Error]",e),t?.error(e)}}getMainUIContainer(){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=f.join(t,e);e=n.test(r)?r:m+r}return!this.options.effect&&this.isInstalledInDotRoot?Ce(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(ye("prepare package root",e),t=await k("load_plugin_config",e),!t||(t=JSON.parse(t),!t))throw new Error(`Parse package config error #${e}/package.json`)}catch(e){throw new xe(e.message)}const n=this._localRoot=O(e),r=t.logseq||{};["name","author","repository","version","description","repo","title","effect"].concat(this.isInstalledInDotRoot?[]:["devEntry"]).forEach((e=>{this._options[e]=t[e]}));const i=r.entry||r.main||t.main;var o;(o=i)&&/\.(js|html)$/.test(o)&&(this._options.entry=this._resolveResourceFullUrl(i,n),this._options.devEntry=r.devEntry,r.mode&&(this._options.mode=r.mode));const s=r.title||t.title,a=r.icon||t.icon;if(this._options.title=s,this._options.icon=a&&this._resolveResourceFullUrl(a),this.isInstalledInDotRoot)this._id=f.basename(n);else if(r.id)this._id=r.id;else{r.id=this.id;try{await k("save_plugin_config",e,{...t,logseq:r})}catch(e){ye("[save plugin ID Error] ",e)}}const{registeredPlugins:l,isRegistering:c}=this._ctx;if(c&&l.has(r.id))throw new Se("prepare package Error");return async()=>{try{let e=r.themes;e&&await this._loadConfigThemes(Array.isArray(e)?e:[e])}catch(e){ye("[prepare package effect Error]",e)}}}async _tryToNormalizeEntry(){let{entry:e,settings:t,devEntry:n}=this.options;if(n=n||t?.get("_devEntry"),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=f.join(ve,r));let o=await w(),s=await k(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=Ce(E(f.normalize(s)),this.dotPluginsRoot),this._options.entry=e}async _loadConfigThemes(e){e.forEach((e=>{e.url&&(!e.url.startsWith("http")&&this._localRoot&&(e.url=f.join(this._localRoot,e.url),e.url.startsWith("file:")||(e.url="assets://"+e.url)),this.emit("provider:theme",e))}))}_persistMainUILayoutData(e){const t=this.settings.get("layouts")||[];t[0]=e,this.settings.set("layout",t)}_setupDraggableContainer(e,t={}){const n=e.dataset;if(n.inited_draggable)return;n.identity||(n.identity="dd-"+S());const r=!!t.key,i=document.createElement("div");i.classList.add("draggable-handle"),i.innerHTML=`\n <div class="th">\n <div class="l"><h3>${t.title||""}</h3></div>\n <div class="r">\n <a class="button x"><i class="ti ti-x"></i></a>\n </div>\n </div>\n `,i.querySelector(".x").addEventListener("click",(e=>{t?.close?.(),e.stopPropagation()}),!1),i.addEventListener("mousedown",(e=>{if(e.target?.closest(".r"))return e.stopPropagation(),void e.preventDefault()}),!1),e.prepend(i),e.addEventListener("mousedown",(e=>{this.layoutCore.move_container_to_top(n.identity)}),!0);const o=this.layoutCore.setup_draggable_container_BANG_(e,r?()=>{}:this._persistMainUILayoutData.bind(this));var s;n.inited_draggable="true",t.title&&(s=t.title,i.querySelector("h3").textContent=s);let a=null;if("outside"===n.close){const n=n=>{const r=n.target;e.contains(r)||t.close()};document.addEventListener("click",n,!1),a=()=>{document.removeEventListener("click",n)}}return()=>{o(),a?.()}}_setupResizableContainer(e,t){const n=e.dataset;if(n.inited_resizable)return;n.identity||(n.identity="dd-"+S());const r=document.createElement("div");r.classList.add("resizable-handle"),e.prepend(r);const i=window.frontend.modules.layout.core.setup_resizable_container_BANG_(e,t?()=>{}:this._persistMainUILayoutData.bind(this));return n.inited_resizable="true",i}async load(e){if(!this.pending){this._status=we.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 me(this),await this._caller.connectToChild();const n=()=>{this._caller?.callUserModel(fe,{pid:this.id})};e?e.promise.then(n):n(),this._disposes.push((async()=>{await(this._caller?.destroy())}))}catch(e){ye("[Load Plugin Error] ",e),this.logger?.error(e),this._status=we.ERROR,this._loadErr=e}finally{this._loadErr||(this.disabled?this._status=we.UNLOADED:this._status=we.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=we.UNLOADING;const t={unregister:e};try{await(this._caller?.callUserModel((he,`${le}#lspmsg#beforeunload#`),t)),this.emit("beforeunload",t)}catch(e){console.error("[beforeunload Error]",e)}await this.dispose(),this.emit("unloaded")}catch(e){return ye("[plugin unload Error]",e),!1}finally{this._status=we.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 layoutCore(){return window.frontend.modules.layout.core}get isInstalledInDotRoot(){const e=this.dotConfigRoot,t=this.localRoot;return e&&t&&t.startsWith(e)}get loaded(){return this._status===we.LOADED}get pending(){return[we.LOADING,we.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 f.normalize(this._ctx.options.dotConfigRoot)}get dotSettingsFile(){return this._dotSettingsFile}get dotPluginsRoot(){return f.join(this.dotConfigRoot,ve)}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 Ee extends(i()){_options;_isRegistering=!1;_readyIndicator;_hostMountedActor=L();_userPreferences={};_registeredThemes=new Map;_registeredPlugins=new Map;_currentTheme;constructor(e){super(),this._options=e}async loadUserPreferences(){try{const e=await k("load_user_preferences");e&&Object.assign(this._userPreferences,e)}catch(e){ye("[load user preferences Error]",e)}}async saveUserPreferences(e){try{e&&Object.assign(this._userPreferences,e),await k("save_user_preferences",this._userPreferences)}catch(e){ye("[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=L();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 Ae(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&&(ye("[Failed LOAD Plugin] #",t),this.emit("error",a),a instanceof xe||a instanceof Se)||(s.e=performance.now(),r.settings?.on("change",(e=>{this.emit("settings-changed",r.id,e),r.caller?.callUserModel(de,{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){ye(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(ce,{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 Ae)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(ye("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=D(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){ye("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 Ee(e);ye("=== 🔗 Setup Logseq Plugin System 🔗 ==="),window.LSPluginCore=t}})(),r})()}));
  3. //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUN0Q2lTLEdBQVV6K0IsS0FBSzBpQyxlQUFlN2MsS0FBTzJHLElBQ3JDeHNCLEtBQUswaUMsY0FBY2dDLFFBQ25CMWtDLEtBQUswaUMsY0FBZ0IsS0FFckIxaUMsS0FBSzRaLEtBQUssaUJBQWtCLFNBSXhDLFNBQVNnckIsR0FBZ0J2cEIsR0FDckIsTUFBTXdwQixFQUFhLElBQUkxQyxHQUFhOW1CLEdBQ3BDLEdBQU0sNENBQ043WixPQUFPMmdDLGFBQWUwQyIsInNvdXJjZXMiOlsid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2RvbXB1cmlmeS9kaXN0L3B1cmlmeS5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvcGF0aC9wYXRoLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2xvd2VyLWNhc2UvZGlzdC5lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvbm8tY2FzZS9kaXN0LmVzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9zbmFrZS1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL2RvdC1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvcG9zdG1hdGUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvbW9kdWxlcy9MU1BsdWdpbi5TdG9yYWdlLnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLnVzZXIudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvTFNQbHVnaW4uc2hhZG93LnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLmNhbGxlci50cyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9MU1BsdWdpbi5jb3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkxTUGx1Z2luXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkxTUGx1Z2luXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+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/IFwiIFwiIDogX2Q7XG4gICAgdmFyIHJlc3VsdCA9IHJlcGxhY2UocmVwbGFjZShpbnB1dCwgc3BsaXRSZWdleHAsIFwiJDFcXDAkMlwiKSwgc3RyaXBSZWdleHAsIFwiXFwwXCIpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgdmFyIGVuZCA9IHJlc3VsdC5sZW5ndGg7XG4gICAgLy8gVHJpbSB0aGUgZGVsaW1pdGVyIGZyb20gYXJvdW5kIHRoZSBvdXRwdXQgc3RyaW5nLlxuICAgIHdoaWxlIChyZXN1bHQuY2hhckF0KHN0YXJ0KSA9PT0gXCJcXDBcIilcbiAgICAgICAgc3RhcnQrKztcbiAgICB3aGlsZSAocmVzdWx0LmNoYXJBdChlbmQgLSAxKSA9PT0gXCJcXDBcIilcbiAgICAgICAgZW5kLS07XG4gICAgLy8gVHJhbnNmb3JtIGVhY2ggdG9rZW4gaW5kZXBlbmRlbnRseS5cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKHN0YXJ0LCBlbmQpLnNwbGl0KFwiXFwwXCIpLm1hcCh0cmFuc2Zvcm0pLmpvaW4oZGVsaW1pdGVyKTtcbn1cbi8qKlxuICogUmVwbGFjZSBgcmVgIGluIHRoZSBpbnB1dCBzdHJpbmcgd2l0aCB0aGUgcmVwbGFjZW1lbnQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2UoaW5wdXQsIHJlLCB2YWx1ZSkge1xuICAgIGlmIChyZSBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocmUsIHZhbHVlKTtcbiAgICByZXR1cm4gcmUucmVkdWNlKGZ1bmN0aW9uIChpbnB1dCwgcmUpIHsgcmV0dXJuIGlucHV0LnJlcGxhY2UocmUsIHZhbHVlKTsgfSwgaW5wdXQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGRvdENhc2UgfSBmcm9tIFwiZG90LWNhc2VcIjtcbmV4cG9ydCBmdW5jdGlvbiBzbmFrZUNhc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHJldHVybiBkb3RDYXNlKGlucHV0LCBfX2Fzc2lnbih7IGRlbGltaXRlcjogXCJfXCIgfSwgb3B0aW9ucykpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IG5vQ2FzZSB9IGZyb20gXCJuby1jYXNlXCI7XG5leHBvcnQgZnVuY3Rpb24gZG90Q2FzZShpbnB1dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcmV0dXJuIG5vQ2FzZShpbnB1dCwgX19hc3NpZ24oeyBkZWxpbWl0ZXI6IFwiLlwiIH0sIG9wdGlvbnMpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IHNuYWtlQ2FzZSB9IGZyb20gJ3NuYWtlLWNhc2UnO1xuaW1wb3J0ICogYXMgbm9kZVBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5leHBvcnQgY29uc3QgcGF0aCA9IG5hdmlnYXRvci5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpID09PSAnd2luMzInID8gbm9kZVBhdGgud2luMzIgOiBub2RlUGF0aC5wb3NpeDtcbmV4cG9ydCBjb25zdCBJU19ERVYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JztcbmV4cG9ydCBjb25zdCBQUk9UT0NPTF9GSUxFID0gJ2ZpbGU6Ly8nO1xuZXhwb3J0IGNvbnN0IFBST1RPQ09MX0xTUCA9ICdsc3A6Ly8nO1xuZXhwb3J0IGNvbnN0IFVSTF9MU1AgPSBQUk9UT0NPTF9MU1AgKyAnbG9nc2VxLmlvLyc7XG5sZXQgX2FwcFBhdGhSb290O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFwcFBhdGhSb290KCkge1xuICAgIGlmIChfYXBwUGF0aFJvb3QpIHtcbiAgICAgICAgcmV0dXJuIF9hcHBQYXRoUm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIChfYXBwUGF0aFJvb3QgPVxuICAgICAgICBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ19jYWxsQXBwbGljYXRpb24nLCAnZ2V0QXBwUGF0aCcpKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTREtQYXRoUm9vdCgpIHtcbiAgICBpZiAoSVNfREVWKSB7XG4gICAgICAgIC8vIFRPRE86IGNhY2hlIGluIHByZWZlcmVuY2UgZmlsZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0xTUF9ERVZfU0RLX1JPT1QnKSB8fCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwJztcbiAgICB9XG4gICAgY29uc3QgYXBwUGF0aFJvb3QgPSBhd2FpdCBnZXRBcHBQYXRoUm9vdCgpO1xuICAgIHJldHVybiBzYWZldHlQYXRoSm9pbihhcHBQYXRoUm9vdCwgJ2pzJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoaXRlbSkge1xuICAgIHJldHVybiAoaXRlbSA9PT0gT2JqZWN0KGl0ZW0pICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gICAgLy8gcmV0dXJuIHRoZSB0YXJnZXQgaWYgbm8gc291cmNlcyBwYXNzZWRcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHRhcmdldDtcbiAgICBpZiAoaXNPYmplY3QocmVzdWx0KSkge1xuICAgICAgICBjb25zdCBsZW4gPSBzb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3QgZWxtID0gc291cmNlc1tpXTtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChlbG0pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZWxtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbG0uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGVsbVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W2tleV0gfHwgIWlzT2JqZWN0KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwTWVyZ2UocmVzdWx0W2tleV0sIGVsbVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtrZXldKSAmJiBBcnJheS5pc0FycmF5KGVsbVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZSB0aGUgdHdvIGFycmF5cyBhbmQgcmVtb3ZlIGFueSBkdXBsaWNhdGUgcHJpbWl0aXZlIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IEFycmF5LmZyb20obmV3IFNldChyZXN1bHRba2V5XS5jb25jYXQoZWxtW2tleV0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGVsbVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdlbklEKCkge1xuICAgIC8vIE1hdGgucmFuZG9tIHNob3VsZCBiZSB1bmlxdWUgYmVjYXVzZSBvZiBpdHMgc2VlZGluZyBhbGdvcml0aG0uXG4gICAgLy8gQ29udmVydCBpdCB0byBiYXNlIDM2IChudW1iZXJzICsgbGV0dGVycyksIGFuZCBncmFiIHRoZSBmaXJzdCA5IGNoYXJhY3RlcnNcbiAgICAvLyBhZnRlciB0aGUgZGVjaW1hbC5cbiAgICByZXR1cm4gJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVjRmlyc3Qoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3aXRoRmlsZVByb3RvY29sKHBhdGgpIHtcbiAgICBpZiAoIXBhdGgpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCByZWcgPSAvXihodHRwfGZpbGV8bHNwKS87XG4gICAgaWYgKCFyZWcudGVzdChwYXRoKSkge1xuICAgICAgICBwYXRoID0gUFJPVE9DT0xfRklMRSArIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNhZmV0eVBhdGhKb2luKGJhc2VQYXRoLCAuLi5wYXJ0cykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVBhdGgpO1xuICAgICAgICBpZiAoIXVybC5vcmlnaW4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobnVsbCk7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGJhc2VQYXRoLnN1YnN0cih1cmwub3JpZ2luLmxlbmd0aCksIC4uLnBhcnRzKTtcbiAgICAgICAgcmV0dXJuIHVybC5vcmlnaW4gKyBmdWxsUGF0aDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbihiYXNlUGF0aCwgLi4ucGFydHMpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzYWZldHlQYXRoTm9ybWFsaXplKGJhc2VQYXRoKSB7XG4gICAgaWYgKCFiYXNlUGF0aD8ubWF0Y2goL14oaHR0cD98bHNwfGFzc2V0cyk6LykpIHtcbiAgICAgICAgYmFzZVBhdGggPSBwYXRoLm5vcm1hbGl6ZShiYXNlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlUGF0aDtcbn1cbi8qKlxuICogQHBhcmFtIHRpbWVvdXQgbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gdGFnIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmZXJyZWQodGltZW91dCwgdGFnKSB7XG4gICAgbGV0IHJlc29sdmUsIHJlamVjdDtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVGbiA9IChyKSA9PiB7XG4gICAgICAgIHJldHVybiAodikgPT4ge1xuICAgICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICByKHYpO1xuICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUxLCByZWplY3QxKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSB0aW1lRm4ocmVzb2x2ZTEpO1xuICAgICAgICByZWplY3QgPSB0aW1lRm4ocmVqZWN0MSk7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBbZGVmZXJyZWQgdGltZW91dF0gJHt0YWd9YCkpLCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICAgIHNldFRhZzogKHQpID0+IHRhZyA9IHQsXG4gICAgICAgIHJlc29sdmUsIHJlamVjdCwgcHJvbWlzZSxcbiAgICAgICAgZ2V0IHNldHRsZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlZDtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW52b2tlSG9zdEV4cG9ydGVkQXBpKG1ldGhvZCwgLi4uYXJncykge1xuICAgIG1ldGhvZCA9IG1ldGhvZD8uc3RhcnRzV2l0aCgnX2NhbGwnKSA/IG1ldGhvZCA6XG4gICAgICAgIG1ldGhvZD8ucmVwbGFjZSgvXltfJF0rLywgJycpO1xuICAgIGNvbnN0IG1ldGhvZDEgPSBzbmFrZUNhc2UobWV0aG9kKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbG9nc2VxSG9zdEV4cG9ydGVkQXBpID0gd2luZG93LmxvZ3NlcT8uYXBpIHx8IHt9O1xuICAgIGNvbnN0IGZuID0gbG9nc2VxSG9zdEV4cG9ydGVkQXBpW21ldGhvZDFdIHx8IHdpbmRvdy5hcGlzW21ldGhvZDFdIHx8XG4gICAgICAgIGxvZ3NlcUhvc3RFeHBvcnRlZEFwaVttZXRob2RdIHx8IHdpbmRvdy5hcGlzW21ldGhvZF07XG4gICAgaWYgKCFmbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBleGlzdGVkIG1ldGhvZCAjJHttZXRob2R9YCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgPyBmbiA6IGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSWZyYW1lU2FuZGJveChwcm9wcywgdGFyZ2V0KSB7XG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC5hZGQoJ2xzcC1pZnJhbWUtc2FuZGJveCcpO1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICB9KTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW5qZWN0ZWRTdHlsZShzdHlsZSwgYXR0cnMpIHtcbiAgICBjb25zdCBrZXkgPSBhdHRyc1snZGF0YS1pbmplY3RlZC1zdHlsZSddO1xuICAgIGxldCBlbCA9IGtleSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pbmplY3RlZC1zdHlsZT0ke2tleX1dYCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgYXR0cnMgJiYgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZWwpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG59XG5jb25zdCBpbmplY3RlZFVJRWZmZWN0cyA9IG5ldyBNYXAoKTtcbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEluamVjdGVkVUkodWksIGF0dHJzLCBpbml0aWFsQ2FsbGJhY2spIHtcbiAgICBsZXQgc2xvdCA9ICcnO1xuICAgIGxldCBzZWxlY3RvcjtcbiAgICBsZXQgZmxvYXQ7XG4gICAgY29uc3QgcGwgPSB0aGlzO1xuICAgIGlmICgnc2xvdCcgaW4gdWkpIHtcbiAgICAgICAgc2xvdCA9IHVpLnNsb3Q7XG4gICAgICAgIHNlbGVjdG9yID0gYCMke3Nsb3R9YDtcbiAgICB9XG4gICAgZWxzZSBpZiAoJ3BhdGgnIGluIHVpKSB7XG4gICAgICAgIHNlbGVjdG9yID0gdWkucGF0aDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZsb2F0ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgJHt1aS5rZXl9LSR7c2xvdH0tJHtwbC5pZH1gO1xuICAgIGNvbnN0IGtleSA9IGAke3VpLmtleX0tLSR7cGwuaWR9YDtcbiAgICBjb25zdCB0YXJnZXQgPSBmbG9hdCA/IGRvY3VtZW50LmJvZHkgOiAoc2VsZWN0b3IgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5kZWJ1Z1RhZ30gY2FuIG5vdCByZXNvbHZlIHNlbGVjdG9yIHRhcmdldCAke3NlbGVjdG9yfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1aS50ZW1wbGF0ZSkge1xuICAgICAgICAvLyBzYWZlIHRlbXBsYXRlXG4gICAgICAgIHVpLnRlbXBsYXRlID0gRE9NUHVyaWZ5LnNhbml0aXplKHVpLnRlbXBsYXRlLCB7XG4gICAgICAgICAgICBBRERfVEFHUzogWydpZnJhbWUnXSxcbiAgICAgICAgICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTOiB0cnVlLFxuICAgICAgICAgICAgQUREX0FUVFI6IFsnYWxsb3cnLCAnc3JjJywgJ2FsbG93ZnVsbHNjcmVlbicsICdmcmFtZWJvcmRlcicsICdzY3JvbGxpbmcnXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIHJlbW92ZSB1aVxuICAgICAgICBpbmplY3RlZFVJRWZmZWN0cy5nZXQoaWQpPy5jYWxsKG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2lkfWApO1xuICAgIGxldCBjb250ZW50ID0gZmxvYXQgPyBlbD8ucXVlcnlTZWxlY3RvcignLmxzLXVpLWZsb2F0LWNvbnRlbnQnKSA6IGVsO1xuICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gdWkudGVtcGxhdGU7XG4gICAgICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzXG4gICAgICAgIGF0dHJzICYmIE9iamVjdC5lbnRyaWVzKGF0dHJzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBwb3NpdGlvbkRpcnR5ID0gZWwuZGF0YXNldC5keCAhPSBudWxsO1xuICAgICAgICB1aS5zdHlsZSAmJiBPYmplY3QuZW50cmllcyh1aS5zdHlsZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBpZiAocG9zaXRpb25EaXJ0eSAmJiBbXG4gICAgICAgICAgICAgICAgJ2xlZnQnLCAndG9wJywgJ2JvdHRvbScsICdyaWdodCcsICd3aWR0aCcsICdoZWlnaHQnXG4gICAgICAgICAgICBdLmluY2x1ZGVzKGspKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWwuc3R5bGVba10gPSB2O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLmlkID0gaWQ7XG4gICAgZWwuZGF0YXNldC5pbmplY3RlZFVpID0ga2V5IHx8ICcnO1xuICAgIGlmIChmbG9hdCkge1xuICAgICAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZCgnbHMtdWktZmxvYXQtY29udGVudCcpO1xuICAgICAgICBlbC5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnRlbnQgPSBlbDtcbiAgICB9XG4gICAgLy8gVE9ETzogZW5oYW5jZSB0ZW1wbGF0ZVxuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gdWkudGVtcGxhdGU7XG4gICAgYXR0cnMgJiYgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgdWkuc3R5bGUgJiYgT2JqZWN0LmVudHJpZXModWkuc3R5bGUpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zdHlsZVtrXSA9IHY7XG4gICAgfSk7XG4gICAgbGV0IHRlYXJkb3duVUk7XG4gICAgbGV0IGRpc3Bvc2VGbG9hdDtcbiAgICBpZiAoZmxvYXQpIHtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3Jlc2l6YWJsZScsICd0cnVlJyk7XG4gICAgICAgIHVpLmNsb3NlICYmIChlbC5kYXRhc2V0LmNsb3NlID0gdWkuY2xvc2UpO1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdsc3AtdWktZmxvYXQtY29udGFpbmVyJywgJ3Zpc2libGUnKTtcbiAgICAgICAgZGlzcG9zZUZsb2F0ID0gKHBsLl9zZXR1cFJlc2l6YWJsZUNvbnRhaW5lcihlbCwga2V5KSxcbiAgICAgICAgICAgIHBsLl9zZXR1cERyYWdnYWJsZUNvbnRhaW5lcihlbCwgeyBrZXksIGNsb3NlOiAoKSA9PiB0ZWFyZG93blVJKCksIHRpdGxlOiBhdHRycz8udGl0bGUgfSkpO1xuICAgIH1cbiAgICBpZiAoISFzbG90ICYmIHVpLnJlc2V0KSB7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IEFycmF5LmZyb20odGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWluamVjdGVkLXVpXScpKVxuICAgICAgICAgICAgLm1hcCgoaXQpID0+IGl0LmlkKTtcbiAgICAgICAgZXhpc3RzPy5mb3JFYWNoKChleGlzdCkgPT4ge1xuICAgICAgICAgICAgaW5qZWN0ZWRVSUVmZmVjdHMuZ2V0KGV4aXN0KT8uY2FsbChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRhcmdldC5hcHBlbmRDaGlsZChlbCk7XG4gICAgLy8gVE9ETzogSG93IGhhbmRsZSBldmVudHNcbiAgICBbJ2NsaWNrJywgJ2ZvY3VzJywgJ2ZvY3VzaW4nLCAnZm9jdXNvdXQnLCAnYmx1cicsICdkYmxjbGljaycsXG4gICAgICAgICdrZXl1cCcsICdrZXlwcmVzcycsICdrZXlkb3duJywgJ2NoYW5nZScsICdpbnB1dCddLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGFyZ2V0LmNsb3Nlc3QoYFtkYXRhLW9uLSR7dHlwZX1dYCk7XG4gICAgICAgICAgICBpZiAoIXRyaWdnZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgbXNnVHlwZSA9IHRyaWdnZXIuZGF0YXNldFtgb24ke3VjRmlyc3QodHlwZSl9YF07XG4gICAgICAgICAgICBtc2dUeXBlICYmIHBsLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChtc2dUeXBlLCB0cmFuc2Zvcm1hYmxlRXZlbnQodHJpZ2dlciwgZSkpO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgfSk7XG4gICAgLy8gY2FsbGJhY2tcbiAgICBpbml0aWFsQ2FsbGJhY2s/Lih7IGVsLCBmbG9hdCB9KTtcbiAgICB0ZWFyZG93blVJID0gKCkgPT4ge1xuICAgICAgICBkaXNwb3NlRmxvYXQ/LigpO1xuICAgICAgICBpbmplY3RlZFVJRWZmZWN0cy5kZWxldGUoaWQpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG4gICAgaW5qZWN0ZWRVSUVmZmVjdHMuc2V0KGlkLCB0ZWFyZG93blVJKTtcbiAgICByZXR1cm4gdGVhcmRvd25VSTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1hYmxlRXZlbnQodGFyZ2V0LCBlKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgICBjb25zdCBkcyA9IHRhcmdldC5kYXRhc2V0O1xuICAgICAgICBjb25zdCBGTEFHX1JFQ1QgPSAncmVjdCc7XG4gICAgICAgIFsndmFsdWUnLCAnaWQnLCAnY2xhc3NOYW1lJyxcbiAgICAgICAgICAgICdkYXRhc2V0JywgRkxBR19SRUNUXG4gICAgICAgIF0uZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgbGV0IHY7XG4gICAgICAgICAgICBzd2l0Y2ggKGspIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZMQUdfUkVDVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkcy5oYXNPd25Qcm9wZXJ0eShGTEFHX1JFQ1QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB2ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvSlNPTigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB2ID0gdGFyZ2V0W2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHYgPSB7IC4uLnYgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9ialtrXSA9IHY7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxubGV0IGluamVjdGVkVGhlbWVFZmZlY3QgPSBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW5qZWN0ZWRUaGVtZSh1cmwpIHtcbiAgICBpbmplY3RlZFRoZW1lRWZmZWN0Py5jYWxsKCk7XG4gICAgaWYgKCF1cmwpXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIHJldHVybiAoaW5qZWN0ZWRUaGVtZUVmZmVjdCA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5qZWN0ZWRUaGVtZUVmZmVjdCA9IG51bGw7XG4gICAgfSk7XG59XG4iLCIvLyBGb3JrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RvbGxhcnNoYXZlY2x1Yi9wb3N0bWF0ZVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBtZXNzYWdlcyBvdXIgZnJhbWVzIG91ciBzZW5kaW5nXG4gKiBAdHlwZSB7U3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZVR5cGUgPSAnYXBwbGljYXRpb24veC1wb3N0bWF0ZS12MStqc29uJztcbi8qKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIHRvIHNlbmQgYSBoYW5kc2hha2UgcmVxdWVzdCB0byB0aGUgcGFyZW50XG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5leHBvcnQgY29uc3QgbWF4SGFuZHNoYWtlUmVxdWVzdHMgPSA1O1xuLyoqXG4gKiBBIHVuaXF1ZSBtZXNzYWdlIElEIHRoYXQgaXMgdXNlZCB0byBlbnN1cmUgcmVzcG9uc2VzIGFyZSBzZW50IHRvIHRoZSBjb3JyZWN0IHJlcXVlc3RzXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5sZXQgX21lc3NhZ2VJZCA9IDA7XG4vKipcbiAqIEluY3JlbWVudHMgYW5kIHJldHVybnMgYSBtZXNzYWdlIElEXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEEgdW5pcXVlIElEIGZvciBhIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTmV3TWVzc2FnZUlkID0gKCkgPT4gKytfbWVzc2FnZUlkO1xuLyoqXG4gKiBQb3N0bWF0ZSBsb2dnaW5nIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcy9kaXNhYmxlcyB2aWEgY29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4gUG9zdG1hdGUuZGVidWcgPyBjb25zb2xlLmxvZyguLi5hcmdzKSA6IG51bGw7XG4vKipcbiAqIFRha2VzIGEgVVJMIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5cbiAqIEBwYXJhbSAge1N0cmluZ30gdXJsIFRoZSBmdWxsIFVSTCBiZWluZyByZXF1ZXN0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgIFRoZSBVUkxzIG9yaWdpblxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9yaWdpbiA9ICh1cmwpID0+IHtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBjb25zdCBwcm90b2NvbCA9IGEucHJvdG9jb2wubGVuZ3RoID4gNCA/IGEucHJvdG9jb2wgOiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7XG4gICAgY29uc3QgaG9zdCA9IGEuaG9zdC5sZW5ndGggPyAoKGEucG9ydCA9PT0gJzgwJyB8fCBhLnBvcnQgPT09ICc0NDMnKSA/IGEuaG9zdG5hbWUgOiBhLmhvc3QpIDogd2luZG93LmxvY2F0aW9uLmhvc3Q7XG4gICAgcmV0dXJuIGEub3JpZ2luIHx8IGAke3Byb3RvY29sfS8vJHtob3N0fWA7XG59O1xuY29uc3QgbWVzc2FnZVR5cGVzID0ge1xuICAgIGhhbmRzaGFrZTogMSxcbiAgICAnaGFuZHNoYWtlLXJlcGx5JzogMSxcbiAgICBjYWxsOiAxLFxuICAgIGVtaXQ6IDEsXG4gICAgcmVwbHk6IDEsXG4gICAgcmVxdWVzdDogMSxcbn07XG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhIG1lc3NhZ2UgaXMgc2FmZSB0byBpbnRlcnByZXRcbiAqIEBwYXJhbSAge09iamVjdH0gbWVzc2FnZSBUaGUgcG9zdG1hdGUgbWVzc2FnZSBiZWluZyBzZW50XG4gKiBAcGFyYW0gIHtTdHJpbmd8Qm9vbGVhbn0gYWxsb3dlZE9yaWdpbiBUaGUgd2hpdGVsaXN0ZWQgb3JpZ2luIG9yIGZhbHNlIHRvIHNraXAgb3JpZ2luIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnQgY29uc3Qgc2FuaXRpemUgPSAobWVzc2FnZSwgYWxsb3dlZE9yaWdpbikgPT4ge1xuICAgIGlmICh0eXBlb2YgYWxsb3dlZE9yaWdpbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgbWVzc2FnZS5vcmlnaW4gIT09IGFsbG93ZWRPcmlnaW4pXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIW1lc3NhZ2UuZGF0YSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZS5kYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhKCdwb3N0bWF0ZScgaW4gbWVzc2FnZS5kYXRhKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChtZXNzYWdlLmRhdGEudHlwZSAhPT0gbWVzc2FnZVR5cGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIW1lc3NhZ2VUeXBlc1ttZXNzYWdlLmRhdGEucG9zdG1hdGVdKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBUYWtlcyBhIG1vZGVsLCBhbmQgc2VhcmNoZXMgZm9yIGEgdmFsdWUgYnkgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gIHtPYmplY3R9IG1vZGVsICAgICBUaGUgZGljdGlvbmFyeSB0byBzZWFyY2ggYWdhaW5zdFxuICogQHBhcmFtICB7U3RyaW5nfSBwcm9wZXJ0eSAgQSBwYXRoIHdpdGhpbiBhIGRpY3Rpb25hcnkgKGkuZS4gJ3dpbmRvdy5sb2NhdGlvbi5ocmVmJylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBmdW5jdGlvbnMgaW4gdGhlIGNoaWxkIG1vZGVsXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVZhbHVlID0gKG1vZGVsLCBwcm9wZXJ0eSkgPT4ge1xuICAgIGNvbnN0IHVud3JhcHBlZENvbnRleHQgPSB0eXBlb2YgbW9kZWxbcHJvcGVydHldID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxbcHJvcGVydHldKCkgOiBtb2RlbFtwcm9wZXJ0eV07XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bndyYXBwZWRDb250ZXh0KTtcbn07XG4vKipcbiAqIENvbXBvc2VzIGFuIEFQSSB0byBiZSB1c2VkIGJ5IHRoZSBwYXJlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIEluZm9ybWF0aW9uIG9uIHRoZSBjb25zdW1lclxuICovXG5leHBvcnQgY2xhc3MgUGFyZW50QVBJIHtcbiAgICBwYXJlbnQ7XG4gICAgZnJhbWU7XG4gICAgY2hpbGQ7XG4gICAgZXZlbnRzID0ge307XG4gICAgY2hpbGRPcmlnaW47XG4gICAgbGlzdGVuZXI7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB0aGlzLnBhcmVudCA9IGluZm8ucGFyZW50O1xuICAgICAgICB0aGlzLmZyYW1lID0gaW5mby5mcmFtZTtcbiAgICAgICAgdGhpcy5jaGlsZCA9IGluZm8uY2hpbGQ7XG4gICAgICAgIHRoaXMuY2hpbGRPcmlnaW4gPSBpbmZvLmNoaWxkT3JpZ2luO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IFJlZ2lzdGVyaW5nIEFQSScpO1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IEF3YWl0aW5nIG1lc3NhZ2VzLi4uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5lciA9IChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNhbml0aXplKGUsIHRoaXMuY2hpbGRPcmlnaW4pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogdGhlIGFzc2lnbm1lbnRzIGJlbG93IGVuc3VyZXMgdGhhdCBlLCBkYXRhLCBhbmQgdmFsdWUgYXJlIGFsbCBkZWZpbmVkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSwgbmFtZSB9ID0gKCgoZSB8fCB7fSkuZGF0YSB8fCB7fSkudmFsdWUgfHwge30pO1xuICAgICAgICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2VtaXQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGBQYXJlbnQ6IFJlY2VpdmVkIGV2ZW50IGVtaXNzaW9uOiAke25hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIHRoaXMuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzW25hbWVdLmZvckVhY2goY2FsbGJhY2sgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5saXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IEF3YWl0aW5nIGV2ZW50IGVtaXNzaW9ucyBmcm9tIENoaWxkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0KHByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgLy8gRXh0cmFjdCBkYXRhIGZyb20gcmVzcG9uc2UgYW5kIGtpbGwgbGlzdGVuZXJzXG4gICAgICAgICAgICBjb25zdCB1aWQgPSBnZW5lcmF0ZU5ld01lc3NhZ2VJZCgpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNhY3QgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudWlkID09PSB1aWQgJiYgZS5kYXRhLnBvc3RtYXRlID09PSAncmVwbHknKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0cmFuc2FjdCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGUuZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFByZXBhcmUgZm9yIHJlc3BvbnNlIGZyb20gQ2hpbGQuLi5cbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0cmFuc2FjdCwgZmFsc2UpO1xuICAgICAgICAgICAgLy8gVGhlbiBhc2sgY2hpbGQgZm9yIGluZm9ybWF0aW9uXG4gICAgICAgICAgICB0aGlzLmNoaWxkLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBwb3N0bWF0ZTogJ3JlcXVlc3QnLFxuICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgICAgIHVpZCxcbiAgICAgICAgICAgIH0sIHRoaXMuY2hpbGRPcmlnaW4pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FsbChwcm9wZXJ0eSwgZGF0YSkge1xuICAgICAgICAvLyBTZW5kIGluZm9ybWF0aW9uIHRvIHRoZSBjaGlsZFxuICAgICAgICB0aGlzLmNoaWxkLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHBvc3RtYXRlOiAnY2FsbCcsXG4gICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfSwgdGhpcy5jaGlsZE9yaWdpbik7XG4gICAgfVxuICAgIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudE5hbWVdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXS5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnUGFyZW50OiBEZXN0cm95aW5nIFBvc3RtYXRlIGluc3RhbmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lKTtcbiAgICB9XG59XG4vKipcbiAqIENvbXBvc2VzIGFuIEFQSSB0byBiZSB1c2VkIGJ5IHRoZSBjaGlsZFxuICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mb3JtYXRpb24gb24gdGhlIGNvbnN1bWVyXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGlsZEFQSSB7XG4gICAgbW9kZWw7XG4gICAgcGFyZW50O1xuICAgIHBhcmVudE9yaWdpbjtcbiAgICBjaGlsZDtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBpbmZvLm1vZGVsO1xuICAgICAgICB0aGlzLnBhcmVudCA9IGluZm8ucGFyZW50O1xuICAgICAgICB0aGlzLnBhcmVudE9yaWdpbiA9IGluZm8ucGFyZW50T3JpZ2luO1xuICAgICAgICB0aGlzLmNoaWxkID0gaW5mby5jaGlsZDtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFJlZ2lzdGVyaW5nIEFQSScpO1xuICAgICAgICAgICAgbG9nKCdDaGlsZDogQXdhaXRpbmcgbWVzc2FnZXMuLi4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZShlLCB0aGlzLnBhcmVudE9yaWdpbikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBSZWNlaXZlZCByZXF1ZXN0JywgZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgcHJvcGVydHksIHVpZCwgZGF0YSB9ID0gZS5kYXRhO1xuICAgICAgICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2NhbGwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluIHRoaXMubW9kZWwgJiYgdHlwZW9mIHRoaXMubW9kZWxbcHJvcGVydHldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxbcHJvcGVydHldKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXBseSB0byBQYXJlbnRcbiAgICAgICAgICAgIHJlc29sdmVWYWx1ZSh0aGlzLm1vZGVsLCBwcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICAudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zb3VyY2UucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdyZXBseScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgICAgICAgICAgICAgICB1aWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIH0sIGUub3JpZ2luKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW1pdChuYW1lLCBkYXRhKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coYENoaWxkOiBFbWl0dGluZyBFdmVudCBcIiR7bmFtZX1cImAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyZW50LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHBvc3RtYXRlOiAnZW1pdCcsXG4gICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSwgdGhpcy5wYXJlbnRPcmlnaW4pO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGVudHJ5IHBvaW50IG9mIHRoZSBQYXJlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0bWF0ZSB7XG4gICAgc3RhdGljIGRlYnVnID0gZmFsc2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICBjb250YWluZXI7XG4gICAgcGFyZW50O1xuICAgIGZyYW1lO1xuICAgIGNoaWxkO1xuICAgIGNoaWxkT3JpZ2luO1xuICAgIHVybDtcbiAgICBtb2RlbDtcbiAgICBzdGF0aWMgTW9kZWw7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdHNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gb3B0cy5jb250YWluZXI7XG4gICAgICAgIHRoaXMudXJsID0gb3B0cy51cmw7XG4gICAgICAgIHRoaXMucGFyZW50ID0gd2luZG93O1xuICAgICAgICB0aGlzLmZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgIGlmIChvcHRzLmlkKVxuICAgICAgICAgICAgdGhpcy5mcmFtZS5pZCA9IG9wdHMuaWQ7XG4gICAgICAgIGlmIChvcHRzLm5hbWUpXG4gICAgICAgICAgICB0aGlzLmZyYW1lLm5hbWUgPSBvcHRzLm5hbWU7XG4gICAgICAgIHRoaXMuZnJhbWUuY2xhc3NMaXN0LmFkZC5hcHBseSh0aGlzLmZyYW1lLmNsYXNzTGlzdCwgb3B0cy5jbGFzc0xpc3RBcnJheSB8fCBbXSk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpO1xuICAgICAgICB0aGlzLmNoaWxkID0gdGhpcy5mcmFtZS5jb250ZW50V2luZG93O1xuICAgICAgICB0aGlzLm1vZGVsID0gb3B0cy5tb2RlbCB8fCB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmVnaW5zIHRoZSBoYW5kc2hha2Ugc3RyYXRlZ3lcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIHNlbmQgYSBoYW5kc2hha2UgcmVxdWVzdCB0b1xuICAgICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlXG4gICAgICovXG4gICAgc2VuZEhhbmRzaGFrZSh1cmwpIHtcbiAgICAgICAgdXJsID0gdXJsIHx8IHRoaXMudXJsO1xuICAgICAgICBjb25zdCBjaGlsZE9yaWdpbiA9IHJlc29sdmVPcmlnaW4odXJsKTtcbiAgICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgICAgICBsZXQgcmVzcG9uc2VJbnRlcnZhbDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcGx5ID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNhbml0aXplKGUsIGNoaWxkT3JpZ2luKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdoYW5kc2hha2UtcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmVzcG9uc2VJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1BhcmVudDogUmVjZWl2ZWQgaGFuZHNoYWtlIHJlcGx5IGZyb20gQ2hpbGQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVwbHksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE9yaWdpbiA9IGUub3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IFNhdmluZyBDaGlsZCBvcmlnaW4nLCB0aGlzLmNoaWxkT3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgUGFyZW50QVBJKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTWlnaHQgbmVlZCB0byByZW1vdmUgc2luY2UgcGFyZW50IG1pZ2h0IGJlIHJlY2VpdmluZyBkaWZmZXJlbnQgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICAvLyBmcm9tIGRpZmZlcmVudCBob3N0c1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnUGFyZW50OiBJbnZhbGlkIGhhbmRzaGFrZSByZXBseScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdGYWlsZWQgaGFuZHNoYWtlJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHJlcGx5LCBmYWxzZSk7XG4gICAgICAgICAgICBjb25zdCBkb1NlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgUGFyZW50OiBTZW5kaW5nIGhhbmRzaGFrZSBhdHRlbXB0ICR7YXR0ZW1wdH1gLCB7IGNoaWxkT3JpZ2luIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgICAgICAgICAgfSwgY2hpbGRPcmlnaW4pO1xuICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID09PSBtYXhIYW5kc2hha2VSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJlc3BvbnNlSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBsb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9TZW5kKCk7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VJbnRlcnZhbCA9IHNldEludGVydmFsKGRvU2VuZCwgNTAwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkZWQpO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsb2coJ1BhcmVudDogTG9hZGluZyBmcmFtZScsIHsgdXJsIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mcmFtZS5zcmMgPSB1cmw7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGVudHJ5IHBvaW50IG9mIHRoZSBDaGlsZFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuICAgIGNoaWxkO1xuICAgIG1vZGVsO1xuICAgIHBhcmVudDtcbiAgICBwYXJlbnRPcmlnaW47XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhlIGNoaWxkLCBtb2RlbCwgcGFyZW50LCBhbmQgcmVzcG9uZHMgdG8gdGhlIFBhcmVudHMgaGFuZHNoYWtlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIEhhc2ggb2YgdmFsdWVzLCBmdW5jdGlvbnMsIG9yIHByb21pc2VzXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgVGhlIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBoYW5kc2hha2UgaGFzIGJlZW4gcmVjZWl2ZWRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbCkge1xuICAgICAgICB0aGlzLmNoaWxkID0gd2luZG93O1xuICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5jaGlsZC5wYXJlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc3BvbmRzIHRvIGEgaGFuZHNoYWtlIGluaXRpYXRlZCBieSB0aGUgUGFyZW50XG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZXMgYW4gb2JqZWN0IHRoYXQgZXhwb3NlcyBhbiBBUEkgZm9yIHRoZSBDaGlsZFxuICAgICAqL1xuICAgIHNlbmRIYW5kc2hha2VSZXBseSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNoYWtlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWUuZGF0YS5wb3N0bWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEucG9zdG1hdGUgPT09ICdoYW5kc2hha2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBSZWNlaXZlZCBoYW5kc2hha2UgZnJvbSBQYXJlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzaGFrZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDaGlsZDogU2VuZGluZyBoYW5kc2hha2UgcmVwbHkgdG8gUGFyZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZS5zb3VyY2UucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdG1hdGU6ICdoYW5kc2hha2UtcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWVzc2FnZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0sIGUub3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRPcmlnaW4gPSBlLm9yaWdpbjtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5kIG1vZGVsIHdpdGggdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRzID0gZS5kYXRhLm1vZGVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbFtrZXldID0gZGVmYXVsdHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NoaWxkOiBJbmhlcml0ZWQgYW5kIGV4dGVuZGVkIG1vZGVsIGZyb20gUGFyZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFNhdmluZyBQYXJlbnQgb3JpZ2luJywgdGhpcy5wYXJlbnRPcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG5ldyBDaGlsZEFQSSh0aGlzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ0hhbmRzaGFrZSBSZXBseSBGYWlsZWQnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmNoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzaGFrZSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIvKipcbiAqIEEgc3RvcmFnZSBiYXNlZCBvbiBsb2NhbCBmaWxlcyB1bmRlciBzcGVjaWZpYyBjb250ZXh0XG4gKi9cbmNsYXNzIExTUGx1Z2luRmlsZVN0b3JhZ2Uge1xuICAgIGN0eDtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY3R4XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY3R4KSB7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBwbHVnaW4gaWRcbiAgICAgKi9cbiAgICBnZXQgY3R4SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5iYXNlSW5mby5pZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleSBBIHN0cmluZyBhcyBmaWxlIG5hbWUgdGhhdCBzdXBwb3J0IG5lc3RlZCBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gdmFsdWUgU3RvcmFnZSB2YWx1ZVxuICAgICAqL1xuICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdHguY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICd3cml0ZS1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXksIHZhbHVlXVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbEFzeW5jKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlYWQtcGx1Z2luLXN0b3JhZ2UtZmlsZScsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZCwga2V5XVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleVxuICAgICAqL1xuICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICd1bmxpbmstcGx1Z2luLXN0b3JhZ2UtZmlsZScsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZCwga2V5XVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBzdG9yYWdlXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN0eC5jYWxsZXIuY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdjbGVhci1wbHVnaW4tc3RvcmFnZS1maWxlcycsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5jdHhJZF1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBrZXlcbiAgICAgKi9cbiAgICBoYXNJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdHguY2FsbGVyLmNhbGxBc3luYyhgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdleGlzdC1wbHVnaW4tc3RvcmFnZS1maWxlJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmN0eElkLCBrZXldXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCB7IExTUGx1Z2luRmlsZVN0b3JhZ2UgfTtcbiIsImltcG9ydCB7IGRlZXBNZXJnZSwgc2FmZXR5UGF0aEpvaW4gfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTFNQbHVnaW5DYWxsZXIgfSBmcm9tICcuL0xTUGx1Z2luLmNhbGxlcic7XG5pbXBvcnQgRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnc25ha2UtY2FzZSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgTFNQbHVnaW5GaWxlU3RvcmFnZSB9IGZyb20gJy4vbW9kdWxlcy9MU1BsdWdpbi5TdG9yYWdlJztcbmNvbnN0IFBST1hZX0NPTlRJTlVFID0gU3ltYm9sLmZvcigncHJveHktY29udGludWUnKTtcbmNvbnN0IGRlYnVnID0gRGVidWcoJ0xTUGx1Z2luOnVzZXInKTtcbi8qKlxuICogQHBhcmFtIHR5cGUgKGtleSBvZiBncm91cCBjb21tYW5kcylcbiAqIEBwYXJhbSBvcHRzXG4gKiBAcGFyYW0gYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZCh0eXBlLCBvcHRzLCBhY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHsga2V5LCBsYWJlbCwgZGVzYywgcGFsZXR0ZSwga2V5YmluZGluZyB9ID0gb3B0cztcbiAgICBjb25zdCBldmVudEtleSA9IGBTaW1wbGVDb21tYW5kSG9vayR7a2V5fSR7KytyZWdpc3RlcmVkQ21kVWlkfWA7XG4gICAgdGhpcy5FZGl0b3JbJ29uJyArIGV2ZW50S2V5XShhY3Rpb24pO1xuICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgbWV0aG9kOiAncmVnaXN0ZXItcGx1Z2luLXNpbXBsZS1jb21tYW5kJyxcbiAgICAgICAgYXJnczogW3RoaXMuYmFzZUluZm8uaWQsIFt7IGtleSwgbGFiZWwsIHR5cGUsIGRlc2MsIGtleWJpbmRpbmcgfSwgWydlZGl0b3IvaG9vaycsIGV2ZW50S2V5XV0sIHBhbGV0dGVdXG4gICAgfSk7XG59XG5jb25zdCBhcHAgPSB7XG4gICAgcmVnaXN0ZXJDb21tYW5kOiByZWdpc3RlclNpbXBsZUNvbW1hbmQsXG4gICAgcmVnaXN0ZXJDb21tYW5kUGFsZXR0ZShvcHRzLCBhY3Rpb24pIHtcbiAgICAgICAgY29uc3QgeyBrZXksIGxhYmVsLCBrZXliaW5kaW5nIH0gPSBvcHRzO1xuICAgICAgICBjb25zdCBncm91cCA9ICdnbG9iYWwtcGFsZXR0ZS1jb21tYW5kJztcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyU2ltcGxlQ29tbWFuZC5jYWxsKHRoaXMsIGdyb3VwLCB7IGtleSwgbGFiZWwsIHBhbGV0dGU6IHRydWUsIGtleWJpbmRpbmcgfSwgYWN0aW9uKTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyVUlJdGVtKHR5cGUsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgcGlkID0gdGhpcy5iYXNlSW5mby5pZDtcbiAgICAgICAgLy8gb3B0cy5rZXkgPSBgJHtwaWR9XyR7b3B0cy5rZXl9YFxuICAgICAgICB0aGlzLmNhbGxlcj8uY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdyZWdpc3Rlci1wbHVnaW4tdWktaXRlbScsXG4gICAgICAgICAgICBhcmdzOiBbcGlkLCB0eXBlLCBvcHRzXVxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyUGFnZU1lbnVJdGVtKHRhZywgYWN0aW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGFnICsgJ18nICsgdGhpcy5iYXNlSW5mby5pZDtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0YWc7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAncGFnZS1tZW51LWl0ZW0nO1xuICAgICAgICByZWdpc3RlclNpbXBsZUNvbW1hbmQuY2FsbCh0aGlzLCB0eXBlLCB7XG4gICAgICAgICAgICBrZXksIGxhYmVsXG4gICAgICAgIH0sIGFjdGlvbik7XG4gICAgfSxcbiAgICBzZXRGdWxsU2NyZWVuKGZsYWcpIHtcbiAgICAgICAgY29uc3Qgc2YgPSAoLi4uYXJncykgPT4gdGhpcy5fY2FsbFdpbignc2V0RnVsbFNjcmVlbicsIC4uLmFyZ3MpO1xuICAgICAgICBpZiAoZmxhZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxXaW4oJ2lzRnVsbFNjcmVlbicpLnRoZW4ociA9PiB7XG4gICAgICAgICAgICAgICAgciA/IHNmKCkgOiBzZih0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmxhZyA/IHNmKHRydWUpIDogc2YoKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5sZXQgcmVnaXN0ZXJlZENtZFVpZCA9IDA7XG5jb25zdCBlZGl0b3IgPSB7XG4gICAgcmVnaXN0ZXJTbGFzaENvbW1hbmQodGFnLCBhY3Rpb25zKSB7XG4gICAgICAgIGRlYnVnKCdSZWdpc3RlciBzbGFzaCBjb21tYW5kICMnLCB0aGlzLmJhc2VJbmZvLmlkLCB0YWcsIGFjdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgWydlZGl0b3IvY2xlYXItY3VycmVudC1zbGFzaCcsIGZhbHNlXSxcbiAgICAgICAgICAgICAgICBbJ2VkaXRvci9yZXN0b3JlLXNhdmVkLWN1cnNvciddLFxuICAgICAgICAgICAgICAgIFsnZWRpdG9yL2hvb2snLCBhY3Rpb25zXVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICBhY3Rpb25zID0gYWN0aW9ucy5tYXAoKGl0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbdGFnLCAuLi5hcmdzXSA9IGl0O1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdlZGl0b3IvaG9vayc6XG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm4gPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRLZXkgPSBgU2xhc2hDb21tYW5kSG9vayR7dGFnfSR7KytyZWdpc3RlcmVkQ21kVWlkfWA7XG4gICAgICAgICAgICAgICAgICAgIGl0WzFdID0gZXZlbnRLZXk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGNvbW1hbmQgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5FZGl0b3JbJ29uJyArIGV2ZW50S2V5XShmbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhbGxlcj8uY2FsbChgYXBpOmNhbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdyZWdpc3Rlci1wbHVnaW4tc2xhc2gtY29tbWFuZCcsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5iYXNlSW5mby5pZCwgW3RhZywgYWN0aW9uc11dXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJCbG9ja0NvbnRleHRNZW51SXRlbSh0YWcsIGFjdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IHRhZyArICdfJyArIHRoaXMuYmFzZUluZm8uaWQ7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGFnO1xuICAgICAgICBjb25zdCB0eXBlID0gJ2Jsb2NrLWNvbnRleHQtbWVudS1pdGVtJztcbiAgICAgICAgcmVnaXN0ZXJTaW1wbGVDb21tYW5kLmNhbGwodGhpcywgdHlwZSwge1xuICAgICAgICAgICAga2V5LCBsYWJlbFxuICAgICAgICB9LCBhY3Rpb24pO1xuICAgIH0sXG4gICAgc2Nyb2xsVG9CbG9ja0luUGFnZShwYWdlTmFtZSwgYmxvY2tJZCkge1xuICAgICAgICBjb25zdCBhbmNob3IgPSBgYmxvY2stY29udGVudC1gICsgYmxvY2tJZDtcbiAgICAgICAgdGhpcy5BcHAucHVzaFN0YXRlKCdwYWdlJywgeyBuYW1lOiBwYWdlTmFtZSB9LCB7IGFuY2hvciB9KTtcbiAgICB9XG59O1xuY29uc3QgZGIgPSB7fTtcbmNvbnN0IEtFWV9NQUlOX1VJID0gMDtcbi8qKlxuICogVXNlciBwbHVnaW4gaW5zdGFuY2VcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIExTUGx1Z2luVXNlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX2Jhc2VJbmZvO1xuICAgIF9jYWxsZXI7XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogdWkgZnJhbWUgaWRlbnRpdGllc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VpID0gbmV3IE1hcCgpO1xuICAgIF9maWxlU3RvcmFnZTtcbiAgICAvKipcbiAgICAgKiBoYW5kbGVyIG9mIGJlZm9yZSB1bmxvYWQgcGx1Z2luXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYmVmb3JldW5sb2FkQ2FsbGJhY2s7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIF9iYXNlSW5mb1xuICAgICAqIEBwYXJhbSBfY2FsbGVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX2Jhc2VJbmZvLCBfY2FsbGVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2Jhc2VJbmZvID0gX2Jhc2VJbmZvO1xuICAgICAgICB0aGlzLl9jYWxsZXIgPSBfY2FsbGVyO1xuICAgICAgICBfY2FsbGVyLm9uKCdzeXM6dWk6dmlzaWJsZScsIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZD8udG9nZ2xlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVNYWluVUkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIF9jYWxsZXIub24oJ3NldHRpbmdzOmNoYW5nZWQnLCAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYiA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgY29uc3QgYSA9IE9iamVjdC5hc3NpZ24odGhpcy5fYmFzZUluZm8uc2V0dGluZ3MsIHBheWxvYWQpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdzZXR0aW5nczpjaGFuZ2VkJywgeyAuLi5hIH0sIGIpO1xuICAgICAgICB9KTtcbiAgICAgICAgX2NhbGxlci5vbignYmVmb3JldW5sb2FkJywgYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWN0b3IsIC4uLnJlc3QgfSA9IHBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBjYiA9IHRoaXMuX2JlZm9yZXVubG9hZENhbGxiYWNrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjYiAmJiBhd2FpdCBjYihyZXN0KTtcbiAgICAgICAgICAgICAgICBhY3Rvcj8ucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgJHtfY2FsbGVyLmRlYnVnVGFnfSBbYmVmb3JldW5sb2FkXSBgLCBlKTtcbiAgICAgICAgICAgICAgICBhY3Rvcj8ucmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW9kdWxlc1xuICAgICAgICB0aGlzLl9maWxlU3RvcmFnZSA9IG5ldyBMU1BsdWdpbkZpbGVTdG9yYWdlKHRoaXMpO1xuICAgIH1cbiAgICBhc3luYyByZWFkeShtb2RlbCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG1vZGVsO1xuICAgICAgICAgICAgICAgIG1vZGVsID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFzZUluZm8gPSBhd2FpdCB0aGlzLl9jYWxsZXIuY29ubmVjdFRvUGFyZW50KG1vZGVsKTtcbiAgICAgICAgICAgIGJhc2VJbmZvID0gZGVlcE1lcmdlKHRoaXMuX2Jhc2VJbmZvLCBiYXNlSW5mbyk7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGJhc2VJbmZvPy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxlci5kZWJ1Z1RhZyA9IGAjJHtiYXNlSW5mby5pZH0gWyR7YmFzZUluZm8ubmFtZX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrLmNhbGwodGhpcywgYmFzZUluZm8pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbTFNQbHVnaW4gUmVhZHkgRXJyb3JdJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5zdXJlQ29ubmVjdGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgY29ubmVjdGVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmVmb3JldW5sb2FkKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2JlZm9yZXVubG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIHByb3ZpZGVNb2RlbChtb2RlbCkge1xuICAgICAgICB0aGlzLmNhbGxlci5fZXh0ZW5kVXNlck1vZGVsKG1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByb3ZpZGVUaGVtZSh0aGVtZSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdwcm92aWRlcjp0aGVtZScsIHRoZW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByb3ZpZGVTdHlsZShzdHlsZSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdwcm92aWRlcjpzdHlsZScsIHN0eWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByb3ZpZGVVSSh1aSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdwcm92aWRlcjp1aScsIHVpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZVNldHRpbmdzKGF0dHJzKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3NldHRpbmdzOnVwZGF0ZScsIGF0dHJzKTtcbiAgICAgICAgLy8gVE9ETzogdXBkYXRlIGFzc29jaWF0ZWQgYmFzZUluZm8gc2V0dGluZ3NcbiAgICB9XG4gICAgc2V0TWFpblVJQXR0cnMoYXR0cnMpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTphdHRycycsIGF0dHJzKTtcbiAgICB9XG4gICAgc2V0TWFpblVJSW5saW5lU3R5bGUoc3R5bGUpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTpzdHlsZScsIHN0eWxlKTtcbiAgICB9XG4gICAgaGlkZU1haW5VSShvcHRzKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IGtleTogS0VZX01BSU5fVUksIHZpc2libGU6IGZhbHNlLCBjdXJzb3I6IG9wdHM/LnJlc3RvcmVFZGl0aW5nQ3Vyc29yIH07XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ21haW4tdWk6dmlzaWJsZScsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLmVtaXQoJ3VpOnZpc2libGU6Y2hhbmdlZCcsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLl91aS5zZXQocGF5bG9hZC5rZXksIHBheWxvYWQpO1xuICAgIH1cbiAgICBzaG93TWFpblVJKCkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0geyBrZXk6IEtFWV9NQUlOX1VJLCB2aXNpYmxlOiB0cnVlIH07XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ21haW4tdWk6dmlzaWJsZScsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLmVtaXQoJ3VpOnZpc2libGU6Y2hhbmdlZCcsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLl91aS5zZXQocGF5bG9hZC5rZXksIHBheWxvYWQpO1xuICAgIH1cbiAgICB0b2dnbGVNYWluVUkoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IGtleTogS0VZX01BSU5fVUksIHRvZ2dsZTogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3VpLmdldChwYXlsb2FkLmtleSk7XG4gICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS52aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVNYWluVUkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd01haW5VSSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpc01haW5VSVZpc2libGUoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fdWkuZ2V0KEtFWV9NQUlOX1VJKTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oc3RhdGUgJiYgc3RhdGUudmlzaWJsZSk7XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0ZWQ7XG4gICAgfVxuICAgIGdldCBiYXNlSW5mbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VJbmZvO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VJbmZvPy5zZXR0aW5ncztcbiAgICB9XG4gICAgZ2V0IGNhbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxlcjtcbiAgICB9XG4gICAgcmVzb2x2ZVJlc291cmNlRnVsbFVybChmaWxlUGF0aCkge1xuICAgICAgICB0aGlzLmVuc3VyZUNvbm5lY3RlZCgpO1xuICAgICAgICBpZiAoIWZpbGVQYXRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoL15bLlxcXFwvXSsvLCAnJyk7XG4gICAgICAgIHJldHVybiBzYWZldHlQYXRoSm9pbih0aGlzLl9iYXNlSW5mby5sc3IsIGZpbGVQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX21ha2VVc2VyUHJveHkodGFyZ2V0LCB0YWcpIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbGxlciA9IHRoaXMuY2FsbGVyO1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICAgICAgZ2V0KHRhcmdldCwgcHJvcEtleSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnTWV0aG9kID0gdGFyZ2V0W3Byb3BLZXldO1xuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ01ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gb3JpZ01ldGhvZC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT09IFBST1hZX0NPTlRJTlVFKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaG9va1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob29rTWF0Y2hlciA9IHByb3BLZXkudG9TdHJpbmcoKS5tYXRjaCgvXihvbmNlfG9mZnxvbikvaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9va01hdGNoZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGYgPSBob29rTWF0Y2hlclswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBob29rTWF0Y2hlci5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gcy5zbGljZShmLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGBob29rOiR7dGFnfToke3NuYWtlQ2FzZShlKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcltmXSh0eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiAhPT0gJ29mZicgPyAoKSA9PiAoY2FsbGVyLm9mZih0eXBlLCBoYW5kbGVyKSkgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbCBob3N0XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsZXIuY2FsbEFzeW5jKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgbWV0aG9kOiBwcm9wS2V5LCBhcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYXJnc1xuICAgICAqL1xuICAgIF9jYWxsV2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxlci5jYWxsQXN5bmMoYGFwaTpjYWxsYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnX2NhbGxNYWluV2luJyxcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3NcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcmZhY2UgbWV0aG9kcyBvZiB7QGxpbmsgSUFwcFByb3h5fVxuICAgICAqL1xuICAgIGdldCBBcHAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlVXNlclByb3h5KGFwcCwgJ2FwcCcpO1xuICAgIH1cbiAgICBnZXQgRWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVVzZXJQcm94eShlZGl0b3IsICdlZGl0b3InKTtcbiAgICB9XG4gICAgZ2V0IERCKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVVzZXJQcm94eShkYik7XG4gICAgfVxuICAgIGdldCBGaWxlU3RvcmFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVTdG9yYWdlO1xuICAgIH1cbn1cbmV4cG9ydCAqIGZyb20gJy4vTFNQbHVnaW4nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2luVXNlckluc3RhbmNlKHBsdWdpbkJhc2VJbmZvLCBwbHVnaW5DYWxsZXIpIHtcbiAgICByZXR1cm4gbmV3IExTUGx1Z2luVXNlcihwbHVnaW5CYXNlSW5mbywgcGx1Z2luQ2FsbGVyKTtcbn1cbmlmICh3aW5kb3cuX19MU1BfX0hPU1RfXyA9PSBudWxsKSB7IC8vIEVudHJ5IG9mIGlmcmFtZSBtb2RlXG4gICAgY29uc3QgY2FsbGVyID0gbmV3IExTUGx1Z2luQ2FsbGVyKG51bGwpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubG9nc2VxID0gc2V0dXBQbHVnaW5Vc2VySW5zdGFuY2Uoe30sIGNhbGxlcik7XG59XG4iLCJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgTFNQbHVnaW5Vc2VyIH0gZnJvbSAnLi9MU1BsdWdpbi51c2VyJztcbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHsgaW1wb3J0SFRNTCwgY3JlYXRlU2FuZGJveENvbnRhaW5lciB9ID0gd2luZG93LlFTYW5kYm94IHx8IHt9O1xuZnVuY3Rpb24gdXNlckZldGNoKHVybCwgb3B0cykge1xuICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnZmlsZTovLycsICcnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHdpbmRvdy5hcGlzLmRvQWN0aW9uKFsncmVhZEZpbGUnLCB1cmxdKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoKHVybCwgb3B0cyk7XG59XG5jbGFzcyBMU1BsdWdpblNoYWRvd0ZyYW1lIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfcGx1Z2luTG9jYWw7XG4gICAgX2ZyYW1lO1xuICAgIF9yb290O1xuICAgIF9sb2FkZWQgPSBmYWxzZTtcbiAgICBfdW5tb3VudEZucyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKF9wbHVnaW5Mb2NhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbCA9IF9wbHVnaW5Mb2NhbDtcbiAgICAgICAgX3BsdWdpbkxvY2FsLl9kaXNwb3NlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VubW91bnQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgZW50cnkgfSA9IHRoaXMuX3BsdWdpbkxvY2FsLm9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCB8fCAhZW50cnkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHsgdGVtcGxhdGUsIGV4ZWNTY3JpcHRzIH0gPSBhd2FpdCBpbXBvcnRIVE1MKGVudHJ5LCB7IGZldGNoOiB1c2VyRmV0Y2ggfSk7XG4gICAgICAgIHRoaXMuX21vdW50KHRlbXBsYXRlLCBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgY29uc3Qgc2FuZGJveCA9IGNyZWF0ZVNhbmRib3hDb250YWluZXIobmFtZSwge1xuICAgICAgICAgICAgZWxlbWVudEdldHRlcjogKCkgPT4gdGhpcy5fcm9vdD8uZmlyc3RDaGlsZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGdsb2JhbCA9IHNhbmRib3guaW5zdGFuY2UucHJveHk7XG4gICAgICAgIGdsb2JhbC5fX3NoYWRvd19tb2RlX18gPSB0cnVlO1xuICAgICAgICBnbG9iYWwuTFNQbHVnaW5Mb2NhbCA9IHRoaXMuX3BsdWdpbkxvY2FsO1xuICAgICAgICBnbG9iYWwuTFNQbHVnaW5TaGFkb3cgPSB0aGlzO1xuICAgICAgICBnbG9iYWwuTFNQbHVnaW5Vc2VyID0gZ2xvYmFsLmxvZ3NlcSA9IG5ldyBMU1BsdWdpblVzZXIodGhpcy5fcGx1Z2luTG9jYWwudG9KU09OKCksIHRoaXMuX3BsdWdpbkxvY2FsLmNhbGxlcik7XG4gICAgICAgIC8vIFRPRE86IHttb3VudCwgdW5tb3VudH1cbiAgICAgICAgY29uc3QgZXhlY1Jlc3VsdCA9IGF3YWl0IGV4ZWNTY3JpcHRzKGdsb2JhbCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3VubW91bnRGbnMucHVzaChleGVjUmVzdWx0LnVubW91bnQpO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgIH1cbiAgICBfbW91bnQoY29udGVudCwgY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZnJhbWUuY2xhc3NMaXN0LmFkZCgnbHNwLXNoYWRvdy1zYW5kYm94Jyk7XG4gICAgICAgIGZyYW1lLmlkID0gdGhpcy5fcGx1Z2luTG9jYWwuaWQ7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBmcmFtZS5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIHRoaXMuX3Jvb3QuaW5uZXJIVE1MID0gYDxkaXY+JHtjb250ZW50fTwvZGl2PmA7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmcmFtZSk7XG4gICAgICAgIHRoaXMuZW1pdCgnbW91bnRlZCcpO1xuICAgIH1cbiAgICBfdW5tb3VudCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLl91bm1vdW50Rm5zKSB7XG4gICAgICAgICAgICBmbiAmJiBmbi5jYWxsKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZnJhbWU/LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuZnJhbWUpO1xuICAgIH1cbiAgICBnZXQgbG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cbiAgICBnZXQgZG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290Py5maXJzdENoaWxkO1xuICAgIH1cbiAgICBnZXQgZnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mcmFtZTtcbiAgICB9XG59XG5leHBvcnQgeyBMU1BsdWdpblNoYWRvd0ZyYW1lIH07XG4iLCJpbXBvcnQgRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgUG9zdG1hdGUsIE1vZGVsIH0gZnJvbSAnLi9wb3N0bWF0ZSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IHsgZGVmZXJyZWQsIElTX0RFViB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBMU1BsdWdpblNoYWRvd0ZyYW1lIH0gZnJvbSAnLi9MU1BsdWdpbi5zaGFkb3cnO1xuY29uc3QgZGVidWcgPSBEZWJ1ZygnTFNQbHVnaW46Y2FsbGVyJyk7XG5leHBvcnQgY29uc3QgRkxBR19BV0FJVCA9ICcjYXdhaXQjcmVzcG9uc2UjJztcbmV4cG9ydCBjb25zdCBMU1BNU0cgPSAnI2xzcG1zZyMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19FUlJPUl9UQUcgPSAnI2xzcG1zZyNlcnJvciMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19TRVRUSU5HUyA9ICcjbHNwbXNnI3NldHRpbmdzIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX0JFRk9SRV9VTkxPQUQgPSAnI2xzcG1zZyNiZWZvcmV1bmxvYWQjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfU1lOQyA9ICcjbHNwbXNnI3JlcGx5Iyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX1JFQURZID0gJyNsc3Btc2cjcmVhZHkjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dGbiA9IChpZCkgPT4gYCR7TFNQTVNHfSR7aWR9YDtcbmV4cG9ydCBjb25zdCBBV0FJVF9MU1BNU0dGbiA9IChpZCkgPT4gYCR7RkxBR19BV0FJVH0ke2lkfWA7XG4vKipcbiAqIENhbGwgYmV0d2VlbiBjb3JlIGFuZCB1c2VyXG4gKi9cbmNsYXNzIExTUGx1Z2luQ2FsbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfcGx1Z2luTG9jYWw7XG4gICAgX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIF9wYXJlbnQ7XG4gICAgX2NoaWxkO1xuICAgIF9zaGFkb3c7XG4gICAgX3N0YXR1cztcbiAgICBfdXNlck1vZGVsID0ge307XG4gICAgX2NhbGw7XG4gICAgX2NhbGxVc2VyTW9kZWw7XG4gICAgX2RlYnVnVGFnID0gJyc7XG4gICAgY29uc3RydWN0b3IoX3BsdWdpbkxvY2FsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsID0gX3BsdWdpbkxvY2FsO1xuICAgICAgICBpZiAoX3BsdWdpbkxvY2FsKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1Z1RhZyA9IF9wbHVnaW5Mb2NhbC5kZWJ1Z1RhZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBjb25uZWN0VG9DaGlsZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBzaGFkb3cgfSA9IHRoaXMuX3BsdWdpbkxvY2FsO1xuICAgICAgICBpZiAoc2hhZG93KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXR1cFNoYWRvd1NhbmRib3goKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldHVwSWZyYW1lU2FuZGJveCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHJ1biBpbiBzYW5kYm94XG4gICAgYXN5bmMgY29ubmVjdFRvUGFyZW50KHVzZXJNb2RlbCA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl9jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGNhbGxlciA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGlzU2hhZG93TW9kZSA9IHRoaXMuX3BsdWdpbkxvY2FsICE9IG51bGw7XG4gICAgICAgIGxldCBzeW5jR0NUaW1lciA9IDA7XG4gICAgICAgIGxldCBzeW5jVGFnID0gMDtcbiAgICAgICAgY29uc3Qgc3luY0FjdG9ycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgcmVhZHlEZWZlcnJlZCA9IGRlZmVycmVkKDEwMDAgKiA1KTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9leHRlbmRVc2VyTW9kZWwoe1xuICAgICAgICAgICAgW0xTUE1TR19SRUFEWV06IGFzeW5jIChiYXNlSW5mbykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGR5bmFtaWNhbGx5IHNldHVwIGNvbW1vbiBtc2cgaGFuZGxlclxuICAgICAgICAgICAgICAgIG1vZGVsW0xTUE1TR0ZuKGJhc2VJbmZvPy5waWQpXSA9ICh7IHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgW2NhbGwgZnJvbSBob3N0IChfY2FsbCldICR7dGhpcy5fZGVidWdUYWd9YCwgdHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhvc3QuX2NhbGwgd2l0aG91dCBhc3luY1xuICAgICAgICAgICAgICAgICAgICBjYWxsZXIuZW1pdCh0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtMU1BNU0dfQkVGT1JFX1VOTE9BRF06IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0b3IgPSBkZWZlcnJlZCgxMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KCdiZWZvcmV1bmxvYWQnLCBPYmplY3QuYXNzaWduKHsgYWN0b3IgfSwgZSkpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGFjdG9yLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR19TRVRUSU5HU106IGFzeW5jICh7IHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxlci5lbWl0KCdzZXR0aW5nczpjaGFuZ2VkJywgcGF5bG9hZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR106IGFzeW5jICh7IG5zLCB0eXBlLCBwYXlsb2FkIH0pID0+IHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhgW2NhbGwgZnJvbSBob3N0IChhc3luYyldICR7dGhpcy5fZGVidWdUYWd9YCwgbnMsIHR5cGUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGlmIChucyAmJiBucy5zdGFydHNXaXRoKCdob29rJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQoYCR7bnN9OiR7dHlwZX1gLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsZXIuZW1pdCh0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTFNQTVNHX1NZTkNdOiAoeyBfc3luYywgcmVzdWx0IH0pID0+IHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhgW3N5bmMgcmVwbHldICMke19zeW5jfWAsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHN5bmNBY3RvcnMuaGFzKF9zeW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RvciA9IHN5bmNBY3RvcnMuZ2V0KF9zeW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5oYXNPd25Qcm9wZXJ0eShMU1BNU0dfRVJST1JfVEFHKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdG9yLnJlamVjdChyZXN1bHRbTFNQTVNHX0VSUk9SX1RBR10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0b3IucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3luY0FjdG9ycy5kZWxldGUoX3N5bmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLnVzZXJNb2RlbFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzU2hhZG93TW9kZSkge1xuICAgICAgICAgICAgYXdhaXQgcmVhZHlEZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5fcGx1Z2luTG9jYWw/LnRvSlNPTigpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG0gPSBuZXcgTW9kZWwobW9kZWwpO1xuICAgICAgICBjb25zdCBoYW5kc2hha2UgPSBwbS5zZW5kSGFuZHNoYWtlUmVwbHkoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICBhd2FpdCBoYW5kc2hha2UudGhlbigocmVmUGFyZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jaGlsZCA9IHJlZlBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9jYWxsID0gYXN5bmMgKHR5cGUsIHBheWxvYWQgPSB7fSwgYWN0b3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnID0gKytzeW5jVGFnO1xuICAgICAgICAgICAgICAgICAgICBzeW5jQWN0b3JzLnNldCh0YWcsIGFjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5fc3luYyA9IHRhZztcbiAgICAgICAgICAgICAgICAgICAgYWN0b3Iuc2V0VGFnKGBhc3luYyBjYWxsICMke3RhZ31gKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2FzeW5jIGNhbGwgIycsIHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlZlBhcmVudC5lbWl0KExTUE1TR0ZuKG1vZGVsLmJhc2VJbmZvLmlkKSwgeyB0eXBlLCBwYXlsb2FkIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rvcj8ucHJvbWlzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9jYWxsVXNlck1vZGVsID0gYXN5bmMgKHR5cGUsIHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFt0eXBlXShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoYFttb2RlbCBtZXRob2RdICMke3R5cGV9IG5vdCBleGlzdGVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGFjdG9ycyBHQ1xuICAgICAgICAgICAgc3luY0dDVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN5bmNBY3RvcnMuc2l6ZSA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBzeW5jQWN0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5zZXR0bGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY0FjdG9ycy5kZWxldGUoayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDAwICogNjAgKiAzMCk7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgcmVhZHlEZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICByZXR1cm4gbW9kZWwuYmFzZUluZm87XG4gICAgfVxuICAgIGFzeW5jIGNhbGwodHlwZSwgcGF5bG9hZCA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsPy5jYWxsKHRoaXMsIHR5cGUsIHBheWxvYWQpO1xuICAgIH1cbiAgICBhc3luYyBjYWxsQXN5bmModHlwZSwgcGF5bG9hZCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGFjdG9yID0gZGVmZXJyZWQoMTAwMCAqIDEwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGw/LmNhbGwodGhpcywgdHlwZSwgcGF5bG9hZCwgYWN0b3IpO1xuICAgIH1cbiAgICBhc3luYyBjYWxsVXNlck1vZGVsKHR5cGUsIHBheWxvYWQgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJNb2RlbD8uY2FsbCh0aGlzLCB0eXBlLCBwYXlsb2FkKTtcbiAgICB9XG4gICAgLy8gcnVuIGluIGhvc3RcbiAgICBhc3luYyBfc2V0dXBJZnJhbWVTYW5kYm94KCkge1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuX3BsdWdpbkxvY2FsO1xuICAgICAgICBjb25zdCBpZCA9IHBsLmlkO1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBsLm9wdGlvbnMuZW50cnkpO1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zXG4gICAgICAgICAgICAuc2V0KGBfX3ZfX2AsIElTX0RFViA/IERhdGUubm93KCkudG9TdHJpbmcoKSA6IHBsLm9wdGlvbnMudmVyc2lvbik7XG4gICAgICAgIC8vIGNsZWFyIHpvbWJpZSBzYW5kYm94XG4gICAgICAgIGNvbnN0IHpiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7aWR9YCk7XG4gICAgICAgIGlmICh6YilcbiAgICAgICAgICAgIHpiLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoemIpO1xuICAgICAgICBjb25zdCBjbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY250LmNsYXNzTGlzdC5hZGQoJ2xzcC1pZnJhbWUtc2FuZGJveC1jb250YWluZXInKTtcbiAgICAgICAgY250LmlkID0gaWQ7XG4gICAgICAgIC8vIFRPRE86IGFwcGx5IGFueSBjb250YWluZXIgbGF5b3V0IGRhdGFcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgbWFpbkxheW91dEluZm8gPSB0aGlzLl9wbHVnaW5Mb2NhbC5zZXR0aW5ncy5nZXQoJ2xheW91dCcpPy5bMF07XG4gICAgICAgICAgICBpZiAobWFpbkxheW91dEluZm8pIHtcbiAgICAgICAgICAgICAgICBjbnQuZGF0YXNldC5pbml0ZWRfbGF5b3V0ID0gJ3RydWUnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wIH0gPSBtYWluTGF5b3V0SW5mbztcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggKyAncHgnLCBoZWlnaHQ6IGhlaWdodCArICdweCcsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQgKyAncHgnLCB0b3A6IHRvcCArICdweCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNudCk7XG4gICAgICAgIGNvbnN0IHB0ID0gbmV3IFBvc3RtYXRlKHtcbiAgICAgICAgICAgIGlkOiBpZCArICdfaWZyYW1lJywgY29udGFpbmVyOiBjbnQsIHVybDogdXJsLmhyZWYsXG4gICAgICAgICAgICBjbGFzc0xpc3RBcnJheTogWydsc3AtaWZyYW1lLXNhbmRib3gnXSxcbiAgICAgICAgICAgIG1vZGVsOiB7IGJhc2VJbmZvOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBsLnRvSlNPTigpKSkgfVxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGhhbmRzaGFrZSA9IHB0LnNlbmRIYW5kc2hha2UoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAvLyB0aW1lb3V0IGZvciBoYW5kc2hha2VcbiAgICAgICAgbGV0IHRpbWVyO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBoYW5kc2hha2UgVGltZW91dGApKTtcbiAgICAgICAgICAgIH0sIDMgKiAxMDAwKTsgLy8gM3NlY3NcbiAgICAgICAgICAgIGhhbmRzaGFrZS50aGVuKChyZWZDaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHJlZkNoaWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICByZWZDaGlsZC5vbihMU1BNU0dGbihwbC5pZCksICh7IHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgW2NhbGwgZnJvbSBwbHVnaW5dIGAsIHR5cGUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbD8uZW1pdCh0eXBlLCBwYXlsb2FkIHx8IHt9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsID0gYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGFsbCB3aWxsIGdldCBtZXNzYWdlIGJlZm9yZSBoYW5kc2hha2VkXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlZkNoaWxkLmNhbGwoTFNQTVNHRm4ocGwuaWQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhcmdzWzBdLCBwYXlsb2FkOiBPYmplY3QuYXNzaWduKGFyZ3NbMV0gfHwge30sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkJHBpZDogcGwuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJNb2RlbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoRkxBR19BV0FJVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGF0dGFjaCBwYXlsb2FkIHdpdGggbWV0aG9kIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWZDaGlsZC5nZXQodHlwZS5yZXBsYWNlKEZMQUdfQVdBSVQsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZDaGlsZC5jYWxsKHR5cGUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgIGRlYnVnKCdbaWZyYW1lIHNhbmRib3hdIGVycm9yJywgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF9zZXR1cFNoYWRvd1NhbmRib3goKSB7XG4gICAgICAgIGNvbnN0IHBsID0gdGhpcy5fcGx1Z2luTG9jYWw7XG4gICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuX3NoYWRvdyA9IG5ldyBMU1BsdWdpblNoYWRvd0ZyYW1lKHBsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9ICdwZW5kaW5nJztcbiAgICAgICAgICAgIGF3YWl0IHNoYWRvdy5sb2FkKCk7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGwgPSBhc3luYyAodHlwZSwgcGF5bG9hZCA9IHt9LCBhY3RvcikgPT4ge1xuICAgICAgICAgICAgICAgIGFjdG9yICYmIChwYXlsb2FkLmFjdG9yID0gYWN0b3IpO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgQ2FsbCBpbiBzYW1lIHRocmVhZFxuICAgICAgICAgICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsPy5lbWl0KHR5cGUsIE9iamVjdC5hc3NpZ24ocGF5bG9hZCwge1xuICAgICAgICAgICAgICAgICAgICAkJHBpZDogcGwuaWRcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdG9yPy5wcm9taXNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxVc2VyTW9kZWwgPSBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gYXJnc1swXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZT8uc3RhcnRzV2l0aChGTEFHX0FXQUlUKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS5yZXBsYWNlKEZMQUdfQVdBSVQsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGFyZ3NbMV0gfHwge307XG4gICAgICAgICAgICAgICAgY29uc3QgZm4gPSB0aGlzLl91c2VyTW9kZWxbdHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmbi5jYWxsKG51bGwsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbc2hhZG93IHNhbmRib3hdIGVycm9yJywgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9leHRlbmRVc2VyTW9kZWwobW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlck1vZGVsLCBtb2RlbCk7XG4gICAgfVxuICAgIF9nZXRTYW5kYm94SWZyYW1lQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Py5mcmFtZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICBfZ2V0U2FuZGJveFNoYWRvd0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NoYWRvdz8uZnJhbWUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgX2dldFNhbmRib3hJZnJhbWVSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Py5mcmFtZTtcbiAgICB9XG4gICAgX2dldFNhbmRib3hTaGFkb3dSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hhZG93Py5mcmFtZTtcbiAgICB9XG4gICAgc2V0IGRlYnVnVGFnKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnVGFnID0gdmFsdWU7XG4gICAgfVxuICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIGxldCByb290ID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xuICAgICAgICAgICAgcm9vdCA9IHRoaXMuX2dldFNhbmRib3hJZnJhbWVDb250YWluZXIoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3BhcmVudC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NoYWRvdykge1xuICAgICAgICAgICAgcm9vdCA9IHRoaXMuX2dldFNhbmRib3hTaGFkb3dDb250YWluZXIoKTtcbiAgICAgICAgICAgIHRoaXMuX3NoYWRvdy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdD8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyb290KTtcbiAgICB9XG59XG5leHBvcnQgeyBMU1BsdWdpbkNhbGxlciB9O1xuIiwiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IGRlZXBNZXJnZSwgc2V0dXBJbmplY3RlZFN0eWxlLCBnZW5JRCwgc2V0dXBJbmplY3RlZFRoZW1lLCBzZXR1cEluamVjdGVkVUksIGRlZmVycmVkLCBpbnZva2VIb3N0RXhwb3J0ZWRBcGksIGlzT2JqZWN0LCB3aXRoRmlsZVByb3RvY29sLCBnZXRTREtQYXRoUm9vdCwgUFJPVE9DT0xfRklMRSwgVVJMX0xTUCwgc2FmZXR5UGF0aEpvaW4sIHBhdGgsIHNhZmV0eVBhdGhOb3JtYWxpemUgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgcGx1Z2luSGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IExTUGx1Z2luQ2FsbGVyLCBMU1BNU0dfUkVBRFksIExTUE1TR19TWU5DLCBMU1BNU0csIExTUE1TR19TRVRUSU5HUywgTFNQTVNHX0VSUk9SX1RBRywgTFNQTVNHX0JFRk9SRV9VTkxPQUQsIEFXQUlUX0xTUE1TR0ZuIH0gZnJvbSAnLi9MU1BsdWdpbi5jYWxsZXInO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnc25ha2UtY2FzZSc7XG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdMU1BsdWdpbjpjb3JlJyk7XG5jb25zdCBESVJfUExVR0lOUyA9ICdwbHVnaW5zJztcbi8qKlxuICogVXNlciBzZXR0aW5nc1xuICovXG5jbGFzcyBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3VzZXJQbHVnaW5TZXR0aW5ncztcbiAgICBfc2V0dGluZ3MgPSB7XG4gICAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gICAgY29uc3RydWN0b3IoX3VzZXJQbHVnaW5TZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl91c2VyUGx1Z2luU2V0dGluZ3MgPSBfdXNlclBsdWdpblNldHRpbmdzO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX3NldHRpbmdzLCBfdXNlclBsdWdpblNldHRpbmdzKTtcbiAgICB9XG4gICAgZ2V0KGspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzW2tdO1xuICAgIH1cbiAgICBzZXQoaywgdikge1xuICAgICAgICBjb25zdCBvID0gZGVlcE1lcmdlKHt9LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIGlmICh0eXBlb2YgayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXR0aW5nc1trXSA9PSB2KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzW2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdChrKSkge1xuICAgICAgICAgICAgZGVlcE1lcmdlKHRoaXMuX3NldHRpbmdzLCBrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3NldHRpbmdzKSwgbyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICAgIH1cbn1cbmNsYXNzIFBsdWdpbkxvZ2dlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgX3RhZztcbiAgICBfbG9ncyA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKF90YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdGFnID0gX3RhZztcbiAgICB9XG4gICAgd3JpdGUodHlwZSwgcGF5bG9hZCkge1xuICAgICAgICBsZXQgbXNnID0gcGF5bG9hZC5yZWR1Y2UoKGFjLCBpdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ICYmIGl0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBhYyArPSBgJHtpdC5tZXNzYWdlfSAke2l0LnN0YWNrfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhYyArPSBpdC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjO1xuICAgICAgICB9LCBgWyR7dGhpcy5fdGFnfV1bJHtuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpfV0gYCk7XG4gICAgICAgIHRoaXMuX2xvZ3MucHVzaChbdHlwZSwgbXNnXSk7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9sb2dzID0gW107XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyk7XG4gICAgfVxuICAgIGluZm8oLi4uYXJncykge1xuICAgICAgICB0aGlzLndyaXRlKCdJTkZPJywgYXJncyk7XG4gICAgfVxuICAgIGVycm9yKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZSgnRVJST1InLCBhcmdzKTtcbiAgICB9XG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGUoJ1dBUk4nLCBhcmdzKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9ncztcbiAgICB9XG59XG52YXIgUGx1Z2luTG9jYWxMb2FkU3RhdHVzO1xuKGZ1bmN0aW9uIChQbHVnaW5Mb2NhbExvYWRTdGF0dXMpIHtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJMT0FESU5HXCJdID0gXCJsb2FkaW5nXCI7XG4gICAgUGx1Z2luTG9jYWxMb2FkU3RhdHVzW1wiVU5MT0FESU5HXCJdID0gXCJ1bmxvYWRpbmdcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJMT0FERURcIl0gPSBcImxvYWRlZFwiO1xuICAgIFBsdWdpbkxvY2FsTG9hZFN0YXR1c1tcIlVOTE9BREVEXCJdID0gXCJ1bmxvYWRcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJFUlJPUlwiXSA9IFwiZXJyb3JcIjtcbn0pKFBsdWdpbkxvY2FsTG9hZFN0YXR1cyB8fCAoUGx1Z2luTG9jYWxMb2FkU3RhdHVzID0ge30pKTtcbmZ1bmN0aW9uIGluaXRVc2VyU2V0dGluZ3NIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGNvbnN0IF8gPSAobGFiZWwpID0+IGBzZXR0aW5nczoke2xhYmVsfWA7XG4gICAgcGx1Z2luTG9jYWwub24oXygndXBkYXRlJyksIChhdHRycykgPT4ge1xuICAgICAgICBpZiAoIWF0dHJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBwbHVnaW5Mb2NhbC5zZXR0aW5ncz8uc2V0KGF0dHJzKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRNYWluVUlIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGNvbnN0IF8gPSAobGFiZWwpID0+IGBtYWluLXVpOiR7bGFiZWx9YDtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd2aXNpYmxlJyksICh7IHZpc2libGUsIHRvZ2dsZSwgY3Vyc29yIH0pID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBwbHVnaW5Mb2NhbC5nZXRNYWluVUlDb250YWluZXIoKTtcbiAgICAgICAgZWw/LmNsYXNzTGlzdFt0b2dnbGUgPyAndG9nZ2xlJyA6ICh2aXNpYmxlID8gJ2FkZCcgOiAncmVtb3ZlJyldKCd2aXNpYmxlJyk7XG4gICAgICAgIC8vIHBsdWdpbkxvY2FsLmNhbGxlciEuY2FsbFVzZXJNb2RlbChMU1BNU0csIHsgdHlwZTogXygndmlzaWJsZScpLCBwYXlsb2FkOiB2aXNpYmxlIH0pXG4gICAgICAgIC8vIGF1dG8gZm9jdXMgZnJhbWVcbiAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgIGlmICghcGx1Z2luTG9jYWwuc2hhZG93ICYmIGVsKSB7XG4gICAgICAgICAgICAgICAgZWwucXVlcnlTZWxlY3RvcignaWZyYW1lJyk/LmNvbnRlbnRXaW5kb3c/LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdyZXN0b3JlX2VkaXRpbmdfY3Vyc29yJyk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCdhdHRycycpLCAoYXR0cnMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBwbHVnaW5Mb2NhbC5nZXRNYWluVUlDb250YWluZXIoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgZWw/LnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgICAgICAgIGlmIChrID09PSAnZHJhZ2dhYmxlJyAmJiB2KSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuX2Rpc3Bvc2UocGx1Z2luTG9jYWwuX3NldHVwRHJhZ2dhYmxlQ29udGFpbmVyKGVsLCB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwbHVnaW5Mb2NhbC5vcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5Mb2NhbC5jYWxsZXIuY2FsbCgnc3lzOnVpOnZpc2libGUnLCB7IHRvZ2dsZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrID09PSAncmVzaXphYmxlJyAmJiB2KSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuX2Rpc3Bvc2UocGx1Z2luTG9jYWwuX3NldHVwUmVzaXphYmxlQ29udGFpbmVyKGVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3N0eWxlJyksIChzdHlsZSkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHBsdWdpbkxvY2FsLmdldE1haW5VSUNvbnRhaW5lcigpO1xuICAgICAgICBjb25zdCBpc0luaXRlZExheW91dCA9ICEhZWwuZGF0YXNldC5pbml0ZWRfbGF5b3V0O1xuICAgICAgICBPYmplY3QuZW50cmllcyhzdHlsZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNJbml0ZWRMYXlvdXQgJiYgW1xuICAgICAgICAgICAgICAgICdsZWZ0JywgJ3RvcCcsICdib3R0b20nLCAncmlnaHQnLCAnd2lkdGgnLCAnaGVpZ2h0J1xuICAgICAgICAgICAgXS5pbmNsdWRlcyhrKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsLnN0eWxlW2tdID0gdjtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpbml0UHJvdmlkZXJIYW5kbGVycyhwbHVnaW5Mb2NhbCkge1xuICAgIGxldCBfID0gKGxhYmVsKSA9PiBgcHJvdmlkZXI6JHtsYWJlbH1gO1xuICAgIGxldCB0aGVtZWQgPSBmYWxzZTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd0aGVtZScpLCAodGhlbWUpID0+IHtcbiAgICAgICAgcGx1Z2luTG9jYWwudGhlbWVNZ3IucmVnaXN0ZXJUaGVtZShwbHVnaW5Mb2NhbC5pZCwgdGhlbWUpO1xuICAgICAgICBpZiAoIXRoZW1lZCkge1xuICAgICAgICAgICAgcGx1Z2luTG9jYWwuX2Rpc3Bvc2UoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBsdWdpbkxvY2FsLnRoZW1lTWdyLnVucmVnaXN0ZXJUaGVtZShwbHVnaW5Mb2NhbC5pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoZW1lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCdzdHlsZScpLCAoc3R5bGUpID0+IHtcbiAgICAgICAgbGV0IGtleTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGtleSA9IHN0eWxlLmtleTtcbiAgICAgICAgICAgIHN0eWxlID0gc3R5bGUuc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdHlsZSB8fCAhc3R5bGUudHJpbSgpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBwbHVnaW5Mb2NhbC5fZGlzcG9zZShzZXR1cEluamVjdGVkU3R5bGUoc3R5bGUsIHtcbiAgICAgICAgICAgICdkYXRhLWluamVjdGVkLXN0eWxlJzoga2V5ID8gYCR7a2V5fS0ke3BsdWdpbkxvY2FsLmlkfWAgOiAnJyxcbiAgICAgICAgICAgICdkYXRhLXJlZic6IHBsdWdpbkxvY2FsLmlkXG4gICAgICAgIH0pKTtcbiAgICB9KTtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd1aScpLCAodWkpID0+IHtcbiAgICAgICAgcGx1Z2luTG9jYWwuX29uSG9zdE1vdW50ZWQoKCkgPT4ge1xuICAgICAgICAgICAgcGx1Z2luTG9jYWwuX2Rpc3Bvc2Uoc2V0dXBJbmplY3RlZFVJLmNhbGwocGx1Z2luTG9jYWwsIHVpLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAnZGF0YS1yZWYnOiBwbHVnaW5Mb2NhbC5pZFxuICAgICAgICAgICAgfSwgdWkuYXR0cnMgfHwge30pLCAoeyBlbCwgZmxvYXQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZmxvYXQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IGVsLmRhdGFzZXQuaWRlbnRpdHk7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwubGF5b3V0Q29yZS5tb3ZlX2NvbnRhaW5lcl90b190b3AoaWRlbnRpdHkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRBcGlQcm94eUhhbmRsZXJzKHBsdWdpbkxvY2FsKSB7XG4gICAgbGV0IF8gPSAobGFiZWwpID0+IGBhcGk6JHtsYWJlbH1gO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ2NhbGwnKSwgYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICAgICAgbGV0IHJldDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldCA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaShwYXlsb2FkLm1ldGhvZCwgLi4ucGF5bG9hZC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFtMU1BNU0dfRVJST1JfVEFHXTogZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBfc3luYyB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHBsdWdpbkxvY2FsLnNoYWRvdykge1xuICAgICAgICAgICAgaWYgKHBheWxvYWQuYWN0b3IpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmFjdG9yLnJlc29sdmUocmV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX3N5bmMgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcmVwbHkgPSAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuY2FsbGVyPy5jYWxsVXNlck1vZGVsKExTUE1TR19TWU5DLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgX3N5bmNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmV0KS50aGVuKHJlcGx5LCByZXBseSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUb0xTUFJlc291cmNlKGZ1bGxVcmwsIGRvdFBsdWdpblJvb3QpIHtcbiAgICBpZiAoZG90UGx1Z2luUm9vdCAmJlxuICAgICAgICBmdWxsVXJsLnN0YXJ0c1dpdGgoUFJPVE9DT0xfRklMRSArIGRvdFBsdWdpblJvb3QpKSB7XG4gICAgICAgIGZ1bGxVcmwgPSBzYWZldHlQYXRoSm9pbihVUkxfTFNQLCBmdWxsVXJsLnN1YnN0cihQUk9UT0NPTF9GSUxFLmxlbmd0aCArIGRvdFBsdWdpblJvb3QubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBmdWxsVXJsO1xufVxuY2xhc3MgSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yLm5hbWU7XG4gICAgfVxufVxuY2xhc3MgRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IEV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvci5uYW1lO1xuICAgIH1cbn1cbi8qKlxuICogSG9zdCBwbHVnaW4gZm9yIGxvY2FsXG4gKi9cbmNsYXNzIFBsdWdpbkxvY2FsIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBfb3B0aW9ucztcbiAgICBfdGhlbWVNZ3I7XG4gICAgX2N0eDtcbiAgICBfZGlzcG9zZXMgPSBbXTtcbiAgICBfaWQ7XG4gICAgX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURFRDtcbiAgICBfbG9hZEVycjtcbiAgICBfbG9jYWxSb290O1xuICAgIF9kb3RTZXR0aW5nc0ZpbGU7XG4gICAgX2NhbGxlcjtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX29wdGlvbnNcbiAgICAgKiBAcGFyYW0gX3RoZW1lTWdyXG4gICAgICogQHBhcmFtIF9jdHhcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucywgX3RoZW1lTWdyLCBfY3R4KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5fdGhlbWVNZ3IgPSBfdGhlbWVNZ3I7XG4gICAgICAgIHRoaXMuX2N0eCA9IF9jdHg7XG4gICAgICAgIHRoaXMuX2lkID0gX29wdGlvbnMua2V5IHx8IGdlbklEKCk7XG4gICAgICAgIGluaXRVc2VyU2V0dGluZ3NIYW5kbGVycyh0aGlzKTtcbiAgICAgICAgaW5pdE1haW5VSUhhbmRsZXJzKHRoaXMpO1xuICAgICAgICBpbml0UHJvdmlkZXJIYW5kbGVycyh0aGlzKTtcbiAgICAgICAgaW5pdEFwaVByb3h5SGFuZGxlcnModGhpcyk7XG4gICAgfVxuICAgIGFzeW5jIF9zZXR1cFVzZXJTZXR0aW5ncygpIHtcbiAgICAgICAgY29uc3QgeyBfb3B0aW9ucyB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gX29wdGlvbnMubG9nZ2VyID0gbmV3IFBsdWdpbkxvZ2dlcignTG9hZGVyJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbdXNlclNldHRpbmdzRmlsZVBhdGgsIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ2xvYWRfcGx1Z2luX3VzZXJfc2V0dGluZ3MnLCB0aGlzLmlkKTtcbiAgICAgICAgICAgIHRoaXMuX2RvdFNldHRpbmdzRmlsZSA9IHVzZXJTZXR0aW5nc0ZpbGVQYXRoO1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBfb3B0aW9ucy5zZXR0aW5ncyA9IG5ldyBQbHVnaW5TZXR0aW5ncyh1c2VyU2V0dGluZ3MpO1xuICAgICAgICAgICAgLy8gb2JzZXJ2ZSBzZXR0aW5nc1xuICAgICAgICAgICAgc2V0dGluZ3Mub24oJ2NoYW5nZScsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ2xpbmtlZCBzZXR0aW5ncyBjaGFuZ2UnLCBhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWEuZGlzYWJsZWQgJiYgYi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgcGx1Z2luXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5kaXNhYmxlZCAmJiAhYi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHBsdWdpblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYSkge1xuICAgICAgICAgICAgICAgICAgICBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoYHNhdmVfcGx1Z2luX3VzZXJfc2V0dGluZ3NgLCB0aGlzLmlkLCBhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tsb2FkIHBsdWdpbiB1c2VyIHNldHRpbmdzIEVycm9yXScsIGUpO1xuICAgICAgICAgICAgbG9nZ2VyPy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRNYWluVUlDb250YWluZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnNoYWRvdykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGVyPy5fZ2V0U2FuZGJveFNoYWRvd0NvbnRhaW5lcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxlcj8uX2dldFNhbmRib3hJZnJhbWVDb250YWluZXIoKTtcbiAgICB9XG4gICAgX3Jlc29sdmVSZXNvdXJjZUZ1bGxVcmwoZmlsZVBhdGgsIGxvY2FsUm9vdCkge1xuICAgICAgICBpZiAoIWZpbGVQYXRoPy50cmltKCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxvY2FsUm9vdCA9IGxvY2FsUm9vdCB8fCB0aGlzLl9sb2NhbFJvb3Q7XG4gICAgICAgIGNvbnN0IHJlZyA9IC9eKGh0dHB8ZmlsZSkvO1xuICAgICAgICBpZiAoIXJlZy50ZXN0KGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcGF0aC5qb2luKGxvY2FsUm9vdCwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgZmlsZVBhdGggPSByZWcudGVzdCh1cmwpID8gdXJsIDogKFBST1RPQ09MX0ZJTEUgKyB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoIXRoaXMub3B0aW9ucy5lZmZlY3QgJiYgdGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCkgP1xuICAgICAgICAgICAgY29udmVydFRvTFNQUmVzb3VyY2UoZmlsZVBhdGgsIHRoaXMuZG90UGx1Z2luc1Jvb3QpIDogZmlsZVBhdGg7XG4gICAgfVxuICAgIGFzeW5jIF9wcmVwYXJlUGFja2FnZUNvbmZpZ3MoKSB7XG4gICAgICAgIGNvbnN0IHsgdXJsIH0gPSB0aGlzLl9vcHRpb25zO1xuICAgICAgICBsZXQgcGtnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgcmVzb2x2ZSBwYWNrYWdlIGNvbmZpZyBsb2NhdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWcoJ3ByZXBhcmUgcGFja2FnZSByb290JywgdXJsKTtcbiAgICAgICAgICAgIHBrZyA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSgnbG9hZF9wbHVnaW5fY29uZmlnJywgdXJsKTtcbiAgICAgICAgICAgIGlmICghcGtnIHx8IChwa2cgPSBKU09OLnBhcnNlKHBrZyksICFwa2cpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJzZSBwYWNrYWdlIGNvbmZpZyBlcnJvciAjJHt1cmx9L3BhY2thZ2UuanNvbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvY2FsUm9vdCA9IHRoaXMuX2xvY2FsUm9vdCA9IHNhZmV0eVBhdGhOb3JtYWxpemUodXJsKTtcbiAgICAgICAgY29uc3QgbG9nc2VxID0gcGtnLmxvZ3NlcSB8fCB7fTtcbiAgICAgICAgWyduYW1lJywgJ2F1dGhvcicsICdyZXBvc2l0b3J5JywgJ3ZlcnNpb24nLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJywgJ3JlcG8nLCAndGl0bGUnLCAnZWZmZWN0JyxcbiAgICAgICAgXS5jb25jYXQoIXRoaXMuaXNJbnN0YWxsZWRJbkRvdFJvb3QgPyBbJ2RldkVudHJ5J10gOiBbXSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNba10gPSBwa2dba107XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YWxpZGF0ZUVudHJ5ID0gKG1haW4pID0+IG1haW4gJiYgL1xcLihqc3xodG1sKSQvLnRlc3QobWFpbik7XG4gICAgICAgIC8vIEVudHJ5IGZyb20gbWFpblxuICAgICAgICBjb25zdCBlbnRyeSA9IGxvZ3NlcS5lbnRyeSB8fCBsb2dzZXEubWFpbiB8fCBwa2cubWFpbjtcbiAgICAgICAgaWYgKHZhbGlkYXRlRW50cnkoZW50cnkpKSB7IC8vIFRoZW1lIGhhcyBubyBtYWluXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmVudHJ5ID0gdGhpcy5fcmVzb2x2ZVJlc291cmNlRnVsbFVybChlbnRyeSwgbG9jYWxSb290KTtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuZGV2RW50cnkgPSBsb2dzZXEuZGV2RW50cnk7XG4gICAgICAgICAgICBpZiAobG9nc2VxLm1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm1vZGUgPSBsb2dzZXEubW9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aXRsZSA9IGxvZ3NlcS50aXRsZSB8fCBwa2cudGl0bGU7XG4gICAgICAgIGNvbnN0IGljb24gPSBsb2dzZXEuaWNvbiB8fCBwa2cuaWNvbjtcbiAgICAgICAgdGhpcy5fb3B0aW9ucy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLl9vcHRpb25zLmljb24gPSBpY29uICYmXG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlUmVzb3VyY2VGdWxsVXJsKGljb24pO1xuICAgICAgICAvLyBUT0RPOiBzdHJhdGVneSBmb3IgTG9nc2VxIHBsdWdpbnMgY2VudGVyXG4gICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGVkSW5Eb3RSb290KSB7XG4gICAgICAgICAgICB0aGlzLl9pZCA9IHBhdGguYmFzZW5hbWUobG9jYWxSb290KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsb2dzZXEuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pZCA9IGxvZ3NlcS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ3NlcS5pZCA9IHRoaXMuaWQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdzYXZlX3BsdWdpbl9jb25maWcnLCB1cmwsIHsgLi4ucGtnLCBsb2dzZXEgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKCdbc2F2ZSBwbHVnaW4gSUQgRXJyb3JdICcsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSBpZFxuICAgICAgICBjb25zdCB7IHJlZ2lzdGVyZWRQbHVnaW5zLCBpc1JlZ2lzdGVyaW5nIH0gPSB0aGlzLl9jdHg7XG4gICAgICAgIGlmIChpc1JlZ2lzdGVyaW5nICYmIHJlZ2lzdGVyZWRQbHVnaW5zLmhhcyhsb2dzZXEuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yKCdwcmVwYXJlIHBhY2thZ2UgRXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyAwLiBJbnN0YWxsIFRoZW1lc1xuICAgICAgICAgICAgICAgIGxldCB0aGVtZXMgPSBsb2dzZXEudGhlbWVzO1xuICAgICAgICAgICAgICAgIGlmICh0aGVtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbG9hZENvbmZpZ1RoZW1lcyhBcnJheS5pc0FycmF5KHRoZW1lcykgPyB0aGVtZXMgOiBbdGhlbWVzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnW3ByZXBhcmUgcGFja2FnZSBlZmZlY3QgRXJyb3JdJywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGFzeW5jIF90cnlUb05vcm1hbGl6ZUVudHJ5KCkge1xuICAgICAgICBsZXQgeyBlbnRyeSwgc2V0dGluZ3MsIGRldkVudHJ5IH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGRldkVudHJ5ID0gZGV2RW50cnkgfHwgc2V0dGluZ3M/LmdldCgnX2RldkVudHJ5Jyk7XG4gICAgICAgIGlmIChkZXZFbnRyeSkge1xuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5lbnRyeSA9IGRldkVudHJ5O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50cnkuZW5kc1dpdGgoJy5qcycpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgZGlyUGF0aEluc3RhbGxlZCA9IG51bGw7XG4gICAgICAgIGxldCB0bXBfZmlsZV9tZXRob2QgPSAnd3JpdGVfdXNlcl90bXBfZmlsZSc7XG4gICAgICAgIGlmICh0aGlzLmlzSW5zdGFsbGVkSW5Eb3RSb290KSB7XG4gICAgICAgICAgICB0bXBfZmlsZV9tZXRob2QgPSAnd3JpdGVfZG90ZGlyX2ZpbGUnO1xuICAgICAgICAgICAgZGlyUGF0aEluc3RhbGxlZCA9IHRoaXMuX2xvY2FsUm9vdC5yZXBsYWNlKHRoaXMuZG90UGx1Z2luc1Jvb3QsICcnKTtcbiAgICAgICAgICAgIGRpclBhdGhJbnN0YWxsZWQgPSBwYXRoLmpvaW4oRElSX1BMVUdJTlMsIGRpclBhdGhJbnN0YWxsZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZGtQYXRoUm9vdCA9IGF3YWl0IGdldFNES1BhdGhSb290KCk7XG4gICAgICAgIGxldCBlbnRyeVBhdGggPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkodG1wX2ZpbGVfbWV0aG9kLCBgJHt0aGlzLl9pZH1faW5kZXguaHRtbGAsIGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgICA8dGl0bGU+bG9nc2VxIHBsdWdpbiBlbnRyeTwvdGl0bGU+XG4gICAgPHNjcmlwdCBzcmM9XCIke3Nka1BhdGhSb290fS9sc3BsdWdpbi51c2VyLmpzXCI+PC9zY3JpcHQ+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gIDxkaXYgaWQ9XCJhcHBcIj48L2Rpdj5cbiAgPHNjcmlwdCBzcmM9XCIke2VudHJ5fVwiPjwvc2NyaXB0PlxuICA8L2JvZHk+XG48L2h0bWw+YCwgZGlyUGF0aEluc3RhbGxlZCk7XG4gICAgICAgIGVudHJ5ID0gY29udmVydFRvTFNQUmVzb3VyY2Uod2l0aEZpbGVQcm90b2NvbChwYXRoLm5vcm1hbGl6ZShlbnRyeVBhdGgpKSwgdGhpcy5kb3RQbHVnaW5zUm9vdCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMuZW50cnkgPSBlbnRyeTtcbiAgICB9XG4gICAgYXN5bmMgX2xvYWRDb25maWdUaGVtZXModGhlbWVzKSB7XG4gICAgICAgIHRoZW1lcy5mb3JFYWNoKChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy51cmwuc3RhcnRzV2l0aCgnaHR0cCcpICYmIHRoaXMuX2xvY2FsUm9vdCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gcGF0aC5qb2luKHRoaXMuX2xvY2FsUm9vdCwgb3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgICAgIC8vIGZpbGU6Ly8gZm9yIG5hdGl2ZVxuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy51cmwuc3RhcnRzV2l0aCgnZmlsZTonKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9ICdhc3NldHM6Ly8nICsgb3B0aW9ucy51cmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdwcm92aWRlcjp0aGVtZScsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3BlcnNpc3RNYWluVUlMYXlvdXREYXRhKGUpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0cyA9IHRoaXMuc2V0dGluZ3MuZ2V0KCdsYXlvdXRzJykgfHwgW107XG4gICAgICAgIGxheW91dHNbMF0gPSBlO1xuICAgICAgICB0aGlzLnNldHRpbmdzLnNldCgnbGF5b3V0JywgbGF5b3V0cyk7XG4gICAgfVxuICAgIF9zZXR1cERyYWdnYWJsZUNvbnRhaW5lcihlbCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGRzID0gZWwuZGF0YXNldDtcbiAgICAgICAgaWYgKGRzLmluaXRlZF9kcmFnZ2FibGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghZHMuaWRlbnRpdHkpIHtcbiAgICAgICAgICAgIGRzLmlkZW50aXR5ID0gJ2RkLScgKyBnZW5JRCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzSW5qZWN0ZWRVSSA9ICEhb3B0cy5rZXk7XG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBoYW5kbGUuY2xhc3NMaXN0LmFkZCgnZHJhZ2dhYmxlLWhhbmRsZScpO1xuICAgICAgICBoYW5kbGUuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cInRoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsXCI+PGgzPiR7b3B0cy50aXRsZSB8fCAnJ308L2gzPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiclwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwiYnV0dG9uIHhcIj48aSBjbGFzcz1cInRpIHRpLXhcIj48L2k+PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgICAgIGhhbmRsZS5xdWVyeVNlbGVjdG9yKCcueCcpXG4gICAgICAgICAgICAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgb3B0cz8uY2xvc2U/LigpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgaWYgKHRhcmdldD8uY2xvc2VzdCgnLnInKSkge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICBlbC5wcmVwZW5kKGhhbmRsZSk7XG4gICAgICAgIC8vIG1vdmUgdG8gdG9wXG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxheW91dENvcmUubW92ZV9jb250YWluZXJfdG9fdG9wKGRzLmlkZW50aXR5KTtcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHNldFRpdGxlID0gKHRpdGxlKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGUucXVlcnlTZWxlY3RvcignaDMnKS50ZXh0Q29udGVudCA9IHRpdGxlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkaXNwb3NlID0gdGhpcy5sYXlvdXRDb3JlLnNldHVwX2RyYWdnYWJsZV9jb250YWluZXJfQkFOR18oZWwsICFpc0luamVjdGVkVUkgPyB0aGlzLl9wZXJzaXN0TWFpblVJTGF5b3V0RGF0YS5iaW5kKHRoaXMpIDogKCkgPT4geyB9KTtcbiAgICAgICAgZHMuaW5pdGVkX2RyYWdnYWJsZSA9ICd0cnVlJztcbiAgICAgICAgaWYgKG9wdHMudGl0bGUpIHtcbiAgICAgICAgICAgIHNldFRpdGxlKG9wdHMudGl0bGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsaWNrIG91dHNpZGVcbiAgICAgICAgbGV0IHJlbW92ZU91dHNpZGVMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgIGlmIChkcy5jbG9zZSA9PT0gJ291dHNpZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICBpZiAoIWVsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlbW92ZU91dHNpZGVMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmVtb3ZlT3V0c2lkZUxpc3RlbmVyPy4oKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX3NldHVwUmVzaXphYmxlQ29udGFpbmVyKGVsLCBrZXkpIHtcbiAgICAgICAgY29uc3QgZHMgPSBlbC5kYXRhc2V0O1xuICAgICAgICBpZiAoZHMuaW5pdGVkX3Jlc2l6YWJsZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCFkcy5pZGVudGl0eSkge1xuICAgICAgICAgICAgZHMuaWRlbnRpdHkgPSAnZGQtJyArIGdlbklEKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGhhbmRsZS5jbGFzc0xpc3QuYWRkKCdyZXNpemFibGUtaGFuZGxlJyk7XG4gICAgICAgIGVsLnByZXBlbmQoaGFuZGxlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBsYXlvdXRDb3JlID0gd2luZG93LmZyb250ZW5kLm1vZHVsZXMubGF5b3V0LmNvcmU7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2UgPSBsYXlvdXRDb3JlLnNldHVwX3Jlc2l6YWJsZV9jb250YWluZXJfQkFOR18oZWwsICFrZXkgPyB0aGlzLl9wZXJzaXN0TWFpblVJTGF5b3V0RGF0YS5iaW5kKHRoaXMpIDogKCkgPT4geyB9KTtcbiAgICAgICAgZHMuaW5pdGVkX3Jlc2l6YWJsZSA9ICd0cnVlJztcbiAgICAgICAgcmV0dXJuIGRpc3Bvc2U7XG4gICAgfVxuICAgIGFzeW5jIGxvYWQocmVhZHlJbmRpY2F0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5MT0FESU5HO1xuICAgICAgICB0aGlzLl9sb2FkRXJyID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gaWYgKCF0aGlzLm9wdGlvbnMuZW50cnkpIHsgLy8gVGhlbWVzIHBhY2thZ2Ugbm8gZW50cnkgZmllbGRcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGxldCBpbnN0YWxsUGFja2FnZVRoZW1lcyA9IGF3YWl0IHRoaXMuX3ByZXBhcmVQYWNrYWdlQ29uZmlncygpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0dXBVc2VyU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGluc3RhbGxQYWNrYWdlVGhlbWVzLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5vcHRpb25zLmVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fdHJ5VG9Ob3JtYWxpemVFbnRyeSgpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGVyID0gbmV3IExTUGx1Z2luQ2FsbGVyKHRoaXMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2FsbGVyLmNvbm5lY3RUb0NoaWxkKCk7XG4gICAgICAgICAgICBjb25zdCByZWFkeUZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0dfUkVBRFksIHsgcGlkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZWFkeUluZGljYXRvcikge1xuICAgICAgICAgICAgICAgIHJlYWR5SW5kaWNhdG9yLnByb21pc2UudGhlbihyZWFkeUZuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlYWR5Rm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGxlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbTG9hZCBQbHVnaW4gRXJyb3JdICcsIGUpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXI/LmVycm9yKGUpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLkVSUk9SO1xuICAgICAgICAgICAgdGhpcy5fbG9hZEVyciA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2xvYWRFcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FERUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BREVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyByZWxvYWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jdHguZW1pdCgnYmVmb3JlcmVsb2FkJywgdGhpcyk7XG4gICAgICAgIGF3YWl0IHRoaXMudW5sb2FkKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgICAgICB0aGlzLl9jdHguZW1pdCgncmVsb2FkZWQnLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHVucmVnaXN0ZXIgSWYgdHJ1ZSBkZWxldGUgcGx1Z2luIGZpbGVzXG4gICAgICovXG4gICAgYXN5bmMgdW5sb2FkKHVucmVnaXN0ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVucmVnaXN0ZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luc3RhbGxlZEluRG90Um9vdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N0eC5lbWl0KCd1bmxpbmstcGx1Z2luJywgdGhpcy5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURJTkc7XG4gICAgICAgICAgICBjb25zdCBldmVudEJlZm9yZVVubG9hZCA9IHsgdW5yZWdpc3RlciB9O1xuICAgICAgICAgICAgLy8gc3luYyBjYWxsXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGxlcj8uY2FsbFVzZXJNb2RlbChBV0FJVF9MU1BNU0dGbihMU1BNU0dfQkVGT1JFX1VOTE9BRCksIGV2ZW50QmVmb3JlVW5sb2FkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZXVubG9hZCcsIGV2ZW50QmVmb3JlVW5sb2FkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2JlZm9yZXVubG9hZCBFcnJvcl0nLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1bmxvYWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW3BsdWdpbiB1bmxvYWQgRXJyb3JdJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FERUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZGlzcG9zZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLl9kaXNwb3Nlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmbiAmJiAoYXdhaXQgZm4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5kZWJ1Z1RhZywgJ2Rpc3Bvc2UgRXJyb3InLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhclxuICAgICAgICB0aGlzLl9kaXNwb3NlcyA9IFtdO1xuICAgIH1cbiAgICBfZGlzcG9zZShmbikge1xuICAgICAgICBpZiAoIWZuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9kaXNwb3Nlcy5wdXNoKGZuKTtcbiAgICB9XG4gICAgX29uSG9zdE1vdW50ZWQoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgYWN0b3IgPSB0aGlzLl9jdHguaG9zdE1vdW50ZWRBY3RvcjtcbiAgICAgICAgaWYgKCFhY3RvciB8fCBhY3Rvci5zZXR0bGVkKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWN0b3I/LnByb21pc2UudGhlbihjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGxheW91dENvcmUoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5mcm9udGVuZC5tb2R1bGVzLmxheW91dC5jb3JlO1xuICAgIH1cbiAgICBnZXQgaXNJbnN0YWxsZWRJbkRvdFJvb3QoKSB7XG4gICAgICAgIGNvbnN0IGRvdFJvb3QgPSB0aGlzLmRvdENvbmZpZ1Jvb3Q7XG4gICAgICAgIGNvbnN0IHBsZ1Jvb3QgPSB0aGlzLmxvY2FsUm9vdDtcbiAgICAgICAgcmV0dXJuIGRvdFJvb3QgJiYgcGxnUm9vdCAmJiBwbGdSb290LnN0YXJ0c1dpdGgoZG90Um9vdCk7XG4gICAgfVxuICAgIGdldCBsb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXMgPT09IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5MT0FERUQ7XG4gICAgfVxuICAgIGdldCBwZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gW1BsdWdpbkxvY2FsTG9hZFN0YXR1cy5MT0FESU5HLCBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FESU5HXVxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuX3N0YXR1cyk7XG4gICAgfVxuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gICAgfVxuICAgIGdldCBzZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zZXR0aW5ncztcbiAgICB9XG4gICAgZ2V0IGxvZ2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2dnZXI7XG4gICAgfVxuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M/LmdldCgnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgZ2V0IGNhbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxlcjtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfVxuICAgIGdldCBzaGFkb3coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubW9kZSA9PT0gJ3NoYWRvdyc7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IHRoZW1lTWdyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhlbWVNZ3I7XG4gICAgfVxuICAgIGdldCBkZWJ1Z1RhZygpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuX29wdGlvbnM/Lm5hbWU7XG4gICAgICAgIHJldHVybiBgIyR7dGhpcy5faWR9ICR7bmFtZSA/PyAnJ31gO1xuICAgIH1cbiAgICBnZXQgbG9jYWxSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX29wdGlvbnMudXJsO1xuICAgIH1cbiAgICBnZXQgbG9hZEVycigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRFcnI7XG4gICAgfVxuICAgIGdldCBkb3RDb25maWdSb290KCkge1xuICAgICAgICByZXR1cm4gcGF0aC5ub3JtYWxpemUodGhpcy5fY3R4Lm9wdGlvbnMuZG90Q29uZmlnUm9vdCk7XG4gICAgfVxuICAgIGdldCBkb3RTZXR0aW5nc0ZpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kb3RTZXR0aW5nc0ZpbGU7XG4gICAgfVxuICAgIGdldCBkb3RQbHVnaW5zUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRvdENvbmZpZ1Jvb3QsIERJUl9QTFVHSU5TKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBqc29uID0geyAuLi50aGlzLm9wdGlvbnMgfTtcbiAgICAgICAganNvbi5pZCA9IHRoaXMuaWQ7XG4gICAgICAgIGpzb24uZXJyID0gdGhpcy5sb2FkRXJyO1xuICAgICAgICBqc29uLnVzZiA9IHRoaXMuZG90U2V0dGluZ3NGaWxlO1xuICAgICAgICBqc29uLmlpciA9IHRoaXMuaXNJbnN0YWxsZWRJbkRvdFJvb3Q7XG4gICAgICAgIGpzb24ubHNyID0gdGhpcy5fcmVzb2x2ZVJlc291cmNlRnVsbFVybCgnJyk7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cbi8qKlxuICogSG9zdCBwbHVnaW4gY29yZVxuICovXG5jbGFzcyBMU1BsdWdpbkNvcmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIF9vcHRpb25zO1xuICAgIF9pc1JlZ2lzdGVyaW5nID0gZmFsc2U7XG4gICAgX3JlYWR5SW5kaWNhdG9yO1xuICAgIF9ob3N0TW91bnRlZEFjdG9yID0gZGVmZXJyZWQoKTtcbiAgICBfdXNlclByZWZlcmVuY2VzID0ge307XG4gICAgX3JlZ2lzdGVyZWRUaGVtZXMgPSBuZXcgTWFwKCk7XG4gICAgX3JlZ2lzdGVyZWRQbHVnaW5zID0gbmV3IE1hcCgpO1xuICAgIF9jdXJyZW50VGhlbWU7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIF9vcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICBhc3luYyBsb2FkVXNlclByZWZlcmVuY2VzKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoYGxvYWRfdXNlcl9wcmVmZXJlbmNlc2ApO1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VyUHJlZmVyZW5jZXMsIHNldHRpbmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tsb2FkIHVzZXIgcHJlZmVyZW5jZXMgRXJyb3JdJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2F2ZVVzZXJQcmVmZXJlbmNlcyhzZXR0aW5ncykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VyUHJlZmVyZW5jZXMsIHNldHRpbmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaShgc2F2ZV91c2VyX3ByZWZlcmVuY2VzYCwgdGhpcy5fdXNlclByZWZlcmVuY2VzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tzYXZlIHVzZXIgcHJlZmVyZW5jZXMgRXJyb3JdJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgYWN0aXZhdGVVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgdGhlbWUgfSA9IHRoaXMuX3VzZXJQcmVmZXJlbmNlcztcbiAgICAgICAgLy8gMC4gdGhlbWVcbiAgICAgICAgaWYgKHRoZW1lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdFRoZW1lKHRoZW1lLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHBsdWdpbnNcbiAgICAgKiBAcGFyYW0gaW5pdGlhbFxuICAgICAqL1xuICAgIGFzeW5jIHJlZ2lzdGVyKHBsdWdpbnMsIGluaXRpYWwgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGx1Z2lucykpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXIoW3BsdWdpbnNdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwZXJmVGFibGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGRlYnVnUGVyZkluZm8gPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gQXJyYXkuZnJvbShwZXJmVGFibGUudmFsdWVzKCkpLnJlZHVjZSgoYWMsIGl0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBvcHRpb25zLCBzdGF0dXMsIGRpc2FibGVkIH0gPSBpdC5vO1xuICAgICAgICAgICAgICAgIGFjW2l0Lm8uaWRdID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5OiBvcHRpb25zLmVudHJ5LFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHlwZW9mIGRpc2FibGVkID09PSAnYm9vbGVhbicgPyAoIWRpc2FibGVkID8gJ/Cfn6InIDogJ+Kaq++4jycpIDogJ/CflLQnLFxuICAgICAgICAgICAgICAgICAgICBwZXJmOiAhaXQuZSA/IGl0Lm8ubG9hZEVyciA6IGAkeyhpdC5lIC0gaXQucykudG9GaXhlZCgyKX1tc2BcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhYztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgIGNvbnNvbGUudGFibGUoZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Ll9fZGVidWdQbHVnaW5zUGVyZkluZm8gPSBkZWJ1Z1BlcmZJbmZvO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5faXNSZWdpc3RlcmluZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB1c2VyQ29uZmlnUm9vdCA9IHRoaXMuX29wdGlvbnMuZG90Q29uZmlnUm9vdDtcbiAgICAgICAgICAgIGNvbnN0IHJlYWR5SW5kaWNhdG9yID0gdGhpcy5fcmVhZHlJbmRpY2F0b3IgPSBkZWZlcnJlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkVXNlclByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICBjb25zdCBleHRlcm5hbHMgPSBuZXcgU2V0KHRoaXMuX3VzZXJQcmVmZXJlbmNlcy5leHRlcm5hbHMgfHwgW10pO1xuICAgICAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5zID0gcGx1Z2lucy5jb25jYXQoWy4uLmV4dGVybmFsc10uZmlsdGVyKHVybCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhcGx1Z2lucy5sZW5ndGggfHwgcGx1Z2lucy5ldmVyeSgocCkgPT4gIXAuZW50cnkgJiYgKHAudXJsICE9PSB1cmwpKTtcbiAgICAgICAgICAgICAgICB9KS5tYXAodXJsID0+ICh7IHVybCB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwbHVnaW5PcHRpb25zIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCB9ID0gcGx1Z2luT3B0aW9ucztcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5Mb2NhbCA9IG5ldyBQbHVnaW5Mb2NhbChwbHVnaW5PcHRpb25zLCB0aGlzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmSW5mbyA9IHsgbzogcGx1Z2luTG9jYWwsIHM6IHBlcmZvcm1hbmNlLm5vdygpLCBlOiAwIH07XG4gICAgICAgICAgICAgICAgcGVyZlRhYmxlLnNldChwbHVnaW5Mb2NhbC5pZCwgcGVyZkluZm8pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBsdWdpbkxvY2FsLmxvYWQocmVhZHlJbmRpY2F0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbG9hZEVyciB9ID0gcGx1Z2luTG9jYWw7XG4gICAgICAgICAgICAgICAgaWYgKGxvYWRFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoYFtGYWlsZWQgTE9BRCBQbHVnaW5dICNgLCBwbHVnaW5PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGxvYWRFcnIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZEVyciBpbnN0YW5jZW9mIElsbGVnYWxQbHVnaW5QYWNrYWdlRXJyb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFcnIgaW5zdGFuY2VvZiBFeGlzdGVkSW1wb3J0ZWRQbHVnaW5QYWNrYWdlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG5vdGlmeSBnbG9iYWwgbG9nIHN5c3RlbT9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBlcmZJbmZvLmUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICBwbHVnaW5Mb2NhbC5zZXR0aW5ncz8ub24oJ2NoYW5nZScsIChhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2V0dGluZ3MtY2hhbmdlZCcsIHBsdWdpbkxvY2FsLmlkLCBhKTtcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuY2FsbGVyPy5jYWxsVXNlck1vZGVsKExTUE1TR19TRVRUSU5HUywgeyBwYXlsb2FkOiBhIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zLnNldChwbHVnaW5Mb2NhbC5pZCwgcGx1Z2luTG9jYWwpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHBsdWdpbkxvY2FsKTtcbiAgICAgICAgICAgICAgICAvLyBleHRlcm5hbCBwbHVnaW5zXG4gICAgICAgICAgICAgICAgaWYgKCFwbHVnaW5Mb2NhbC5pc0luc3RhbGxlZEluRG90Um9vdCkge1xuICAgICAgICAgICAgICAgICAgICBleHRlcm5hbHMuYWRkKHVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlVXNlclByZWZlcmVuY2VzKHsgZXh0ZXJuYWxzOiBBcnJheS5mcm9tKGV4dGVybmFscykgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlVXNlclByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICByZWFkeUluZGljYXRvci5yZXNvbHZlKCdyZWFkeScpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5faXNSZWdpc3RlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZGVidWdQZXJmSW5mbygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlbG9hZChwbHVnaW5zKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwbHVnaW5zKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWxvYWQoW3BsdWdpbnNdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aXR5IG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5zdXJlUGx1Z2luKGlkZW50aXR5KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBwLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZyhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyB1bnJlZ2lzdGVyKHBsdWdpbnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVucmVnaXN0ZXIoW3BsdWdpbnNdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bnJlZ2lzdGVyZWRFeHRlcm5hbHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGl0eSBvZiBwbHVnaW5zKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5lbnN1cmVQbHVnaW4oaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKCFwLmlzSW5zdGFsbGVkSW5Eb3RSb290KSB7XG4gICAgICAgICAgICAgICAgdW5yZWdpc3RlcmVkRXh0ZXJuYWxzLnB1c2gocC5vcHRpb25zLnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBwLnVubG9hZCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zLmRlbGV0ZShpZGVudGl0eSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIGlkZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXh0ZXJuYWxzID0gdGhpcy5fdXNlclByZWZlcmVuY2VzLmV4dGVybmFscyB8fCBbXTtcbiAgICAgICAgaWYgKGV4dGVybmFscy5sZW5ndGggJiYgdW5yZWdpc3RlcmVkRXh0ZXJuYWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlVXNlclByZWZlcmVuY2VzKHtcbiAgICAgICAgICAgICAgICBleHRlcm5hbHM6IGV4dGVybmFscy5maWx0ZXIoKGl0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhdW5yZWdpc3RlcmVkRXh0ZXJuYWxzLmluY2x1ZGVzKGl0KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZW5hYmxlKHBsdWdpbikge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5lbnN1cmVQbHVnaW4ocGx1Z2luKTtcbiAgICAgICAgaWYgKHAucGVuZGluZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5lbWl0KCdiZWZvcmVlbmFibGUnKTtcbiAgICAgICAgcC5zZXR0aW5ncz8uc2V0KCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmFibGVkJywgcC5pZCk7XG4gICAgfVxuICAgIGFzeW5jIGRpc2FibGUocGx1Z2luKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuc3VyZVBsdWdpbihwbHVnaW4pO1xuICAgICAgICBpZiAocC5wZW5kaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZWRpc2FibGUnKTtcbiAgICAgICAgcC5zZXR0aW5ncz8uc2V0KCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICB0aGlzLmVtaXQoJ2Rpc2FibGVkJywgcC5pZCk7XG4gICAgfVxuICAgIGFzeW5jIF9ob29rKG5zLCB0eXBlLCBwYXlsb2FkLCBwaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbXywgcF0gb2YgdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnMpIHtcbiAgICAgICAgICAgIGlmICghcGlkIHx8IHBpZCA9PT0gcC5pZCkge1xuICAgICAgICAgICAgICAgIHAuY2FsbGVyPy5jYWxsVXNlck1vZGVsKExTUE1TRywge1xuICAgICAgICAgICAgICAgICAgICBucywgdHlwZTogc25ha2VDYXNlKHR5cGUpLCBwYXlsb2FkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaG9va0FwcCh0eXBlLCBwYXlsb2FkLCBwaWQpIHtcbiAgICAgICAgdGhpcy5faG9vayhgaG9vazphcHBgLCB0eXBlLCBwYXlsb2FkLCBwaWQpO1xuICAgIH1cbiAgICBob29rRWRpdG9yKHR5cGUsIHBheWxvYWQsIHBpZCkge1xuICAgICAgICB0aGlzLl9ob29rKGBob29rOmVkaXRvcmAsIHR5cGUsIHBheWxvYWQsIHBpZCk7XG4gICAgfVxuICAgIF9leGVjRGlyZWN0aXZlKHRhZywgLi4ucGFyYW1zKSB7XG4gICAgfVxuICAgIGVuc3VyZVBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgaWYgKHBsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbkxvY2FsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGx1Z2luO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucy5nZXQocGx1Z2luKTtcbiAgICAgICAgaWYgKCFwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBsdWdpbiAjJHtwbHVnaW59IG5vdCBleGlzdGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICBob3N0TW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5faG9zdE1vdW50ZWRBY3Rvci5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldCByZWdpc3RlcmVkUGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIGdldCByZWFkeUluZGljYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWR5SW5kaWNhdG9yO1xuICAgIH1cbiAgICBnZXQgaG9zdE1vdW50ZWRBY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3RNb3VudGVkQWN0b3I7XG4gICAgfVxuICAgIGdldCBpc1JlZ2lzdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNSZWdpc3RlcmluZztcbiAgICB9XG4gICAgZ2V0IHRoZW1lcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXM7XG4gICAgfVxuICAgIGFzeW5jIHJlZ2lzdGVyVGhlbWUoaWQsIG9wdCkge1xuICAgICAgICBkZWJ1ZygncmVnaXN0ZXJlZCBUaGVtZSAjJywgaWQsIG9wdCk7XG4gICAgICAgIGlmICghaWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB0aGVtZXMgPSB0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLmdldChpZCk7XG4gICAgICAgIGlmICghdGhlbWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLnNldChpZCwgdGhlbWVzID0gW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoZW1lcy5wdXNoKG9wdCk7XG4gICAgICAgIHRoaXMuZW1pdCgndGhlbWUtY2hhbmdlZCcsIHRoaXMudGhlbWVzLCB7IGlkLCAuLi5vcHQgfSk7XG4gICAgfVxuICAgIGFzeW5jIHNlbGVjdFRoZW1lKG9wdCwgZWZmZWN0ID0gdHJ1ZSkge1xuICAgICAgICAvLyBjbGVhciBjdXJyZW50XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VGhlbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaGVtZS5kaXM/LigpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc0luamVjdGVkVGhlbWUgPSBzZXR1cEluamVjdGVkVGhlbWUob3B0Py51cmwpO1xuICAgICAgICB0aGlzLmVtaXQoJ3RoZW1lLXNlbGVjdGVkJywgb3B0KTtcbiAgICAgICAgZWZmZWN0ICYmIGF3YWl0IHRoaXMuc2F2ZVVzZXJQcmVmZXJlbmNlcyh7IHRoZW1lOiBvcHQ/LnVybCA/IG9wdCA6IG51bGwgfSk7XG4gICAgICAgIGlmIChvcHQ/LnVybCkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRoZW1lID0ge1xuICAgICAgICAgICAgICAgIGRpczogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaXNJbmplY3RlZFRoZW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdCAmJiB0aGlzLnNhdmVVc2VyUHJlZmVyZW5jZXMoeyB0aGVtZTogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB9LCBvcHQsIHBpZDogb3B0LnBpZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyB1bnJlZ2lzdGVyVGhlbWUoaWQsIGVmZmVjdCA9IHRydWUpIHtcbiAgICAgICAgZGVidWcoJ3VucmVnaXN0ZXJlZCBUaGVtZSAjJywgaWQpO1xuICAgICAgICBpZiAoIXRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMuaGFzKGlkKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFRoZW1lcy5kZWxldGUoaWQpO1xuICAgICAgICB0aGlzLmVtaXQoJ3RoZW1lLWNoYW5nZWQnLCB0aGlzLnRoZW1lcywgeyBpZCB9KTtcbiAgICAgICAgaWYgKGVmZmVjdCAmJiB0aGlzLl9jdXJyZW50VGhlbWU/LnBpZCA9PSBpZCkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRoZW1lLmRpcz8uKCk7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGhlbWUgPSBudWxsO1xuICAgICAgICAgICAgLy8gcmVzZXQgY3VycmVudCB0aGVtZVxuICAgICAgICAgICAgdGhpcy5lbWl0KCd0aGVtZS1zZWxlY3RlZCcsIG51bGwpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0dXBQbHVnaW5Db3JlKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwbHVnaW5Db3JlID0gbmV3IExTUGx1Z2luQ29yZShvcHRpb25zKTtcbiAgICBkZWJ1ZygnPT09IPCflJcgU2V0dXAgTG9nc2VxIFBsdWdpbiBTeXN0ZW0g8J+UlyA9PT0nKTtcbiAgICB3aW5kb3cuTFNQbHVnaW5Db3JlID0gcGx1Z2luQ29yZTtcbn1cbmV4cG9ydCB7IFBsdWdpbkxvY2FsLCBwbHVnaW5IZWxwZXJzLCBzZXR1cFBsdWdpbkNvcmUgfTtcbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwiZm9ybWF0QXJncyIsImFyZ3MiLCJ0aGlzIiwidXNlQ29sb3JzIiwibmFtZXNwYWNlIiwiaHVtYW5pemUiLCJkaWZmIiwiYyIsImNvbG9yIiwic3BsaWNlIiwiaW5kZXgiLCJsYXN0QyIsInJlcGxhY2UiLCJtYXRjaCIsInNhdmUiLCJuYW1lc3BhY2VzIiwic3RvcmFnZSIsInNldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZXJyb3IiLCJsb2FkIiwiciIsImdldEl0ZW0iLCJwcm9jZXNzIiwiZW52IiwiREVCVUciLCJ3aW5kb3ciLCJ0eXBlIiwiX19ud2pzIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidG9Mb3dlckNhc2UiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsInN0eWxlIiwiV2Via2l0QXBwZWFyYW5jZSIsImNvbnNvbGUiLCJmaXJlYnVnIiwiZXhjZXB0aW9uIiwidGFibGUiLCJwYXJzZUludCIsIlJlZ0V4cCIsIiQxIiwibG9jYWxTdG9yYWdlIiwibG9jYWxzdG9yYWdlIiwiZGVzdHJveSIsIndhcm5lZCIsIndhcm4iLCJjb2xvcnMiLCJsb2ciLCJkZWJ1ZyIsImZvcm1hdHRlcnMiLCJqIiwidiIsIkpTT04iLCJzdHJpbmdpZnkiLCJtZXNzYWdlIiwiY3JlYXRlRGVidWciLCJwcmV2VGltZSIsIm5hbWVzcGFjZXNDYWNoZSIsImVuYWJsZWRDYWNoZSIsImVuYWJsZU92ZXJyaWRlIiwiZW5hYmxlZCIsImN1cnIiLCJOdW1iZXIiLCJEYXRlIiwibXMiLCJwcmV2IiwiY29lcmNlIiwidW5zaGlmdCIsImZvcm1hdCIsImZvcm1hdHRlciIsInZhbCIsImNhbGwiLCJhcHBseSIsInNlbGVjdENvbG9yIiwiZXh0ZW5kIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwiZ2V0Iiwic2V0IiwiaW5pdCIsImRlbGltaXRlciIsIm5ld0RlYnVnIiwidG9OYW1lc3BhY2UiLCJyZWdleHAiLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsImxlbmd0aCIsImRlZmF1bHQiLCJFcnJvciIsInN0YWNrIiwiZGlzYWJsZSIsIm5hbWVzIiwibWFwIiwic2tpcHMiLCJqb2luIiwiZW5hYmxlIiwiaSIsInNwbGl0IiwibGVuIiwicHVzaCIsInN1YnN0ciIsIm5hbWUiLCJ0ZXN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJoYXNoIiwiY2hhckNvZGVBdCIsIk1hdGgiLCJhYnMiLCJoYXNPd25Qcm9wZXJ0eSIsInNldFByb3RvdHlwZU9mIiwiaXNGcm96ZW4iLCJnZXRQcm90b3R5cGVPZiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImZyZWV6ZSIsInNlYWwiLCJjcmVhdGUiLCJfcmVmIiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImZ1biIsInRoaXNWYWx1ZSIsIngiLCJGdW5jIiwiRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJiaW5kIiwiY29uY2F0IiwiYXJyIiwiQXJyYXkiLCJpc0FycmF5IiwiYXJyMiIsImZyb20iLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJmdW5jIiwiYXJyYXlGb3JFYWNoIiwidW5hcHBseSIsImFycmF5UG9wIiwicG9wIiwiYXJyYXlQdXNoIiwic3RyaW5nVG9Mb3dlckNhc2UiLCJTdHJpbmciLCJzdHJpbmdNYXRjaCIsInN0cmluZ1JlcGxhY2UiLCJzdHJpbmdJbmRleE9mIiwiaW5kZXhPZiIsInN0cmluZ1RyaW0iLCJ0cmltIiwicmVnRXhwVGVzdCIsInR5cGVFcnJvckNyZWF0ZSIsIlR5cGVFcnJvciIsIl9sZW4yIiwiYXJndW1lbnRzIiwiX2tleTIiLCJ0aGlzQXJnIiwiX2xlbiIsIl9rZXkiLCJhZGRUb1NldCIsImFycmF5IiwibCIsImVsZW1lbnQiLCJsY0VsZW1lbnQiLCJjbG9uZSIsIm9iamVjdCIsIm5ld09iamVjdCIsInByb3BlcnR5IiwibG9va3VwR2V0dGVyIiwicHJvcCIsImRlc2MiLCJ2YWx1ZSIsImh0bWwiLCJzdmciLCJzdmdGaWx0ZXJzIiwic3ZnRGlzYWxsb3dlZCIsIm1hdGhNbCIsIm1hdGhNbERpc2FsbG93ZWQiLCJ0ZXh0IiwiaHRtbCQxIiwic3ZnJDEiLCJtYXRoTWwkMSIsInhtbCIsIk1VU1RBQ0hFX0VYUFIiLCJFUkJfRVhQUiIsIkRBVEFfQVRUUiIsIkFSSUFfQVRUUiIsIklTX0FMTE9XRURfVVJJIiwiSVNfU0NSSVBUX09SX0RBVEEiLCJBVFRSX1dISVRFU1BBQ0UiLCJfdHlwZW9mIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJvYmoiLCJjb25zdHJ1Y3RvciIsIl90b0NvbnN1bWFibGVBcnJheSQxIiwiZ2V0R2xvYmFsIiwiX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSIsInRydXN0ZWRUeXBlcyIsImNyZWF0ZVBvbGljeSIsInN1ZmZpeCIsIkFUVFJfTkFNRSIsImN1cnJlbnRTY3JpcHQiLCJoYXNBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJwb2xpY3lOYW1lIiwiY3JlYXRlSFRNTCIsImh0bWwkJDEiLCJfIiwiY3JlYXRlRE9NUHVyaWZ5IiwidW5kZWZpbmVkIiwiRE9NUHVyaWZ5IiwidmVyc2lvbiIsInJlbW92ZWQiLCJub2RlVHlwZSIsImlzU3VwcG9ydGVkIiwib3JpZ2luYWxEb2N1bWVudCIsIkRvY3VtZW50RnJhZ21lbnQiLCJIVE1MVGVtcGxhdGVFbGVtZW50IiwiTm9kZSIsIkVsZW1lbnQiLCJOb2RlRmlsdGVyIiwiX3dpbmRvdyROYW1lZE5vZGVNYXAiLCJOYW1lZE5vZGVNYXAiLCJNb3pOYW1lZEF0dHJNYXAiLCJUZXh0IiwiQ29tbWVudCIsIkRPTVBhcnNlciIsIkVsZW1lbnRQcm90b3R5cGUiLCJjbG9uZU5vZGUiLCJnZXROZXh0U2libGluZyIsImdldENoaWxkTm9kZXMiLCJnZXRQYXJlbnROb2RlIiwidGVtcGxhdGUiLCJjcmVhdGVFbGVtZW50IiwiY29udGVudCIsIm93bmVyRG9jdW1lbnQiLCJ0cnVzdGVkVHlwZXNQb2xpY3kiLCJlbXB0eUhUTUwiLCJSRVRVUk5fVFJVU1RFRF9UWVBFIiwiX2RvY3VtZW50IiwiaW1wbGVtZW50YXRpb24iLCJjcmVhdGVOb2RlSXRlcmF0b3IiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpbXBvcnROb2RlIiwiZG9jdW1lbnRNb2RlIiwiaG9va3MiLCJjcmVhdGVIVE1MRG9jdW1lbnQiLCJNVVNUQUNIRV9FWFBSJCQxIiwiRVJCX0VYUFIkJDEiLCJEQVRBX0FUVFIkJDEiLCJBUklBX0FUVFIkJDEiLCJJU19TQ1JJUFRfT1JfREFUQSQkMSIsIkFUVFJfV0hJVEVTUEFDRSQkMSIsIklTX0FMTE9XRURfVVJJJCQxIiwiQUxMT1dFRF9UQUdTIiwiREVGQVVMVF9BTExPV0VEX1RBR1MiLCJBTExPV0VEX0FUVFIiLCJERUZBVUxUX0FMTE9XRURfQVRUUiIsIkZPUkJJRF9UQUdTIiwiRk9SQklEX0FUVFIiLCJBTExPV19BUklBX0FUVFIiLCJBTExPV19EQVRBX0FUVFIiLCJBTExPV19VTktOT1dOX1BST1RPQ09MUyIsIlNBRkVfRk9SX1RFTVBMQVRFUyIsIldIT0xFX0RPQ1VNRU5UIiwiU0VUX0NPTkZJRyIsIkZPUkNFX0JPRFkiLCJSRVRVUk5fRE9NIiwiUkVUVVJOX0RPTV9GUkFHTUVOVCIsIlJFVFVSTl9ET01fSU1QT1JUIiwiU0FOSVRJWkVfRE9NIiwiS0VFUF9DT05URU5UIiwiSU5fUExBQ0UiLCJVU0VfUFJPRklMRVMiLCJGT1JCSURfQ09OVEVOVFMiLCJERUZBVUxUX0ZPUkJJRF9DT05URU5UUyIsIkRBVEFfVVJJX1RBR1MiLCJERUZBVUxUX0RBVEFfVVJJX1RBR1MiLCJVUklfU0FGRV9BVFRSSUJVVEVTIiwiREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTIiwiTUFUSE1MX05BTUVTUEFDRSIsIlNWR19OQU1FU1BBQ0UiLCJIVE1MX05BTUVTUEFDRSIsIk5BTUVTUEFDRSIsIklTX0VNUFRZX0lOUFVUIiwiQ09ORklHIiwiZm9ybUVsZW1lbnQiLCJfcGFyc2VDb25maWciLCJjZmciLCJBRERfVVJJX1NBRkVfQVRUUiIsIkFERF9EQVRBX1VSSV9UQUdTIiwiQUxMT1dFRF9VUklfUkVHRVhQIiwiQUREX1RBR1MiLCJBRERfQVRUUiIsInRib2R5IiwiTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTIiwiSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMiLCJBTExfU1ZHX1RBR1MiLCJBTExfTUFUSE1MX1RBR1MiLCJfY2hlY2tWYWxpZE5hbWVzcGFjZSIsInBhcmVudCIsInRhZ05hbWUiLCJuYW1lc3BhY2VVUkkiLCJwYXJlbnRUYWdOYW1lIiwiQm9vbGVhbiIsImNvbW1vblN2Z0FuZEhUTUxFbGVtZW50cyIsIl9mb3JjZVJlbW92ZSIsIm5vZGUiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJvdXRlckhUTUwiLCJyZW1vdmUiLCJfcmVtb3ZlQXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlTm9kZSIsInJlbW92ZUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsIl9pbml0RG9jdW1lbnQiLCJkaXJ0eSIsImRvYyIsImxlYWRpbmdXaGl0ZXNwYWNlIiwibWF0Y2hlcyIsImRpcnR5UGF5bG9hZCIsInBhcnNlRnJvbVN0cmluZyIsImNyZWF0ZURvY3VtZW50IiwiaW5uZXJIVE1MIiwiYm9keSIsImluc2VydEJlZm9yZSIsImNyZWF0ZVRleHROb2RlIiwiY2hpbGROb2RlcyIsIl9jcmVhdGVJdGVyYXRvciIsIlNIT1dfRUxFTUVOVCIsIlNIT1dfQ09NTUVOVCIsIlNIT1dfVEVYVCIsIl9pc0Nsb2JiZXJlZCIsImVsbSIsIm5vZGVOYW1lIiwidGV4dENvbnRlbnQiLCJhdHRyaWJ1dGVzIiwiX2lzTm9kZSIsIl9leGVjdXRlSG9vayIsImVudHJ5UG9pbnQiLCJjdXJyZW50Tm9kZSIsImRhdGEiLCJob29rIiwiX3Nhbml0aXplRWxlbWVudHMiLCJhbGxvd2VkVGFncyIsImZpcnN0RWxlbWVudENoaWxkIiwiX2lzVmFsaWRBdHRyaWJ1dGUiLCJsY1RhZyIsImxjTmFtZSIsIl9zYW5pdGl6ZUF0dHJpYnV0ZXMiLCJhdHRyIiwiaG9va0V2ZW50IiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJrZWVwQXR0ciIsImFsbG93ZWRBdHRyaWJ1dGVzIiwiX2F0dHIiLCJmb3JjZUtlZXBBdHRyIiwic2V0QXR0cmlidXRlTlMiLCJfc2FuaXRpemVTaGFkb3dET00iLCJmcmFnbWVudCIsInNoYWRvd05vZGUiLCJzaGFkb3dJdGVyYXRvciIsIm5leHROb2RlIiwic2FuaXRpemUiLCJpbXBvcnRlZE5vZGUiLCJvbGROb2RlIiwicmV0dXJuTm9kZSIsInRvU3RhdGljSFRNTCIsImFwcGVuZENoaWxkIiwiZmlyc3RDaGlsZCIsIm5vZGVJdGVyYXRvciIsInNlcmlhbGl6ZWRIVE1MIiwic2V0Q29uZmlnIiwiY2xlYXJDb25maWciLCJpc1ZhbGlkQXR0cmlidXRlIiwidGFnIiwiYWRkSG9vayIsImhvb2tGdW5jdGlvbiIsInJlbW92ZUhvb2siLCJyZW1vdmVIb29rcyIsInJlbW92ZUFsbEhvb2tzIiwiaGFzIiwicHJlZml4IiwiRXZlbnRzIiwiRUUiLCJmbiIsImNvbnRleHQiLCJvbmNlIiwiYWRkTGlzdGVuZXIiLCJlbWl0dGVyIiwiZXZlbnQiLCJsaXN0ZW5lciIsImV2dCIsIl9ldmVudHMiLCJfZXZlbnRzQ291bnQiLCJjbGVhckV2ZW50IiwiRXZlbnRFbWl0dGVyIiwiX19wcm90b19fIiwiZXZlbnROYW1lcyIsImV2ZW50cyIsInNsaWNlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibGlzdGVuZXJzIiwiaGFuZGxlcnMiLCJlZSIsImxpc3RlbmVyQ291bnQiLCJlbWl0IiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsInJlbW92ZUxpc3RlbmVyIiwib24iLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJvZmYiLCJwcmVmaXhlZCIsImN0b3IiLCJzdXBlckN0b3IiLCJzdXBlcl8iLCJ3cml0YWJsZSIsIlRlbXBDdG9yIiwicyIsIm0iLCJoIiwiZCIsInBsdXJhbCIsIm1zQWJzIiwibiIsImlzUGx1cmFsIiwicm91bmQiLCJvcHRpb25zIiwic3RyIiwiZXhlYyIsInBhcnNlRmxvYXQiLCJwYXJzZSIsImlzRmluaXRlIiwibG9uZyIsImZtdFNob3J0IiwiaXNXaW5kb3dzIiwicGxhdGZvcm0iLCJ1dGlsIiwibm9ybWFsaXplQXJyYXkiLCJwYXJ0cyIsImFsbG93QWJvdmVSb290IiwicmVzIiwicCIsInRyaW1BcnJheSIsImxhc3RJbmRleCIsInN0YXJ0IiwiZW5kIiwic3BsaXREZXZpY2VSZSIsInNwbGl0VGFpbFJlIiwid2luMzIiLCJ3aW4zMlNwbGl0UGF0aCIsImZpbGVuYW1lIiwicmVzdWx0IiwiZGV2aWNlIiwidGFpbCIsInJlc3VsdDIiLCJ3aW4zMlN0YXRQYXRoIiwicGF0aCIsImlzVW5jIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZVVOQ1Jvb3QiLCJyZXNvbHZlIiwicmVzb2x2ZWREZXZpY2UiLCJyZXNvbHZlZFRhaWwiLCJyZXNvbHZlZEFic29sdXRlIiwiY3dkIiwiaXNTdHJpbmciLCJub3JtYWxpemUiLCJ0cmFpbGluZ1NsYXNoIiwicGF0aHMiLCJhcmciLCJqb2luZWQiLCJyZWxhdGl2ZSIsInRvIiwibG93ZXJGcm9tIiwibG93ZXJUbyIsInRvUGFydHMiLCJsb3dlckZyb21QYXJ0cyIsImxvd2VyVG9QYXJ0cyIsIm1pbiIsInNhbWVQYXJ0c0xlbmd0aCIsIm91dHB1dFBhcnRzIiwiX21ha2VMb25nIiwicmVzb2x2ZWRQYXRoIiwiZGlybmFtZSIsImRpciIsImJhc2VuYW1lIiwiZXh0IiwiZiIsImV4dG5hbWUiLCJwYXRoT2JqZWN0IiwiaXNPYmplY3QiLCJiYXNlIiwic2VwIiwicGF0aFN0cmluZyIsImFsbFBhcnRzIiwic3BsaXRQYXRoUmUiLCJwb3NpeCIsInBvc2l4U3BsaXRQYXRoIiwiY2hhckF0Iiwic2VnbWVudCIsImZyb21QYXJ0cyIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiZSIsImNsZWFyVGltZW91dCIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiZHJhaW5pbmciLCJxdWV1ZUluZGV4IiwiY2xlYW5VcE5leHRUaWNrIiwiZHJhaW5RdWV1ZSIsInRpbWVvdXQiLCJydW4iLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJJdGVtIiwibm9vcCIsIm5leHRUaWNrIiwidGl0bGUiLCJicm93c2VyIiwiYXJndiIsInZlcnNpb25zIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImJpbmRpbmciLCJjaGRpciIsInVtYXNrIiwiY29weSIsImZpbGwiLCJyZWFkVUludDgiLCJmb3JtYXRSZWdFeHAiLCJvYmplY3RzIiwiaW5zcGVjdCIsImlzTnVsbCIsImRlcHJlY2F0ZSIsIm1zZyIsImlzVW5kZWZpbmVkIiwiZyIsIm5vRGVwcmVjYXRpb24iLCJ0aHJvd0RlcHJlY2F0aW9uIiwidHJhY2VEZXByZWNhdGlvbiIsInRyYWNlIiwiZGVidWdFbnZpcm9uIiwiZGVidWdzIiwib3B0cyIsImN0eCIsInNlZW4iLCJzdHlsaXplIiwic3R5bGl6ZU5vQ29sb3IiLCJkZXB0aCIsImlzQm9vbGVhbiIsInNob3dIaWRkZW4iLCJfZXh0ZW5kIiwiY3VzdG9tSW5zcGVjdCIsInN0eWxpemVXaXRoQ29sb3IiLCJmb3JtYXRWYWx1ZSIsInN0eWxlVHlwZSIsInN0eWxlcyIsInJlY3Vyc2VUaW1lcyIsImlzRnVuY3Rpb24iLCJyZXQiLCJwcmltaXRpdmUiLCJzaW1wbGUiLCJpc051bWJlciIsImZvcm1hdFByaW1pdGl2ZSIsInZpc2libGVLZXlzIiwiaWR4IiwiYXJyYXlUb0hhc2giLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiaXNFcnJvciIsImZvcm1hdEVycm9yIiwiaXNSZWdFeHAiLCJpc0RhdGUiLCJvdXRwdXQiLCJicmFjZXMiLCJ0b1VUQ1N0cmluZyIsImZvcm1hdFByb3BlcnR5IiwiZm9ybWF0QXJyYXkiLCJyZWR1Y2UiLCJjdXIiLCJyZWR1Y2VUb1NpbmdsZVN0cmluZyIsImxpbmUiLCJhciIsInJlIiwib2JqZWN0VG9TdHJpbmciLCJvIiwicGFkIiwiZGVidWdsb2ciLCJOT0RFX0RFQlVHIiwidG9VcHBlckNhc2UiLCJwaWQiLCJpc051bGxPclVuZGVmaW5lZCIsImlzU3ltYm9sIiwiaXNQcmltaXRpdmUiLCJpc0J1ZmZlciIsIm1vbnRocyIsInRpbWVzdGFtcCIsInRpbWUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiaW5oZXJpdHMiLCJvcmlnaW4iLCJhZGQiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImEiLCJkZWZpbml0aW9uIiwiZ2xvYmFsVGhpcyIsInRvU3RyaW5nVGFnIiwiX19hc3NpZ24iLCJhc3NpZ24iLCJ0IiwibG93ZXJDYXNlIiwiREVGQVVMVF9TUExJVF9SRUdFWFAiLCJERUZBVUxUX1NUUklQX1JFR0VYUCIsImlucHV0Iiwic25ha2VDYXNlIiwiX2EiLCJzcGxpdFJlZ2V4cCIsIl9iIiwic3RyaXBSZWdleHAiLCJfYyIsInRyYW5zZm9ybSIsIl9kIiwibm9DYXNlIiwiZG90Q2FzZSIsIklTX0RFViIsIlBST1RPQ09MX0ZJTEUiLCJQUk9UT0NPTF9MU1AiLCJVUkxfTFNQIiwiX2FwcFBhdGhSb290IiwiYXN5bmMiLCJnZXRBcHBQYXRoUm9vdCIsImludm9rZUhvc3RFeHBvcnRlZEFwaSIsImdldFNES1BhdGhSb290Iiwic2FmZXR5UGF0aEpvaW4iLCJpdGVtIiwiZGVlcE1lcmdlIiwidGFyZ2V0Iiwic291cmNlcyIsIlNldCIsImdlbklEIiwicmFuZG9tIiwidWNGaXJzdCIsIndpdGhGaWxlUHJvdG9jb2wiLCJiYXNlUGF0aCIsInVybCIsIlVSTCIsImZ1bGxQYXRoIiwic2FmZXR5UGF0aE5vcm1hbGl6ZSIsImRlZmVycmVkIiwicmVqZWN0Iiwic2V0dGxlZCIsInRpbWVGbiIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZTEiLCJyZWplY3QxIiwiY3JlYXRlZCIsIm5vdyIsInNldFRhZyIsIm1ldGhvZCIsIm1ldGhvZDEiLCJzdGFydHNXaXRoIiwibG9nc2VxSG9zdEV4cG9ydGVkQXBpIiwibG9nc2VxIiwiYXBpIiwiYXBpcyIsInNldHVwSWZyYW1lU2FuZGJveCIsInByb3BzIiwiaWZyYW1lIiwiY2xhc3NMaXN0IiwiZW50cmllcyIsImsiLCJzZXR1cEluamVjdGVkU3R5bGUiLCJhdHRycyIsImVsIiwicXVlcnlTZWxlY3RvciIsImhlYWQiLCJhcHBlbmQiLCJpbmplY3RlZFVJRWZmZWN0cyIsIk1hcCIsInNldHVwSW5qZWN0ZWRVSSIsInVpIiwiaW5pdGlhbENhbGxiYWNrIiwic2VsZWN0b3IiLCJmbG9hdCIsInNsb3QiLCJwbCIsImlkIiwiZGVidWdUYWciLCJ0ZWFyZG93blVJIiwiZGlzcG9zZUZsb2F0IiwiZGF0YXNldCIsImluamVjdGVkVWkiLCJjbG9zZSIsIl9zZXR1cFJlc2l6YWJsZUNvbnRhaW5lciIsIl9zZXR1cERyYWdnYWJsZUNvbnRhaW5lciIsInJlc2V0IiwicXVlcnlTZWxlY3RvckFsbCIsIml0IiwiZXhpc3QiLCJhZGRFdmVudExpc3RlbmVyIiwidHJpZ2dlciIsImNsb3Nlc3QiLCJtc2dUeXBlIiwiY2FsbGVyIiwiY2FsbFVzZXJNb2RlbCIsInRyYW5zZm9ybWFibGVFdmVudCIsImRlbGV0ZSIsInBvc2l0aW9uRGlydHkiLCJkeCIsImluY2x1ZGVzIiwiZHMiLCJGTEFHX1JFQ1QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b0pTT04iLCJpbmplY3RlZFRoZW1lRWZmZWN0Iiwic2V0dXBJbmplY3RlZFRoZW1lIiwibGluayIsInJlbCIsImhyZWYiLCJtZXNzYWdlVHlwZSIsIl9tZXNzYWdlSWQiLCJtZXNzYWdlVHlwZXMiLCJoYW5kc2hha2UiLCJyZXBseSIsInJlcXVlc3QiLCJhbGxvd2VkT3JpZ2luIiwicG9zdG1hdGUiLCJQYXJlbnRBUEkiLCJmcmFtZSIsImNoaWxkIiwiY2hpbGRPcmlnaW4iLCJpbmZvIiwiY2FsbGJhY2siLCJ1aWQiLCJ0cmFuc2FjdCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJwb3N0TWVzc2FnZSIsImV2ZW50TmFtZSIsIkNoaWxkQVBJIiwibW9kZWwiLCJwYXJlbnRPcmlnaW4iLCJ1bndyYXBwZWRDb250ZXh0IiwicmVzb2x2ZVZhbHVlIiwidGhlbiIsInNvdXJjZSIsIlBvc3RtYXRlIiwiY29udGFpbmVyIiwiY2xhc3NMaXN0QXJyYXkiLCJjb250ZW50V2luZG93Iiwic2VuZEhhbmRzaGFrZSIsInByb3RvY29sIiwibG9jYXRpb24iLCJob3N0IiwicG9ydCIsImhvc3RuYW1lIiwicmVzb2x2ZU9yaWdpbiIsInJlc3BvbnNlSW50ZXJ2YWwiLCJhdHRlbXB0IiwiY2xlYXJJbnRlcnZhbCIsImRvU2VuZCIsInNldEludGVydmFsIiwic3JjIiwiTW9kZWwiLCJzZW5kSGFuZHNoYWtlUmVwbHkiLCJzaGFrZSIsImRlZmF1bHRzIiwiTFNQbHVnaW5GaWxlU3RvcmFnZSIsImJhc2VJbmZvIiwiY2FsbEFzeW5jIiwiY3R4SWQiLCJjbGVhciIsImhhc0l0ZW0iLCJQUk9YWV9DT05USU5VRSIsImZvciIsInJlZ2lzdGVyU2ltcGxlQ29tbWFuZCIsImFjdGlvbiIsImxhYmVsIiwicGFsZXR0ZSIsImtleWJpbmRpbmciLCJldmVudEtleSIsInJlZ2lzdGVyZWRDbWRVaWQiLCJFZGl0b3IiLCJhcHAiLCJyZWdpc3RlckNvbW1hbmQiLCJyZWdpc3RlckNvbW1hbmRQYWxldHRlIiwicmVnaXN0ZXJVSUl0ZW0iLCJyZWdpc3RlclBhZ2VNZW51SXRlbSIsInNldEZ1bGxTY3JlZW4iLCJmbGFnIiwic2YiLCJfY2FsbFdpbiIsImVkaXRvciIsInJlZ2lzdGVyU2xhc2hDb21tYW5kIiwiYWN0aW9ucyIsInJlZ2lzdGVyQmxvY2tDb250ZXh0TWVudUl0ZW0iLCJzY3JvbGxUb0Jsb2NrSW5QYWdlIiwicGFnZU5hbWUiLCJibG9ja0lkIiwiYW5jaG9yIiwiQXBwIiwicHVzaFN0YXRlIiwiZGIiLCJMU1BsdWdpblVzZXIiLCJfYmFzZUluZm8iLCJfY2FsbGVyIiwiX2Nvbm5lY3RlZCIsIl91aSIsIl9maWxlU3RvcmFnZSIsIl9iZWZvcmV1bmxvYWRDYWxsYmFjayIsInN1cGVyIiwicGF5bG9hZCIsInRvZ2dsZSIsInRvZ2dsZU1haW5VSSIsImIiLCJzZXR0aW5ncyIsImFjdG9yIiwicmVzdCIsImNiIiwiY29ubmVjdFRvUGFyZW50IiwiZW5zdXJlQ29ubmVjdGVkIiwiYmVmb3JldW5sb2FkIiwicHJvdmlkZU1vZGVsIiwiX2V4dGVuZFVzZXJNb2RlbCIsInByb3ZpZGVUaGVtZSIsInRoZW1lIiwicHJvdmlkZVN0eWxlIiwicHJvdmlkZVVJIiwidXBkYXRlU2V0dGluZ3MiLCJzZXRNYWluVUlBdHRycyIsInNldE1haW5VSUlubGluZVN0eWxlIiwiaGlkZU1haW5VSSIsInZpc2libGUiLCJjdXJzb3IiLCJyZXN0b3JlRWRpdGluZ0N1cnNvciIsInNob3dNYWluVUkiLCJzdGF0ZSIsInJlc29sdmVSZXNvdXJjZUZ1bGxVcmwiLCJmaWxlUGF0aCIsImxzciIsIl9tYWtlVXNlclByb3h5IiwidGhhdCIsIlByb3h5IiwicHJvcEtleSIsInJlY2VpdmVyIiwib3JpZ01ldGhvZCIsImhvb2tNYXRjaGVyIiwiaGFuZGxlciIsIl9fTFNQX19IT1NUX18iLCJMU1BsdWdpbkNhbGxlciIsImltcG9ydEhUTUwiLCJjcmVhdGVTYW5kYm94Q29udGFpbmVyIiwiUVNhbmRib3giLCJ1c2VyRmV0Y2giLCJmZXRjaCIsImRvQWN0aW9uIiwiTFNQbHVnaW5TaGFkb3dGcmFtZSIsIl9wbHVnaW5Mb2NhbCIsIl9mcmFtZSIsIl9yb290IiwiX2xvYWRlZCIsIl91bm1vdW50Rm5zIiwiX2Rpc3Bvc2UiLCJfdW5tb3VudCIsImVudHJ5IiwibG9hZGVkIiwiZXhlY1NjcmlwdHMiLCJfbW91bnQiLCJnbG9iYWwiLCJlbGVtZW50R2V0dGVyIiwiaW5zdGFuY2UiLCJwcm94eSIsIl9fc2hhZG93X21vZGVfXyIsIkxTUGx1Z2luTG9jYWwiLCJMU1BsdWdpblNoYWRvdyIsImV4ZWNSZXN1bHQiLCJ1bm1vdW50IiwiYXR0YWNoU2hhZG93IiwibW9kZSIsIkZMQUdfQVdBSVQiLCJMU1BNU0ciLCJMU1BNU0dfRVJST1JfVEFHIiwiTFNQTVNHX1NFVFRJTkdTIiwiTFNQTVNHX0JFRk9SRV9VTkxPQUQiLCJMU1BNU0dfU1lOQyIsIkxTUE1TR19SRUFEWSIsIkxTUE1TR0ZuIiwiX3BhcmVudCIsIl9jaGlsZCIsIl9zaGFkb3ciLCJfc3RhdHVzIiwiX3VzZXJNb2RlbCIsIl9jYWxsIiwiX2NhbGxVc2VyTW9kZWwiLCJfZGVidWdUYWciLCJzaGFkb3ciLCJfc2V0dXBTaGFkb3dTYW5kYm94IiwiX3NldHVwSWZyYW1lU2FuZGJveCIsInVzZXJNb2RlbCIsImlzU2hhZG93TW9kZSIsInN5bmNHQ1RpbWVyIiwic3luY1RhZyIsInN5bmNBY3RvcnMiLCJyZWFkeURlZmVycmVkIiwibnMiLCJfc3luYyIsInJlZlBhcmVudCIsInNpemUiLCJmaW5hbGx5Iiwic2VhcmNoUGFyYW1zIiwiemIiLCJwYXJlbnRFbGVtZW50IiwiY250IiwibWFpbkxheW91dEluZm8iLCJpbml0ZWRfbGF5b3V0Iiwid2lkdGgiLCJoZWlnaHQiLCJsZWZ0IiwidG9wIiwidGltZXIiLCJyZWZDaGlsZCIsIiQkcGlkIiwiY2F0Y2giLCJfZ2V0U2FuZGJveElmcmFtZUNvbnRhaW5lciIsIl9nZXRTYW5kYm94U2hhZG93Q29udGFpbmVyIiwiX2dldFNhbmRib3hJZnJhbWVSb290IiwiX2dldFNhbmRib3hTaGFkb3dSb290IiwiRElSX1BMVUdJTlMiLCJQbHVnaW5TZXR0aW5ncyIsIl91c2VyUGx1Z2luU2V0dGluZ3MiLCJfc2V0dGluZ3MiLCJkaXNhYmxlZCIsIlBsdWdpbkxvZ2dlciIsIl90YWciLCJfbG9ncyIsIndyaXRlIiwiYWMiLCJ0b0xvY2FsZVRpbWVTdHJpbmciLCJQbHVnaW5Mb2NhbExvYWRTdGF0dXMiLCJjb252ZXJ0VG9MU1BSZXNvdXJjZSIsImZ1bGxVcmwiLCJkb3RQbHVnaW5Sb290IiwiSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvciIsIkV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvciIsIlBsdWdpbkxvY2FsIiwiX29wdGlvbnMiLCJfdGhlbWVNZ3IiLCJfY3R4IiwiX2Rpc3Bvc2VzIiwiX2lkIiwiVU5MT0FERUQiLCJfbG9hZEVyciIsIl9sb2NhbFJvb3QiLCJfZG90U2V0dGluZ3NGaWxlIiwicGx1Z2luTG9jYWwiLCJnZXRNYWluVUlDb250YWluZXIiLCJmb2N1cyIsImlzSW5pdGVkTGF5b3V0IiwiaW5pdE1haW5VSUhhbmRsZXJzIiwidGhlbWVkIiwidGhlbWVNZ3IiLCJyZWdpc3RlclRoZW1lIiwidW5yZWdpc3RlclRoZW1lIiwiX29uSG9zdE1vdW50ZWQiLCJpZGVudGl0eSIsImxheW91dENvcmUiLCJtb3ZlX2NvbnRhaW5lcl90b190b3AiLCJpbml0UHJvdmlkZXJIYW5kbGVycyIsImluaXRBcGlQcm94eUhhbmRsZXJzIiwibG9nZ2VyIiwidXNlclNldHRpbmdzRmlsZVBhdGgiLCJ1c2VyU2V0dGluZ3MiLCJ1bmxvYWQiLCJfcmVzb2x2ZVJlc291cmNlRnVsbFVybCIsImxvY2FsUm9vdCIsInJlZyIsImVmZmVjdCIsImlzSW5zdGFsbGVkSW5Eb3RSb290IiwiZG90UGx1Z2luc1Jvb3QiLCJwa2ciLCJtYWluIiwiZGV2RW50cnkiLCJpY29uIiwicmVnaXN0ZXJlZFBsdWdpbnMiLCJpc1JlZ2lzdGVyaW5nIiwidGhlbWVzIiwiX2xvYWRDb25maWdUaGVtZXMiLCJlbmRzV2l0aCIsImRpclBhdGhJbnN0YWxsZWQiLCJ0bXBfZmlsZV9tZXRob2QiLCJzZGtQYXRoUm9vdCIsImVudHJ5UGF0aCIsIl9wZXJzaXN0TWFpblVJTGF5b3V0RGF0YSIsImxheW91dHMiLCJpbml0ZWRfZHJhZ2dhYmxlIiwiaXNJbmplY3RlZFVJIiwiaGFuZGxlIiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJwcmVwZW5kIiwiZGlzcG9zZSIsInNldHVwX2RyYWdnYWJsZV9jb250YWluZXJfQkFOR18iLCJyZW1vdmVPdXRzaWRlTGlzdGVuZXIiLCJjb250YWlucyIsImluaXRlZF9yZXNpemFibGUiLCJmcm9udGVuZCIsIm1vZHVsZXMiLCJsYXlvdXQiLCJjb3JlIiwic2V0dXBfcmVzaXphYmxlX2NvbnRhaW5lcl9CQU5HXyIsInJlYWR5SW5kaWNhdG9yIiwicGVuZGluZyIsIkxPQURJTkciLCJpbnN0YWxsUGFja2FnZVRoZW1lcyIsIl9wcmVwYXJlUGFja2FnZUNvbmZpZ3MiLCJfc2V0dXBVc2VyU2V0dGluZ3MiLCJfdHJ5VG9Ob3JtYWxpemVFbnRyeSIsImNvbm5lY3RUb0NoaWxkIiwicmVhZHlGbiIsIkVSUk9SIiwiTE9BREVEIiwidW5yZWdpc3RlciIsIlVOTE9BRElORyIsImV2ZW50QmVmb3JlVW5sb2FkIiwiaG9zdE1vdW50ZWRBY3RvciIsImRvdFJvb3QiLCJkb3RDb25maWdSb290IiwicGxnUm9vdCIsImpzb24iLCJlcnIiLCJsb2FkRXJyIiwidXNmIiwiZG90U2V0dGluZ3NGaWxlIiwiaWlyIiwiTFNQbHVnaW5Db3JlIiwiX2lzUmVnaXN0ZXJpbmciLCJfcmVhZHlJbmRpY2F0b3IiLCJfaG9zdE1vdW50ZWRBY3RvciIsIl91c2VyUHJlZmVyZW5jZXMiLCJfcmVnaXN0ZXJlZFRoZW1lcyIsIl9yZWdpc3RlcmVkUGx1Z2lucyIsIl9jdXJyZW50VGhlbWUiLCJzZWxlY3RUaGVtZSIsInBsdWdpbnMiLCJpbml0aWFsIiwicmVnaXN0ZXIiLCJwZXJmVGFibGUiLCJkZWJ1Z1BlcmZJbmZvIiwidmFsdWVzIiwic3RhdHVzIiwicGVyZiIsInRvRml4ZWQiLCJfX2RlYnVnUGx1Z2luc1BlcmZJbmZvIiwibG9hZFVzZXJQcmVmZXJlbmNlcyIsImV4dGVybmFscyIsImZpbHRlciIsImV2ZXJ5IiwicGx1Z2luT3B0aW9ucyIsInBlcmZJbmZvIiwicGVyZm9ybWFuY2UiLCJzYXZlVXNlclByZWZlcmVuY2VzIiwiYWN0aXZhdGVVc2VyUHJlZmVyZW5jZXMiLCJlbnN1cmVQbHVnaW4iLCJyZWxvYWQiLCJ1bnJlZ2lzdGVyZWRFeHRlcm5hbHMiLCJwbHVnaW4iLCJob29rQXBwIiwiX2hvb2siLCJob29rRWRpdG9yIiwiX2V4ZWNEaXJlY3RpdmUiLCJwYXJhbXMiLCJob3N0TW91bnRlZCIsIm9wdCIsImRpcyIsImRpc0luamVjdGVkVGhlbWUiLCJzZXR1cFBsdWdpbkNvcmUiLCJwbHVnaW5Db3JlIl0sInNvdXJjZVJvb3QiOiIifQ==