Rebuilt features.js (includes i18n language selector + share modal updates) and sw.js (updated service worker cache hash).
850 lines
712 KiB
JavaScript
850 lines
712 KiB
JavaScript
(function(c){"use strict";class a{constructor(){this.errors=[],this.maxErrors=50}logError(h,g,m={}){const b={timestamp:new Date().toISOString(),context:h,message:g instanceof Error?g.message:g,stack:g instanceof Error?g.stack:null,metadata:m};this.errors.push(b),this.errors.length>this.maxErrors&&this.errors.shift(),console.error(`[Onboarding Error] ${h}:`,g,m)}recoverFromError(h,g){switch(this.classifyError(h)){case"ELEMENT_NOT_FOUND":return this.logError("Element Not Found",h,{currentStep:g}),{action:"SKIP_STEP",nextStep:g+1,message:"Target element not found, skipping to next step"};case"STORAGE_UNAVAILABLE":return this.logError("Storage Unavailable",h),{action:"USE_MEMORY_STORAGE",message:"Local storage unavailable, using in-memory storage"};case"DRIVER_NOT_LOADED":return this.logError("Driver.js Not Loaded",h),{action:"ABORT_TOUR",message:"Driver.js library not loaded, cannot start tour"};case"INVALID_TOOLTIP":return this.logError("Invalid Tooltip Configuration",h,{currentStep:g}),{action:"SKIP_STEP",nextStep:g+1,message:"Invalid tooltip configuration, skipping"};case"THEME_DETECTION_FAILED":return this.logError("Theme Detection Failed",h),{action:"USE_DEFAULT_THEME",message:"Using default dark theme"};default:return this.logError("Unknown Error",h,{currentStep:g}),{action:"ABORT_TOUR",message:"Unexpected error occurred, aborting tour"}}}classifyError(h){const g=h.message||h.toString();return g.includes("element")&&g.includes("not found")?"ELEMENT_NOT_FOUND":g.includes("storage")||g.includes("quota")?"STORAGE_UNAVAILABLE":g.includes("driver")||g.includes("undefined")?"DRIVER_NOT_LOADED":g.includes("invalid")||g.includes("validation")?"INVALID_TOOLTIP":g.includes("theme")?"THEME_DETECTION_FAILED":"UNKNOWN"}getErrors(){return[...this.errors]}clearErrors(){this.errors=[]}getStatistics(){const h={total:this.errors.length,byContext:{},byType:{},recent:this.errors.slice(-10)};return this.errors.forEach(g=>{h.byContext[g.context]=(h.byContext[g.context]||0)+1;const m=this.classifyError({message:g.message});h.byType[m]=(h.byType[m]||0)+1}),h}handleDriverLoadFailure(){this.logError("Driver.js Load Failure","Driver.js library failed to load");const h=document.createElement("div");return h.id="onboarding-fallback",h.style.cssText=`
|
|
position: fixed;
|
|
bottom: 20px;
|
|
right: 20px;
|
|
background: var(--card-base, #2a2a2a);
|
|
color: var(--fg, #ffffff);
|
|
padding: 15px 20px;
|
|
border-radius: 8px;
|
|
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
|
z-index: 9999;
|
|
max-width: 300px;
|
|
font-size: 14px;
|
|
`,h.innerHTML=`
|
|
<strong>Welcome to DashCaddy!</strong><br>
|
|
<p style="margin: 10px 0 0 0; font-size: 12px;">
|
|
The interactive tour is unavailable, but you can explore the dashboard freely.
|
|
Check the documentation for help getting started.
|
|
</p>
|
|
`,document.body.appendChild(h),setTimeout(()=>{h.parentNode&&h.parentNode.removeChild(h)},1e4),!0}handleStorageUnavailable(){this.logError("Storage Unavailable","Local storage is not available");const h={data:{},getItem(g){return this.data[g]||null},setItem(g,m){this.data[g]=m},removeItem(g){delete this.data[g]},clear(){this.data={}}};return console.warn("[ErrorHandler] Using in-memory storage - progress will not persist"),h}sendToErrorTracking(h){}}c.ErrorHandler=a,console.log("[ErrorHandler] Module loaded")})(window);const DC={NAME:"DashCaddy",POLL:{DASHBOARD:1e4,LOGS:3e3,STATS:5e3,WEATHER:6e5,HEALTH:1e3,DEPLOY_SSL:5e3},DELAYS:{BTN_RESET:2e3,RELOAD:5e3,MODAL_CLOSE:500,PORT_CHECK:500,DEPLOY_INIT:3e3},DEFAULTS:{DNS_PORT:"5380",SERVICE_PORT:"8080",TTL:300,CADDYFILE:"C:\\caddy\\Caddyfile"}},errorHandler=new ErrorHandler,_cachedCfg=JSON.parse(localStorage.getItem("dashcaddy_site_config")||"null"),SITE={tld:_cachedCfg&&_cachedCfg.tld||".home",dnsIp:"",dnsPort:DC.DEFAULTS.DNS_PORT,dnsServers:{},configurationType:_cachedCfg&&_cachedCfg.configurationType||"homelab",domain:_cachedCfg&&_cachedCfg.domain||"",defaults:_cachedCfg&&_cachedCfg.defaults||{},routingMode:_cachedCfg&&_cachedCfg.routingMode||"subdomain",onboardingCompleted:!1};window.__dashcaddySiteConfigLoaded=(async function(){try{const h=await fetch("/api/v1/config");if(h.ok){const g=await h.json();if(g.tld&&(SITE.tld=g.tld.startsWith(".")?g.tld:"."+g.tld),g.dns&&(SITE.dnsIp=g.dns.ip||"",SITE.dnsPort=g.dns.port||DC.DEFAULTS.DNS_PORT),g.dnsServers&&typeof g.dnsServers=="object")for(const[b,r]of Object.entries(g.dnsServers))b!=="__proto__"&&b!=="constructor"&&b!=="prototype"&&(SITE.dnsServers[b]=r);g.configurationType&&(SITE.configurationType=g.configurationType),g.domain&&(SITE.domain=g.domain),g.defaults&&(SITE.defaults=g.defaults),g.routingMode&&(SITE.routingMode=g.routingMode),SITE.onboardingCompleted=g.onboardingCompleted===!0,localStorage.setItem("dashcaddy_site_config",JSON.stringify({tld:SITE.tld,configurationType:SITE.configurationType,domain:SITE.domain,routingMode:SITE.routingMode})),renderDnsCards();const m=document.getElementById("manage-tokens");m&&(m.style.display=Object.keys(SITE.dnsServers).length?"":"none")}}catch{}document.querySelectorAll("[data-tld]").forEach(h=>h.textContent=SITE.tld);const a=document.getElementById("edit-tld-suffix");a&&(a.textContent=SITE.tld);const f=document.getElementById("external-proxy-ip");f&&SITE.dnsIp&&(f.value=SITE.dnsIp,f.placeholder=SITE.dnsIp)})();function buildDomain(c){return c+SITE.tld}function buildServiceUrl(c){return SITE.routingMode==="subdirectory"&&SITE.domain?"https://"+SITE.domain+"/"+c:SITE.configurationType==="public"&&SITE.domain?"https://"+c+"."+SITE.domain:"https://"+buildDomain(c)}function getDnsServerAddr(c){const a=SITE.dnsServers[c];return a?`${a.ip}:${a.port}`:buildDomain(c)}function getPrimaryDnsId(){if(!SITE.dnsIp)return null;for(const[c,a]of Object.entries(SITE.dnsServers))if(a.ip===SITE.dnsIp)return c;return null}function renderDnsCards(){const c=document.querySelector(".top");if(!c)return;const a=Object.keys(SITE.dnsServers);if(!a.length)return;const f='<svg viewBox="0 0 24 24" class="service-icon"><rect x="3" y="4" width="18" height="16" rx="2" fill="#34495e"/><rect x="5" y="6" width="14" height="2" rx="1" fill="#3498db"/><rect x="5" y="9" width="10" height="1" fill="#ecf0f1"/><rect x="5" y="11" width="12" height="1" fill="#ecf0f1"/><rect x="5" y="13" width="8" height="1" fill="#ecf0f1"/><rect x="5" y="15" width="14" height="1" fill="#ecf0f1"/><circle cx="17" cy="11" r="2" fill="#e74c3c"/><path d="M17 9v4M15 11h4" stroke="white" stroke-width="1"/></svg>',h=c.firstElementChild;a.forEach(g=>{const m=escapeHtml(g),b=escapeHtml((SITE.dnsServers[g].name||g).toUpperCase()),r=document.createElement("div");r.className="card",r.setAttribute("data-app",g),r.setAttribute("data-status","off"),r.innerHTML=`<span id="${m}-dot" class="dot bad at-bl"></span><div class="row"><div class="logo-wrap">${f}</div><span class="name">${b}</span><span class="spacer"></span><span id="${m}-pill" class="badge off">OFF</span></div><div class="response-row"><span id="${m}-time" class="response-time">--</span></div><div class="health-row" id="health-${m}"><span id="uptime-${m}" class="uptime-chip">--</span><div class="uptime-mini-bar"><div class="fill" id="uptime-bar-${m}" style="width: 0%"></div></div></div><div class="btn-row"><button id="${m}-restart" class="restart-btn">Restart</button><button id="${m}-update" class="update-btn" title="Update DNS server">\u2B06\uFE0F</button><button id="${m}-open">Open</button><button id="${m}-logs" class="logs-btn">Logs</button><button id="${m}-settings" class="settings-btn">\u2699\uFE0F</button></div>`,c.insertBefore(r,h)})}window.renderDnsCards=renderDnsCards;let csrfToken=null;async function getCSRFToken(){if(csrfToken)return csrfToken;try{const c=await fetch("/api/v1/csrf-token");if(!c.ok)throw new Error("Failed to fetch CSRF token");return csrfToken=(await c.json()).token,csrfToken}catch(c){throw errorHandler.logError("[CSRF] Get Token",c,{function:"getCSRFToken"}),c}}async function secureFetch(c,a={}){const f=(a.method||"GET").toUpperCase(),h=!["GET","HEAD","OPTIONS"].includes(f);if(h)try{const m=await getCSRFToken();a.headers={...a.headers,"X-CSRF-Token":m}}catch(m){errorHandler.logError("[CSRF] Add to Request",m,{function:"secureFetch"})}a.signal||(a={...a,signal:AbortSignal.timeout(15e3)}),a.credentials=a.credentials||"same-origin";const g=await fetch(c,a);if(h&&g.status===403)try{const m=await g.clone().json();if(m.error&&(m.error.includes("DC-100")||m.error.includes("DC-101"))){csrfToken=null;const b=await getCSRFToken();return a.headers={...a.headers,"X-CSRF-Token":b},a.signal=AbortSignal.timeout(15e3),fetch(c,a)}}catch{}return g}async function postJSON(c,a){const f=await secureFetch(c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),h=await f.json();if(!f.ok||h.success===!1)throw new Error(h.error||`Request failed (${f.status})`);return h}async function getJSON(c){const a=await secureFetch(c);if(!a.ok){let f=`Request failed (${a.status})`;try{f=(await a.json()).error||f}catch{}throw new Error(f)}return a.json()}async function deleteAPI(c){const a=await secureFetch(c,{method:"DELETE"}),f=await a.json();if(!a.ok||f.success===!1)throw new Error(f.error||`Delete failed (${a.status})`);return f}async function withButton(c,a,f,h={}){const g=c.innerHTML,{successText:m="\u2705",resetDelay:b=DC.DELAYS.BTN_RESET}=h;c.disabled=!0,c.innerHTML=a;try{const r=await f();return c.innerHTML=m,setTimeout(()=>{c.innerHTML=g,c.disabled=!1},b),r}catch(r){throw c.innerHTML=g,c.disabled=!1,r}}function openModal(c){document.getElementById(c)?.classList.add("show")}function closeModal(c){document.getElementById(c)?.classList.remove("show")}function wireModal(c,...a){c&&(c.addEventListener("click",f=>{f.target===c&&c.classList.remove("show")}),a.forEach(f=>{f&&typeof f.addEventListener=="function"&&f.addEventListener("click",()=>c.classList.remove("show"))}))}function showNotification(c,a="info",f=3e3){const h=document.querySelector(".deploy-notification");h&&h.remove();const g={info:{bg:"#2196F3",fg:"#fff"},success:{bg:"var(--ok-bg)",fg:"var(--ok-fg)"},error:{bg:"#f44336",fg:"#fff"},warning:{bg:"#ff9800",fg:"#fff"}},m=g[a]||g.info,b=document.createElement("div");b.className="deploy-notification",b.textContent=c,b.style.cssText=`
|
|
position: fixed; top: 20px; right: 20px;
|
|
background: ${m.bg}; color: ${m.fg};
|
|
padding: 16px 24px; border-radius: 8px;
|
|
box-shadow: 0 4px 12px rgba(0,0,0,.3);
|
|
z-index: 10000; animation: slideIn 0.3s ease-out;
|
|
max-width: 400px; white-space: pre-line; font-size: 14px;
|
|
`,document.body.appendChild(b),f>0&&setTimeout(()=>b.remove(),f)}function timeAgo(c){const a=Date.now()-new Date(c).getTime();return a<6e4?"just now":a<36e5?Math.floor(a/6e4)+"m ago":a<864e5?Math.floor(a/36e5)+"h ago":Math.floor(a/864e5)+"d ago"}function safeGet(c,a=null){try{const f=localStorage.getItem(c);return f!==null?f:a}catch{return a}}function safeSet(c,a){try{localStorage.setItem(c,a)}catch{}}function safeRemove(c){try{localStorage.removeItem(c)}catch{}}function safeSessionGet(c,a=null){try{const f=sessionStorage.getItem(c);return f!==null?f:a}catch{return a}}function safeSessionSet(c,a){try{sessionStorage.setItem(c,a)}catch{}}function safeGetJSON(c,a=null){try{const f=localStorage.getItem(c);return f?JSON.parse(f):a}catch{return a}}function escapeHtml(c){return String(c??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function injectModal(c,a){document.getElementById(c)||document.body.insertAdjacentHTML("beforeend",a)}const DC_BUS={_handlers:{},on(c,a){var f;((f=this._handlers)[c]||(f[c]=[])).push(a)},off(c,a){this._handlers[c]=this._handlers[c]?.filter(f=>f!==a)},emit(c,a){this._handlers[c]?.forEach(f=>f(a))}},AppState={_apps:[],getApps(){return this._apps},setApps(c){this._apps=c,window.APPS=c,DC_BUS.emit("apps:changed",c)},findApp(c){return this._apps.find(a=>a.id===c)},addApp(c){this._apps.push(c),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)},removeApp(c){const a=this._apps.findIndex(f=>f.id===c);return a>-1&&(this._apps.splice(a,1),window.APPS=this._apps,DC_BUS.emit("apps:changed",this._apps)),a>-1},updateApp(c,a){const f=this._apps.find(h=>h.id===c);if(f){for(const[h,g]of Object.entries(a))h!=="__proto__"&&h!=="constructor"&&h!=="prototype"&&(f[h]=g);DC_BUS.emit("apps:changed",this._apps)}return f}};(function(){function c(){const h=document.createElement("div");return h.className="skeleton-card",h.innerHTML='<div style="display:flex;align-items:center;gap:12px;margin-bottom:12px"><div class="skeleton-bar" style="width:48px;height:48px;border-radius:8px;flex-shrink:0"></div><div style="flex:1"><div class="skeleton-bar" style="width:60%;height:14px;margin-bottom:6px"></div><div class="skeleton-bar" style="width:35%;height:10px"></div></div><div class="skeleton-bar" style="width:42px;height:22px;border-radius:11px"></div></div><div class="skeleton-bar" style="width:45%;height:12px;margin-bottom:10px"></div><div style="display:flex;gap:8px;margin-top:auto"><div class="skeleton-bar" style="width:64px;height:28px;border-radius:8px"></div><div class="skeleton-bar" style="width:64px;height:28px;border-radius:8px"></div></div>',h}function a(h){const g=document.getElementById("cards");if(!(!g||g.querySelector(".card"))){h=h||6;for(let m=0;m<h;m++){const b=c();g.appendChild(b),setTimeout(function(){b.classList.add("loaded")},m*60)}}}function f(){const h=document.getElementById("cards");if(h){var g=h.querySelectorAll(".skeleton-card");g.length&&(g.forEach(function(m,b){setTimeout(function(){m.style.opacity="0",m.style.transform="translateY(-10px)"},b*25)}),setTimeout(function(){g.forEach(function(m){m.parentNode&&m.remove()})},g.length*25+300))}}window.SkeletonLoader={show:a,hide:f}})(),(function(){var c="theme",a="user-themes",f="custom-theme",h=["dark","light","blue","black","nord","dracula","solarized-dark","solarized-light","taxi","ocean"],g=h.slice(),m=["bg","fg","muted","fg-muted","card-base","card-bg","border","hover","card-hover","base","ok-bg","ok-fg","bad-bg","bad-fg","dot-ok","dot-bad","uptime","success","error","warning","accent","accent-strong"],b=["bg","fg","muted","card-base","card-bg","border","ok-bg","ok-fg","bad-bg","bad-fg","dot-ok","dot-bad","uptime","accent","accent-strong"],r=["fg-muted","hover","card-hover","base","success","error","warning"],v={dark:{bg:"#0b0f1a",fg:"#e8ecf5",muted:"#9aa6bf","fg-muted":"#6b7a94","card-base":"#121826","card-bg":"#121826",border:"#263552",hover:"#1a2235","card-hover":"#161e2e",base:"#151c2b","ok-bg":"#0c2430","ok-fg":"#7ef2ff","bad-bg":"#2a121a","bad-fg":"#ff9aa3","dot-ok":"#35d1ff","dot-bad":"#ff5f7a",uptime:"#35d1ff",success:"#4caf50",error:"#e74c3c",warning:"#f39c12",accent:"#8FD6FF","accent-strong":"#1F7BFF"},light:{bg:"#f6f7fb",fg:"#0f1115",muted:"#5f6b7a","fg-muted":"#8993a4","card-base":"#ffffff","card-bg":"#ffffff",border:"#e2e7ef",hover:"#eef1f6","card-hover":"#f5f6fa",base:"#ebeef3","ok-bg":"#eafff1","ok-fg":"#0a7c3a","bad-bg":"#ffefef","bad-fg":"#b00020","dot-ok":"#0fb15a","dot-bad":"#d93b3b",uptime:"#0fb15a",success:"#0a7c3a",error:"#b00020",warning:"#d68a00",accent:"#4a90d9","accent-strong":"#2563eb",lightBg:!0},blue:{bg:"#1908AC",fg:"#e8f1ff",muted:"#d6e2ff","fg-muted":"#9eafdb","card-base":"#0d1533","card-bg":"#0d1533",border:"#1c2d6a",hover:"#141f4a","card-hover":"#111a3e",base:"#0f1840","ok-bg":"#162040","ok-fg":"#edffff","bad-bg":"#0a0e24","bad-fg":"#ffb3c0","dot-ok":"#c7e5ff","dot-bad":"#ffd6dc",uptime:"#7ec8ff",success:"#7ec8ff",error:"#ffb3c0",warning:"#ffd080",accent:"#9cd4ff","accent-strong":"#6fb2ff"},black:{bg:"#0e0e0e",fg:"#f5f5f5",muted:"#999999","fg-muted":"#666666","card-base":"#1a1a1a","card-bg":"#1a1a1a",border:"#2e2e2e",hover:"#242424","card-hover":"#202020",base:"#161616","ok-bg":"#0f2a12","ok-fg":"#66ff7a","bad-bg":"#2a0f0f","bad-fg":"#ff6b6b","dot-ok":"#4caf50","dot-bad":"#ff4444",uptime:"#e0e0e0",success:"#4caf50",error:"#ff4444",warning:"#ff9800",accent:"#E63946","accent-strong":"#C62828"},nord:{bg:"#2e3440",fg:"#eceff4",muted:"#81a1c1","fg-muted":"#6882a0","card-base":"#3b4252","card-bg":"#3b4252",border:"#4c566a",hover:"#434c5e","card-hover":"#3f4858",base:"#353c4a","ok-bg":"#2d4f3e","ok-fg":"#a3be8c","bad-bg":"#4a2c2a","bad-fg":"#bf616a","dot-ok":"#a3be8c","dot-bad":"#bf616a",uptime:"#a3be8c",success:"#a3be8c",error:"#bf616a",warning:"#ebcb8b",accent:"#88c0d0","accent-strong":"#5e81ac"},dracula:{bg:"#282a36",fg:"#f8f8f2",muted:"#6272a4","fg-muted":"#515d85","card-base":"#44475a","card-bg":"#44475a",border:"#6272a4",hover:"#4e5170","card-hover":"#494c63",base:"#363848","ok-bg":"#1e3a2e","ok-fg":"#50fa7b","bad-bg":"#3d1a1a","bad-fg":"#ff5555","dot-ok":"#50fa7b","dot-bad":"#ff5555",uptime:"#50fa7b",success:"#50fa7b",error:"#ff5555",warning:"#f1fa8c",accent:"#bd93f9","accent-strong":"#8be9fd"},"solarized-dark":{bg:"#002b36",fg:"#839496",muted:"#586e75","fg-muted":"#4a5f65","card-base":"#073642","card-bg":"#073642",border:"#586e75",hover:"#0d4050","card-hover":"#0a3a48",base:"#053340","ok-bg":"#0d3d2c","ok-fg":"#859900","bad-bg":"#3d1a1a","bad-fg":"#dc322f","dot-ok":"#859900","dot-bad":"#dc322f",uptime:"#b5bd68",success:"#859900",error:"#dc322f",warning:"#b58900",accent:"#268bd2","accent-strong":"#2aa198"},"solarized-light":{bg:"#fdf6e3",fg:"#657b83",muted:"#93a1a1","fg-muted":"#adb8b8","card-base":"#eee8d5","card-bg":"#eee8d5",border:"#93a1a1",hover:"#e6dfcb","card-hover":"#eae3cf",base:"#e8e1cd","ok-bg":"#e8f5e8","ok-fg":"#859900","bad-bg":"#fdf2f2","bad-fg":"#dc322f","dot-ok":"#859900","dot-bad":"#dc322f",uptime:"#859900",success:"#859900",error:"#dc322f",warning:"#b58900",accent:"#268bd2","accent-strong":"#2aa198",lightBg:!0},taxi:{bg:"#f3d321",fg:"#0e0e00",muted:"#4a4a10","fg-muted":"#6b6b30","card-base":"#ffd700","card-bg":"#ffd700",border:"#b8a840",hover:"#ffe84d","card-hover":"#ffe033",base:"#f0d000","ok-bg":"#d4ffd9","ok-fg":"#0f2a0f","bad-bg":"#ffd4d4","bad-fg":"#2a0f0f","dot-ok":"#4caf50","dot-bad":"#ff4444",uptime:"#0e0e00",success:"#2e7d32",error:"#c62828",warning:"#e65100",accent:"#7a4a00","accent-strong":"#5c3800",lightBg:!0},ocean:{bg:"#2060b0",fg:"#faf5eb",muted:"#dcd2c0","fg-muted":"#b0a890","card-base":"#7a94ed","card-bg":"#7a94ed",border:"#deb67a",hover:"#8aa0f0","card-hover":"#8298e8",base:"#6888e0","ok-bg":"#4f5bb0","ok-fg":"#c7d7eb","bad-bg":"#f41a3a","bad-fg":"#6a1818","dot-ok":"#30a050","dot-bad":"#d04040",uptime:"#2d32f2",success:"#30a050",error:"#d04040",warning:"#e6a030",accent:"#1860a0","accent-strong":"#104080"}};function d(C){return!C||typeof C!="string"?{r:0,g:0,b:0}:(C=C.replace("#",""),C.length===3&&(C=C[0]+C[0]+C[1]+C[1]+C[2]+C[2]),{r:parseInt(C.substr(0,2),16)||0,g:parseInt(C.substr(2,2),16)||0,b:parseInt(C.substr(4,2),16)||0})}function o(C,B,$){return"#"+[C,B,$].map(function(k){var x=Math.max(0,Math.min(255,Math.round(k))).toString(16);return x.length===1?"0"+x:x}).join("")}function p(C,B,$){var k=d(C),x=d(B);return o(k.r+(x.r-k.r)*$,k.g+(x.g-k.g)*$,k.b+(x.b-k.b)*$)}function s(C){C=C.replace("#",""),C.length===3&&(C=C[0]+C[0]+C[1]+C[1]+C[2]+C[2]);var B=parseInt(C.substr(0,2),16)/255,$=parseInt(C.substr(2,2),16)/255,k=parseInt(C.substr(4,2),16)/255;return B=B<=.03928?B/12.92:Math.pow((B+.055)/1.055,2.4),$=$<=.03928?$/12.92:Math.pow(($+.055)/1.055,2.4),k=k<=.03928?k/12.92:Math.pow((k+.055)/1.055,2.4),.2126*B+.7152*$+.0722*k}function e(C){var B=C.bg||"#0b0f1a",$=C.fg||"#e8ecf5",k=C.muted||"#9aa6bf",x=C["card-base"]||C.bg||"#121826",I=C["dot-ok"]||"#4caf50",E=C["dot-bad"]||"#e74c3c",S=C.lightBg||B&&s(B)>.4,A={};return A.hover=S?p(x,B,.35):p(x,$,.08),A["card-hover"]=p(x,A.hover,.5),A.base=p(B,x,.6),A["fg-muted"]=p(k,B,.35),A.success=I,A.error=E,A.warning=S?"#d68a00":"#f39c12",A}function n(C,B){var $=B.lightBg||B.bg&&s(B.bg)>.4,k=B.accent||B["accent-strong"]||"#888888",x=d(k);return $?":root."+C+` body {
|
|
background:
|
|
radial-gradient(1200px 800px at 10% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .08), transparent 60%),
|
|
radial-gradient(1000px 700px at 110% 10%, rgba(`+x.r+","+x.g+","+x.b+`, .05), transparent 55%),
|
|
var(--bg);
|
|
}
|
|
`:":root."+C+` body {
|
|
background:
|
|
radial-gradient(1200px 900px at 8% -12%, rgba(`+x.r+","+x.g+","+x.b+`, .10), transparent 60%),
|
|
radial-gradient(1000px 700px at 110% -10%, rgba(`+x.r+","+x.g+","+x.b+`, .07), transparent 55%),
|
|
var(--bg);
|
|
}
|
|
`}function l(C,B){var $=B.lightBg||B.bg&&s(B.bg)>.4;return $?":root."+C+` button:hover {
|
|
background: color-mix(in srgb, var(--accent-strong) 12%, white 88%);
|
|
border-color: rgba(0, 0, 0, .15);
|
|
box-shadow: 0 1px 6px rgba(0, 0, 0, .08), inset 0 1px 0 rgba(255, 255, 255, .8);
|
|
}
|
|
`:":root."+C+` button:hover {
|
|
background: color-mix(in srgb, var(--accent) 18%, transparent);
|
|
border-color: color-mix(in srgb, var(--accent) 35%, var(--border));
|
|
}
|
|
`}function t(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function i(){m.forEach(function(C){document.documentElement.style.removeProperty("--"+C)})}function y(C,B){var $=C.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");$||($="custom"),h.indexOf($)!==-1&&($=$+"-custom");for(var k=safeGetJSON(a,{}),x=$,I=2;k[$]&&$!==B;)$=x+"-"+I++;return $}function u(C){var B=document.getElementById("user-theme-styles");B&&B.remove(),g.length=h.length,Object.keys(v).forEach(function(E){h.indexOf(E)===-1&&delete v[E]});var $=C||safeGetJSON(a,{}),k=Object.keys($);if(k=k.filter(function(E){return h.indexOf(E)===-1}),!!k.length){var x="";k.forEach(function(E){var S=$[E];g.indexOf(E)===-1&&g.push(E);var A={};m.forEach(function(O){S[O]&&(A[O]=S[O])}),A["card-bg"]=S["card-base"]||S.bg,S.lightBg&&(A.lightBg=!0);var D=e(A);r.forEach(function(O){!A[O]&&D[O]&&(A[O]=D[O])}),v[E]=A,x+=":root."+E+` {
|
|
`,m.forEach(function(O){A[O]&&(x+=" --"+O+": "+A[O]+`;
|
|
`)}),x+=`}
|
|
`,x+=n(E,A),x+=l(E,A)});var I=document.createElement("style");I.id="user-theme-styles",I.textContent=x,document.head.appendChild(I)}}function w(){secureFetch("/api/v1/themes").then(function(C){return C.json()}).then(function(C){if(!(!C.success||!C.themes)){var B=C.themes,$=safeGetJSON(a,{});if(JSON.stringify(B)!==JSON.stringify($)){safeSet(a,JSON.stringify(B)),u(B);var k=safeGet(c);k&&g.indexOf(k)!==-1&&L(k)}}}).catch(function(){})}function T(){var C=safeGetJSON(f);if(C){var B=C.name||"Custom",$=y(B),k={name:B};m.forEach(function(E){C[E]&&(k[E]=C[E])});var x=safeGetJSON(a,{});x[$]=k,safeSet(a,JSON.stringify(x)),safeGet(c)==="custom"&&safeSet(c,$),safeRemove(f);var I={};m.forEach(function(E){k[E]&&(I[E]=k[E])}),fetch("/api/v1/themes/"+$,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:B,colors:I})}).catch(function(){})}}function L(C){document.documentElement.classList.add("theme-transitioning"),g.forEach(function(x){x!=="dark"&&document.documentElement.classList.remove(x)}),i(),C!=="dark"&&document.documentElement.classList.add(C),safeSet(c,C);var B=v[C],$=document.querySelector('meta[name="theme-color"]');$&&B&&$.setAttribute("content",B.bg);var k=B&&B.lightBg;!k&&B&&B.bg&&(k=s(B.bg)>.4),k?document.documentElement.classList.add("light-bg"):document.documentElement.classList.remove("light-bg"),setTimeout(function(){document.documentElement.classList.remove("theme-transitioning")},300)}T(),u();var P=safeGet(c);P==="red"&&(P="black",safeSet(c,"black")),P&&P!=="dark"&&g.indexOf(P)===-1&&(P=null),L(P||t()),w(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",function(C){safeGet(c)||L(C.matches?"dark":"light")}),window.THEMES=g,window.BUILTIN_THEMES=h,window.THEME_COLORS=v,window.THEME_PROPS=m,window.BASE_PROPS=b,window.DERIVED_PROPS=r,window.USER_THEMES_KEY=a,window.applyTheme=L,window.clearCustomProperties=i,window.injectUserThemeStyles=u,window.syncThemesFromServer=w,window.slugifyThemeName=y,window.getActiveTheme=function(){return safeGet(c)||t()},window.deriveExtendedColors=e,window.hexToRgb=d,window.rgbToHex=o,window.blendColors=p})(),(function(){let c=null;async function a(){if(c)return c;try{const d=await fetch("/api/v1/auth/login/methods",{cache:"no-store"});if(!d.ok)throw new Error(`methods HTTP ${d.status}`);const o=await d.json();return c=Array.isArray(o.providers)?o.providers:[],c}catch(d){return console.warn("[auth-gate] methods fetch failed; falling back to TOTP-only",d),[]}}function f(d){const o=document.getElementById("totp-overlay");if(!o)return;const p=o.querySelector(".totp-card");if(!p)return;const s=p.innerHTML;p.dataset.originalBody||(p.dataset.originalBody=s);const e=d.map(n=>{const l=n.config&&(n.config.label||n.name)||n.name;return`<button class="provider-btn" data-provider="${n.name}"
|
|
style="margin: 6px 4px; padding: 10px 16px; background: var(--accent); color: white; border: 0; border-radius: 6px; cursor: pointer; font-size: 0.95rem;">
|
|
Sign in with ${l}
|
|
</button>`}).join(`
|
|
`);p.innerHTML=`
|
|
<img class="totp-logo totp-logo-dark" src="/assets/dashcaddy-logo-dark.png" alt="DashCaddy" onerror="this.style.display='none'">
|
|
<img class="totp-logo totp-logo-light" src="/assets/dashcaddy-logo-light.png" alt="DashCaddy" onerror="this.style.display='none'">
|
|
<p class="subtitle">Choose how to sign in</p>
|
|
<div id="auth-gate-providers" style="margin: 14px 0 10px;">${e}</div>
|
|
<div id="auth-gate-message" style="margin-top: 8px; color: var(--muted); font-size: 0.8rem;"></div>
|
|
`,o.classList.add("show"),p.querySelectorAll(".provider-btn").forEach(n=>{n.addEventListener("click",()=>{const l=n.dataset.provider,t=d.find(i=>i.name===l);g(t)})})}function h(){const d=document.getElementById("totp-overlay");if(!d)return;const o=d.querySelector(".totp-card");!o||!o.dataset.originalBody||(o.innerHTML=o.dataset.originalBody,window.location.reload())}function g(d){const o=document.getElementById("totp-overlay");if(!o)return;const p=o.querySelector(".totp-card");if(p){if(d.name==="totp"){window.location.reload();return}if(d.name==="email"){p.innerHTML=`
|
|
<img class="totp-logo totp-logo-dark" src="/assets/dashcaddy-logo-dark.png" alt="DashCaddy" onerror="this.style.display='none'">
|
|
<img class="totp-logo totp-logo-light" src="/assets/dashcaddy-logo-light.png" alt="DashCaddy" onerror="this.style.display='none'">
|
|
<p class="subtitle">Sign in with email</p>
|
|
<p style="margin: 6px 0 14px; font-size: 0.85rem; color: var(--muted);">
|
|
We'll email you a one-time sign-in link.
|
|
</p>
|
|
<input id="auth-gate-email-input" type="email" inputmode="email" autocomplete="email"
|
|
placeholder="you@example.com"
|
|
style="width: 100%; padding: 10px 12px; font-size: 1rem; background: var(--input-bg); color: var(--text); border: 1px solid var(--border); border-radius: 6px; box-sizing: border-box;">
|
|
<button id="auth-gate-email-submit" class="provider-btn"
|
|
style="margin-top: 14px; padding: 10px 16px; background: var(--accent); color: white; border: 0; border-radius: 6px; cursor: pointer; font-size: 0.95rem; width: 100%;">
|
|
Send sign-in link
|
|
</button>
|
|
<div id="auth-gate-email-status" style="margin-top: 12px; font-size: 0.85rem; line-height: 1.4;"></div>
|
|
<div style="margin-top: 16px;">
|
|
<a href="#" id="auth-gate-back" style="color: var(--muted); font-size: 0.8rem;">\u2190 Back</a>
|
|
</div>
|
|
`,o.classList.add("show");const s=p.querySelector("#auth-gate-email-input"),e=p.querySelector("#auth-gate-email-submit"),n=p.querySelector("#auth-gate-email-status"),l=p.querySelector("#auth-gate-back");e.addEventListener("click",async()=>{const t=(s.value||"").trim();if(!t||!t.includes("@")){n.textContent="Enter a valid email address.",n.style.color="var(--error, #d33)";return}e.disabled=!0,n.textContent="Sending\u2026",n.style.color="";try{const y=await(await fetch("/api/v1/auth/login/email/initiate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:t})})).json();if(y.success){const u=y.deliveredVia||"email",w=y.maskedEmail||t;u==="dev-console"?n.innerHTML=`
|
|
Check the server logs for your one-time link.
|
|
(Dev mode: no SMTP configured. In production this would email <strong>${w}</strong>.)`:n.innerHTML=`Sign-in link sent to <strong>${w}</strong>.
|
|
Check your inbox (and spam folder).`,n.style.color="var(--success, #2a7)"}else n.textContent=y.error||"Could not send link.",n.style.color="var(--error, #d33)",e.disabled=!1}catch{n.textContent="Connection error. Try again.",n.style.color="var(--error, #d33)",e.disabled=!1}}),s.addEventListener("keydown",t=>{t.key==="Enter"&&e.click()}),l.addEventListener("click",t=>{t.preventDefault(),f(providers)});return}console.warn("[auth-gate] unknown provider",d.name),window.location.reload()}}async function m(){if(!document.getElementById("totp-overlay"))return;const o=await a();if(o.length===0){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}if(o.length===1&&o[0].name==="totp"){b(o[0]);return}f(o)}function b(d){const o=c&&c.find(n=>n.name==="email");if(!o){typeof window._showTotpOverlay=="function"&&window._showTotpOverlay();return}const p=document.getElementById("totp-overlay"),s=p.querySelector(".totp-card");if(!s)return;if(s.dataset.originalBody||(s.dataset.originalBody=s.innerHTML),!s.querySelector("#auth-gate-email-alt")){const n=document.createElement("div");n.id="auth-gate-email-alt",n.style.cssText="margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 0.85rem;",n.innerHTML=`<a href="#" id="auth-gate-email-alt-link"
|
|
style="color: var(--accent); text-decoration: none;">
|
|
Or sign in with email instead \u2192
|
|
</a>`,s.appendChild(n),n.querySelector("#auth-gate-email-alt-link").addEventListener("click",l=>{l.preventDefault(),g(o)})}p.classList.add("show")}window.__dc_049_handled=!0;function r(d){try{const o=new URL(d,window.location.origin);if(!["http:","https:"].includes(o.protocol))return!1;if(o.origin===window.location.origin)return!0;if(o.protocol!=="https:")return!1;const p=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`;return o.hostname===p.slice(1)||o.hostname.endsWith(p)}catch{return!1}}const v=new URLSearchParams(window.location.search);if(v.get("auth")==="required"){const d=v.get("return");if(d&&r(d))try{sessionStorage.setItem("totp_redirect",d)}catch{}window.history.replaceState({},"",window.location.pathname),setTimeout(m,0)}window._showAuthGate=m,window._authGateMethods=a})(),(function(){function c(){const r=document.querySelector(".totp-card");if(!r)return;const d=getComputedStyle(r).backgroundColor.match(/\d+/g);if(!d)return;const o=(.299*+d[0]+.587*+d[1]+.114*+d[2])/255,p=r.querySelector(".totp-logo-dark"),s=r.querySelector(".totp-logo-light");p&&(p.style.display=o>.5?"none":""),s&&(s.style.display=o>.5?"":"none")}function a(){const r=document.getElementById("totp-overlay");if(r){r.classList.add("show"),setTimeout(c,50);const v=r.querySelector(".totp-digits input");v&&setTimeout(()=>v.focus(),100)}typeof window._refreshRecoveryLink=="function"&&window._refreshRecoveryLink()}function f(){const r=document.getElementById("totp-overlay");r&&r.classList.remove("show")}function h(r,v){const d=new URL(r,window.location.origin);if(d.origin===window.location.origin)return d.toString();const o=SITE.tld.startsWith(".")?SITE.tld:`.${SITE.tld}`,p=d.hostname===o.slice(1)||d.hostname.endsWith(o);if(d.protocol!=="https:"||!p)return null;if(!v)return d.toString();const s=`${d.pathname}${d.search}${d.hash}`;return d.pathname="/dashcaddy-sso",d.search="",d.hash="",d.searchParams.set("token",v),d.searchParams.set("return",s),d.toString()}const g=document.getElementById("totp-digits");if(g){const r=g.querySelectorAll("input");r.forEach((v,d)=>{v.addEventListener("input",o=>{const p=o.target.value.replace(/\D/g,"");o.target.value=p.slice(0,1),p&&d<r.length-1&&r[d+1].focus();const s=Array.from(r).map(e=>e.value).join("");s.length===6&&m(s)}),v.addEventListener("keydown",o=>{o.key==="Backspace"&&!o.target.value&&d>0&&(r[d-1].focus(),r[d-1].value="")}),v.addEventListener("paste",o=>{o.preventDefault();const p=(o.clipboardData.getData("text")||"").replace(/\D/g,"");p.length>=6&&(r.forEach((s,e)=>{s.value=p[e]||""}),r[5].focus(),m(p.slice(0,6)))})})}async function m(r){const v=document.getElementById("totp-error");v.textContent="Verifying...",v.className="totp-error verifying";try{const o=await(await secureFetch("/api/v1/totp/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:r})})).json();if(o.success){v.textContent="",o.csrfToken&&(csrfToken=o.csrfToken),f();const p=safeSessionGet("totp_redirect");if(p){try{sessionStorage.removeItem("totp_redirect")}catch{}const s=h(p,o.ssoToken);if(!s)return;window.location.href=s;return}typeof window.initializeDashboard=="function"&&window.initializeDashboard()}else{v.textContent=o.error||"Invalid code",v.className="totp-error";const p=document.querySelectorAll("#totp-digits input");p.forEach(s=>{s.value=""}),p[0]?.focus()}}catch{v.textContent="Connection error",v.className="totp-error"}}if(!!!window.__dc_049_handled&&urlParams.get("auth")==="required"){const r=urlParams.get("return");if(r)try{const v=new URL(r,window.location.origin),d=v.hostname,o=v.origin===window.location.origin,p=SITE.tld.startsWith(".")?SITE.tld:"."+SITE.tld,s=d.endsWith(p)||d===p.substring(1);(o||s)&&safeSessionSet("totp_redirect",r)}catch{}window.history.replaceState({},"",window.location.pathname)}window._showTotpOverlay=a})(),(function(){"use strict";async function c(){try{return await(await fetch("/api/v1/totp/recovery-info",{cache:"no-store"})).json()}catch{return{success:!1,status:"unknown",hint:"Could not contact server"}}}function a(b){const r=document.getElementById("totp-recovery-link");r&&(r.style.display=b?"":"none")}function f(){const b=document.getElementById("totp-recovery-panel");b&&(b.style.display="");const r=document.getElementById("totp-recovery-status"),v=document.getElementById("totp-recovery-import"),d=document.getElementById("totp-recovery-verify");v&&(v.style.display=""),d&&(d.style.display="none"),document.getElementById("totp-recovery-error").textContent="",document.getElementById("totp-recovery-confirm-error").textContent="",document.getElementById("totp-recovery-secret").value="",document.getElementById("totp-recovery-code").value="",c().then(o=>{r.textContent=o.hint||"",o.status==="healthy"?r.style.borderColor="var(--ok-fg, #7ef2ff)":o.status==="unreadable"?(r.style.borderColor="var(--bad-fg, #ff9aa3)",r.style.background="color-mix(in srgb, var(--bad-fg) 6%, transparent)"):o.status==="not_configured"?r.style.borderColor="var(--muted)":r.style.borderColor="var(--border)"}),setTimeout(()=>{document.getElementById("totp-recovery-secret")?.focus()},100)}function h(){const b=document.getElementById("totp-recovery-panel");b&&(b.style.display="none")}async function g(){const b=document.getElementById("totp-recovery-secret").value.trim(),r=document.getElementById("totp-recovery-error");if(r.textContent="",!b){r.textContent="Paste your Base32 key first";return}if(!/^[A-Za-z2-7\s]+=*$/.test(b)){r.textContent="Invalid Base32 format \u2014 should be letters A-Z and digits 2-7 only";return}try{const v=await fetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:b})}),d=await v.json();if(!v.ok||!d.success){r.textContent=d.error||d.message||"Restore failed";return}document.getElementById("totp-recovery-import").style.display="none",document.getElementById("totp-recovery-verify").style.display="",setTimeout(()=>document.getElementById("totp-recovery-code")?.focus(),100)}catch{r.textContent="Network error \u2014 try again"}}async function m(){const b=document.getElementById("totp-recovery-code").value.trim(),r=document.getElementById("totp-recovery-confirm-error");if(r.textContent="",!/^\d{6}$/.test(b)){r.textContent="Enter a 6-digit code";return}try{const v=await fetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:b})}),d=await v.json();if(!v.ok||!d.success){r.textContent=d.error||d.message||"Invalid code",document.getElementById("totp-recovery-code").value="",document.getElementById("totp-recovery-code")?.focus();return}h();const o=document.getElementById("totp-overlay");o&&o.classList.remove("show"),typeof window.initializeDashboard=="function"&&window.initializeDashboard()}catch{r.textContent="Network error \u2014 try again"}}document.getElementById("totp-show-recovery")?.addEventListener("click",b=>{b.preventDefault(),f()}),document.getElementById("totp-recovery-close")?.addEventListener("click",h),document.getElementById("totp-recovery-submit")?.addEventListener("click",g),document.getElementById("totp-recovery-confirm")?.addEventListener("click",m),document.getElementById("totp-recovery-secret")?.addEventListener("keydown",b=>{b.key==="Enter"&&(b.preventDefault(),g())}),document.getElementById("totp-recovery-code")?.addEventListener("keydown",b=>{b.key==="Enter"&&(b.preventDefault(),m())}),window._refreshRecoveryLink=async function(){const b=await c();return b&&b.success&&b.status&&b.status!=="healthy"?a(!0):a(!1),b}})(),(function(){const c=new ErrorHandler;injectModal("folder-browser-modal",`<div id="folder-browser-modal" class="weather-modal">
|
|
<div class="weather-modal-content" style="min-width: 500px; max-width: 700px; max-height: 80vh;">
|
|
<h3>\u{1F4C2} Browse for Media Folders</h3>
|
|
|
|
<div id="folder-browser-path" style="padding: 10px; background: var(--card-bg); border-radius: 6px; margin-bottom: 12px; font-family: monospace; font-size: 0.9rem; word-break: break-all;">
|
|
/
|
|
</div>
|
|
|
|
<div id="folder-browser-list" style="max-height: 400px; overflow-y: auto; border: 1px solid var(--border); border-radius: 6px;">
|
|
<div style="padding: 20px; text-align: center; color: var(--muted);">Loading...</div>
|
|
</div>
|
|
|
|
<div id="folder-browser-selected" style="margin-top: 12px; padding: 10px; background: color-mix(in srgb, var(--success) 10%, transparent); border: 1px solid var(--success); border-radius: 6px; display: none;">
|
|
<div style="font-size: 0.85rem; color: var(--success); margin-bottom: 6px;">Selected folders:</div>
|
|
<div id="folder-browser-selected-list" style="display: flex; flex-wrap: wrap; gap: 6px;"></div>
|
|
</div>
|
|
|
|
<div class="weather-modal-buttons" style="margin-top: 16px; display: flex; gap: 8px; justify-content: space-between;">
|
|
<button id="folder-browser-select-current" class="btn-accent">
|
|
+ Add Current Folder
|
|
</button>
|
|
<div class="flex-row-gap">
|
|
<button id="folder-browser-cancel">Cancel</button>
|
|
<button id="folder-browser-done" style="background: color-mix(in srgb, var(--success) 20%, transparent); border-color: var(--success); color: var(--success);">Done</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>`),injectModal("service-creds-modal",`<div id="service-creds-modal">
|
|
<div class="service-creds-content">
|
|
<h3 id="svc-creds-title" style="margin: 0 0 4px; font-size: 1.05rem;">Service Credentials</h3>
|
|
<p id="svc-creds-desc" style="font-size: 0.75rem; color: var(--muted); margin: 0 0 14px;">Credentials are injected automatically when accessing this service.</p>
|
|
|
|
<!-- Status indicator -->
|
|
<div style="display: flex; align-items: center; gap: 6px; margin-bottom: 12px;">
|
|
<span id="svc-creds-dot" class="status-dot"></span>
|
|
<span id="svc-creds-status" class="text-muted-sm">No credentials stored</span>
|
|
</div>
|
|
|
|
<!-- Seedhost credentials (shown for external services) -->
|
|
<div id="svc-creds-seedhost" style="display: none; margin-bottom: 14px;">
|
|
<label class="label-bold">Seedhost Login</label>
|
|
<p class="hint-micro">Username shared across all services. Password is per-service.</p>
|
|
<input type="text" id="svc-seedhost-user" placeholder="Username (shared)" autocomplete="username"
|
|
style="width: 100%; padding: 8px 10px; margin-bottom: 6px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;" />
|
|
<input type="password" id="svc-seedhost-pass" placeholder="Password" autocomplete="current-password"
|
|
class="input-creds" />
|
|
</div>
|
|
|
|
<!-- API Key (shown for arr services or services with API key support) -->
|
|
<div id="svc-creds-apikey" style="display: none; margin-bottom: 14px;">
|
|
<label class="label-bold">API Key</label>
|
|
<p class="hint-micro">Bypasses the app's own login screen</p>
|
|
<input type="text" id="svc-apikey-input" placeholder="API key"
|
|
style="width: 100%; padding: 8px 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; font-family: monospace; box-sizing: border-box;" />
|
|
</div>
|
|
|
|
<!-- Quality Profile (shown for radarr/sonarr only) -->
|
|
<div id="svc-creds-quality" style="display: none; margin-bottom: 14px;">
|
|
<label class="label-bold">Quality Profile</label>
|
|
<p class="hint-micro">Used when requesting via Seerr</p>
|
|
<div style="display: flex; gap: 8px; align-items: center;">
|
|
<select id="svc-quality-select"
|
|
style="flex: 1; padding: 8px 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;">
|
|
<option value="">-- Enter API key first --</option>
|
|
</select>
|
|
<button id="svc-quality-fetch" type="button"
|
|
style="padding: 8px 12px; font-size: 0.75rem; cursor: pointer; white-space: nowrap;">
|
|
Fetch
|
|
</button>
|
|
</div>
|
|
<div id="svc-quality-status" style="font-size: 0.75rem; margin-top: 4px; min-height: 1em;"></div>
|
|
</div>
|
|
|
|
<!-- Per-service Basic Auth (shown for non-external services) -->
|
|
<div id="svc-creds-basic" style="display: none; margin-bottom: 14px;">
|
|
<label class="label-bold">Service Login</label>
|
|
<input type="text" id="svc-basic-user" placeholder="Username" autocomplete="username"
|
|
style="width: 100%; padding: 8px 10px; margin-top: 6px; margin-bottom: 6px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; box-sizing: border-box;" />
|
|
<input type="password" id="svc-basic-pass" placeholder="Password" autocomplete="current-password"
|
|
class="input-creds" />
|
|
</div>
|
|
|
|
<!-- Error message -->
|
|
<div id="svc-creds-error" style="display: none; padding: 8px 10px; margin-bottom: 10px; background: color-mix(in srgb, var(--error, #c62828) 12%, transparent); border: 1px solid var(--error, #c62828); border-radius: 6px; font-size: 0.8rem; color: var(--error, #c62828);"></div>
|
|
|
|
<!-- Buttons -->
|
|
<div style="display: flex; gap: 8px; margin-top: 14px;">
|
|
<button id="svc-creds-save" class="btn-accent-solid" style="flex: 1; padding: 9px; border: none; border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem;">
|
|
Save
|
|
</button>
|
|
<button id="svc-creds-clear" style="padding: 9px 14px; background: transparent; color: var(--bad-fg, #ff9aa3); border: 1px solid var(--bad-fg, #ff9aa3); border-radius: 6px; cursor: pointer; font-size: 0.85rem; display: none;">
|
|
Clear
|
|
</button>
|
|
<button id="svc-creds-close" style="padding: 9px 16px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-size: 0.85rem;">
|
|
Cancel
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>`);const a=document.getElementById("service-creds-modal");let f=null;const h=["sonarr","radarr","prowlarr","overseerr"],g=["sonarr","radarr"];function m(o){return o.externalUrl||o.url||""}function b(o){const p=document.getElementById("svc-creds-error");p.textContent=o,p.style.display=""}function r(){const o=document.getElementById("svc-creds-error");o.textContent="",o.style.display="none"}window.openServiceCredsModal=async function(o){f=o,r();const p=document.getElementById("svc-creds-title"),s=document.getElementById("svc-creds-desc"),e=document.getElementById("svc-creds-seedhost"),n=document.getElementById("svc-creds-apikey"),l=document.getElementById("svc-creds-basic"),t=document.getElementById("svc-creds-quality");p.textContent=o.name+" Credentials";const i=!!o.isExternal,y=h.includes(o.id)||h.includes(o.appTemplate),u=g.includes(o.id)||g.includes(o.appTemplate);e.style.display=i?"":"none",n.style.display=y?"":"none",t.style.display=u?"":"none",l.style.display=i?"none":"";const w=document.getElementById("svc-quality-select");w.innerHTML='<option value="">-- Enter API key first --</option>',document.getElementById("svc-quality-status").textContent="",i?(s.textContent="Seedhost credentials auto-login past the HTTP prompt. API key bypasses the app login.",document.getElementById("svc-seedhost-pass").placeholder=`Password for ${o.name}`):y?s.textContent="API key bypasses the app login screen automatically.":s.textContent="Credentials are injected automatically when accessing this service.",await v(o),a.classList.add("show")};async function v(o){const p=document.getElementById("svc-creds-dot"),s=document.getElementById("svc-creds-status"),e=document.getElementById("svc-creds-clear");let n=!1;if(o.isExternal){try{const i=await(await fetch(`/api/v1/seedhost-creds?serviceId=${o.id}`)).json();i.success?(document.getElementById("svc-seedhost-user").value=i.username||"",i.hasCredentials&&(n=!0)):document.getElementById("svc-seedhost-user").value=""}catch{}document.getElementById("svc-seedhost-pass").value=""}try{const i=await(await fetch(`/api/v1/services/${o.id}/credentials`)).json();i.success&&(i.hasApiKey?(document.getElementById("svc-apikey-input").value="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",n=!0):document.getElementById("svc-apikey-input").value="",i.hasBasicAuth&&!o.isExternal?(document.getElementById("svc-basic-user").value=i.username||"",n=!0):document.getElementById("svc-basic-user").value="")}catch{}document.getElementById("svc-basic-pass")&&(document.getElementById("svc-basic-pass").value="");const l=o.id||o.appTemplate;if(g.includes(l)&&await d(o),n){p.style.background="var(--ok-fg, #74dfc4)",s.style.color="var(--ok-fg, #74dfc4)",s.textContent="Credentials stored",e.style.display="";const t=document.getElementById(`creds-btn-${o.id}`);t&&t.classList.add("has-creds")}else p.style.background="var(--muted)",s.style.color="var(--muted)",s.textContent="No credentials stored",e.style.display="none"}async function d(o){const p=document.getElementById("svc-quality-select"),s=document.getElementById("svc-quality-status"),e=o.id||o.appTemplate,n=m(o);if(!n){p.innerHTML='<option value="">-- No service URL --</option>';return}p.innerHTML='<option value="">Loading...</option>',s.textContent="";try{const l=new URLSearchParams({service:e,url:n}),i=await(await fetch(`/api/v1/arr/quality-profiles?${l}`)).json();if(!i.success||!i.profiles?.length){p.innerHTML='<option value="">-- No profiles found (enter API key and click Fetch) --</option>';return}p.innerHTML="";for(const y of i.profiles){const u=document.createElement("option");u.value=y.id,u.textContent=y.name,p.appendChild(u)}if(i.storedProfileId&&(p.value=String(i.storedProfileId)),!p.value){const y=i.profiles.find(u=>/720/i.test(u.name));y&&(p.value=String(y.id))}!p.value&&i.profiles.length&&(p.value=String(i.profiles[0].id)),s.innerHTML=`<span style="color: var(--ok-fg);">${i.profiles.length} profiles loaded</span>`}catch(l){p.innerHTML='<option value="">-- Failed to load --</option>',s.innerHTML=`<span style="color: var(--error, #c62828);">Error: ${l.message}</span>`}}document.getElementById("svc-quality-fetch")?.addEventListener("click",async()=>{if(!f)return;const o=f.id||f.appTemplate,p=m(f),e=document.getElementById("svc-apikey-input")?.value.trim(),n=document.getElementById("svc-quality-select"),l=document.getElementById("svc-quality-status");if(!p){l.innerHTML='<span style="color: var(--error, #c62828);">No service URL available</span>';return}if(!e||e==="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"){l.innerHTML='<span style="color: var(--error, #c62828);">Enter an API key first</span>';return}n.innerHTML='<option value="">Fetching...</option>',l.textContent="";try{const t=new URLSearchParams({service:o,url:p,apiKey:e}),y=await(await fetch(`/api/v1/arr/quality-profiles?${t}`)).json();if(!y.success){n.innerHTML='<option value="">-- Error --</option>',l.innerHTML=`<span style="color: var(--error, #c62828);">${y.error||"Failed to fetch profiles"}</span>`;return}if(!y.profiles?.length){n.innerHTML='<option value="">-- No profiles found --</option>';return}n.innerHTML="";for(const w of y.profiles){const T=document.createElement("option");T.value=w.id,T.textContent=w.name,n.appendChild(T)}const u=y.profiles.find(w=>/720/i.test(w.name));u?n.value=String(u.id):y.profiles.length&&(n.value=String(y.profiles[0].id)),l.innerHTML=`<span style="color: var(--ok-fg);">${y.profiles.length} profiles loaded</span>`}catch(t){n.innerHTML='<option value="">-- Error --</option>',l.innerHTML=`<span style="color: var(--error, #c62828);">${t.message}</span>`}}),document.getElementById("svc-creds-save")?.addEventListener("click",async()=>{if(!f)return;const o=document.getElementById("svc-creds-save");o.textContent="Saving...",o.disabled=!0,r();try{const p=h.includes(f.id)||h.includes(f.appTemplate),s=f.id||f.appTemplate;if(f.isExternal){const l=document.getElementById("svc-seedhost-user").value.trim(),t=document.getElementById("svc-seedhost-pass").value;l&&await secureFetch("/api/v1/seedhost-creds",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:l,password:t||void 0,serviceId:f.id})})}const n=document.getElementById("svc-apikey-input")?.value.trim();if(n&&n!=="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")if(p){const l=m(f),t=document.getElementById("svc-quality-select"),i=t?.value?parseInt(t.value):void 0,y=t?.selectedOptions?.[0]?.textContent||void 0,w=await(await secureFetch("/api/v1/arr/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:s,apiKey:n,url:l||void 0,qualityProfileId:i||void 0,qualityProfileName:y||void 0})})).json();if(!w.success){b(w.error||"Failed to save API key"),o.textContent="Save",o.disabled=!1;return}w.connectionTest&&!w.connectionTest.success&&b(`API key saved but connection test failed: ${w.connectionTest.error}`)}else await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:n})});else if(p&&g.includes(s)){const l=document.getElementById("svc-quality-select"),t=l?.value?parseInt(l.value):void 0,i=l?.selectedOptions?.[0]?.textContent||void 0;t&&await secureFetch("/api/v1/arr/quality-profiles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:s,qualityProfileId:t,qualityProfileName:i})})}if(!f.isExternal){const l=document.getElementById("svc-basic-user").value.trim(),t=document.getElementById("svc-basic-pass").value;l&&t&&await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:l,password:t})})}await v(f)}catch(p){c.logError("[ServiceCredentials] Save",p,{function:"saveCredentials"}),b("Failed to save: "+(p.message||"Unknown error"))}o.textContent="Save",o.disabled=!1}),document.getElementById("svc-creds-clear")?.addEventListener("click",async()=>{if(f&&confirm(`Remove stored credentials for ${f.name}?`)){r();try{const o=f.id||f.appTemplate,p=h.includes(o);f.isExternal&&await secureFetch(`/api/v1/seedhost-creds?serviceId=${f.id}`,{method:"DELETE"}),await secureFetch(`/api/v1/services/${f.id}/credentials`,{method:"DELETE"}),p&&await secureFetch(`/api/v1/arr/credentials/${o}`,{method:"DELETE"});const s=document.getElementById(`creds-btn-${f.id}`);s&&s.classList.remove("has-creds"),await v(f)}catch(o){c.logError("[ServiceCredentials] Clear",o,{function:"clearCredentials"}),b("Failed to clear: "+(o.message||"Unknown error"))}}}),document.getElementById("svc-creds-close")?.addEventListener("click",()=>{a.classList.remove("show"),f=null}),a?.addEventListener("click",o=>{o.target===a&&(a.classList.remove("show"),f=null)}),window.refreshCredsButtons=async function(){try{for(const o of window.APPS||[]){if(!o.isExternal&&!o.appTemplate&&!o.url)continue;let p=!1;if(o.isExternal)try{const n=await(await fetch(`/api/v1/seedhost-creds?serviceId=${o.id}`)).json();n.success&&n.hasCredentials&&(p=!0)}catch{}try{const n=await(await fetch(`/api/v1/services/${o.id}/credentials`)).json();n.success&&(n.hasApiKey||n.hasBasicAuth)&&(p=!0)}catch{}const s=document.getElementById(`creds-btn-${o.id}`);s&&s.classList.toggle("has-creds",p)}}catch{}}})(),(function(){const c=new ErrorHandler;injectModal("totp-settings-modal",`<div id="totp-settings-modal" class="weather-modal">
|
|
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
|
|
<h3 style="margin: 0 0 16px; font-size: 1.1rem;">Authentication Settings</h3>
|
|
|
|
<!-- Status Banner -->
|
|
<div id="totp-status-banner" style="margin-bottom: 16px; padding: 12px 16px; border-radius: 8px; border: 1px solid var(--border); display: flex; align-items: center; gap: 8px;">
|
|
<span id="totp-status-dot" class="status-dot"></span>
|
|
<span id="totp-status-text" style="font-size: 0.9rem;">TOTP is not configured</span>
|
|
</div>
|
|
|
|
<!-- Setup Button (not configured state) -->
|
|
<div id="totp-setup-section">
|
|
<button id="totp-setup-btn" class="btn-accent-solid" style="width: 100%; padding: 12px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600; font-size: 0.95rem;">
|
|
Generate New Secret
|
|
</button>
|
|
<div style="display: flex; align-items: center; gap: 8px; margin: 10px 0 0;">
|
|
<div class="divider-line"></div>
|
|
<span class="text-tiny-muted">or</span>
|
|
<div class="divider-line"></div>
|
|
</div>
|
|
<div style="margin-top: 10px;">
|
|
<label class="text-hint">Import an existing secret key:</label>
|
|
<div style="display: flex; gap: 8px; margin-top: 6px;">
|
|
<input type="text" id="totp-import-key" placeholder="Paste your Base32 key" autocomplete="off" spellcheck="false"
|
|
style="flex: 1; padding: 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.9rem; font-family: monospace; letter-spacing: 1px; text-transform: uppercase;" />
|
|
<button id="totp-import-btn" style="padding: 10px 16px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem; white-space: nowrap;">
|
|
Import
|
|
</button>
|
|
</div>
|
|
<div id="totp-import-error" style="color: var(--bad-fg, #ff9aa3); font-size: 0.8rem; min-height: 1.2em; margin-top: 6px;"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Secret Display (setup flow) -->
|
|
<div id="totp-qr-section" style="display: none;">
|
|
<!-- Manual Key (primary - for WinAuth/desktop authenticators) -->
|
|
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 8px;">Copy this key into your authenticator app:</p>
|
|
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
|
|
<code id="totp-manual-key" style="flex: 1; display: block; padding: 12px; background: var(--bg, #0b0f1a); border: 1px solid var(--border); border-radius: 6px; font-size: 1rem; font-family: 'Sami Grotesk', monospace; letter-spacing: 2px; word-break: break-all; user-select: all; color: var(--fg);"></code>
|
|
<button id="totp-copy-key" style="padding: 10px 14px; background: var(--card-base); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-size: 1rem; white-space: nowrap; color: var(--fg);" title="Copy to clipboard">\u{1F4CB}</button>
|
|
</div>
|
|
|
|
<!-- Download backup file (recovery aid) -->
|
|
<div style="margin-bottom: 16px; padding: 10px 12px; background: var(--bg, #0b0f1a); border: 1px solid var(--border); border-radius: 6px;">
|
|
<div style="display: flex; align-items: center; gap: 8px;">
|
|
<span style="font-size: 0.8rem; color: var(--muted); flex: 1;">
|
|
<strong style="color: var(--fg);">Save a backup file</strong> \u2014 if you ever lose your authenticator,
|
|
this is the only way to recover without SSH access to the server.
|
|
</span>
|
|
<button id="totp-download-backup" type="button"
|
|
style="padding: 8px 14px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 0.85rem; white-space: nowrap;">
|
|
\u2B07 Download
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- QR Code (secondary - for mobile apps) -->
|
|
<details class="mb-16">
|
|
<summary style="cursor: pointer; color: var(--muted); font-size: 0.8rem;">Show QR code (for mobile authenticator apps)</summary>
|
|
<div style="text-align: center; margin-top: 8px;">
|
|
<img id="totp-qr-image" style="width: 180px; height: 180px; border-radius: 8px;" />
|
|
</div>
|
|
</details>
|
|
|
|
<!-- Verify First Code -->
|
|
<div style="border-top: 1px solid var(--border); padding-top: 16px;">
|
|
<label class="font-bold-sm">Enter code to confirm setup:</label>
|
|
<div style="display: flex; gap: 8px; margin-top: 8px;">
|
|
<input type="text" id="totp-setup-code" maxlength="6" inputmode="numeric" pattern="[0-9]{6}" placeholder="000000"
|
|
style="flex: 1; text-align: center; font-size: 1.3rem; padding: 10px; font-family: 'Sami Grotesk', monospace; letter-spacing: 4px; background: var(--bg); color: var(--fg); border: 2px solid var(--border); border-radius: 8px; outline: none;" />
|
|
<button id="totp-confirm-setup" class="btn-accent-solid" style="padding: 10px 20px; border: none; border-radius: 8px; cursor: pointer; font-weight: 600;">
|
|
Confirm
|
|
</button>
|
|
</div>
|
|
<div id="totp-setup-error" style="color: var(--bad-fg, #ff9aa3); font-size: 0.8rem; min-height: 1.2em; margin-top: 6px;"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Session Duration (active state) -->
|
|
<div id="totp-duration-section" style="display: none; margin-top: 12px;">
|
|
<label class="font-bold-sm">Session Duration:</label>
|
|
<select id="totp-duration-select" style="width: 100%; padding: 10px; margin-top: 6px; background: var(--bg, #0b0f1a); color: var(--fg); border: 1px solid var(--border); border-radius: 8px; font-size: 0.9rem; cursor: pointer;">
|
|
<option value="15m">15 minutes</option>
|
|
<option value="30m">30 minutes</option>
|
|
<option value="1h">1 hour</option>
|
|
<option value="2h">2 hours</option>
|
|
<option value="4h">4 hours</option>
|
|
<option value="8h">8 hours</option>
|
|
<option value="12h">12 hours</option>
|
|
<option value="24h">24 hours</option>
|
|
<option value="never">Never (disable TOTP)</option>
|
|
</select>
|
|
<p style="font-size: 0.75rem; color: var(--muted); margin: 4px 0 0;">How long before you need to re-enter your code</p>
|
|
</div>
|
|
|
|
<!-- Disable Button (active state) -->
|
|
<div id="totp-disable-section" style="display: none; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border);">
|
|
<button id="totp-disable-btn" style="width: 100%; padding: 10px; background: transparent; color: var(--bad-fg, #ff9aa3); border: 1px solid var(--bad-fg, #ff9aa3); border-radius: 8px; cursor: pointer; font-size: 0.9rem;">
|
|
Disable TOTP
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Close -->
|
|
<div style="margin-top: 16px; text-align: right;">
|
|
<button id="totp-modal-close" style="padding: 8px 20px; background: var(--card-base); color: var(--fg); border: 1px solid var(--border); border-radius: 8px; cursor: pointer;">
|
|
Close
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>`);async function a(){try{const m=await(await fetch("/api/v1/totp/config")).json();if(!m.success)return;const{enabled:b,sessionDuration:r,isSetUp:v}=m.config,d=document.getElementById("totp-status-dot"),o=document.getElementById("totp-status-text"),p=document.getElementById("totp-status-banner"),s=document.getElementById("totp-setup-section"),e=document.getElementById("totp-qr-section"),n=document.getElementById("totp-duration-section"),l=document.getElementById("totp-disable-section");if(b&&v){d.style.background="var(--ok-fg, #7ef2ff)",p.style.borderColor="var(--ok-fg, #7ef2ff)",p.style.background="color-mix(in srgb, var(--ok-fg) 8%, transparent)",o.textContent="TOTP is active",o.style.color="var(--ok-fg, #7ef2ff)",s.style.display="block";const t=document.getElementById("totp-setup-btn");t&&(t.textContent="Generate New Secret"),e.style.display="none",n.style.display="block",l.style.display="block",document.getElementById("totp-duration-select").value=r}else d.style.background="var(--muted)",p.style.borderColor="var(--border)",p.style.background="transparent",o.textContent="TOTP is not configured",o.style.color="var(--muted)",s.style.display="block",e.style.display="none",n.style.display="none",l.style.display="none";h(b&&v,r)}catch(g){console.warn("Failed to load TOTP settings:",g)}}const f={"15m":"15 min","30m":"30 min","1h":"1 hour","2h":"2 hours","4h":"4 hours","8h":"8 hours","12h":"12 hours","24h":"24 hours",never:"Disabled"};function h(g,m){const b=document.getElementById("auth-card"),r=document.getElementById("auth-pill"),v=document.getElementById("auth-dot"),d=document.getElementById("auth-status-text");b&&(g?(b.setAttribute("data-status","on"),r.className="badge on",r.textContent="YES",v.className="dot ok at-bl",d.textContent="Session: "+(f[m]||m)):(b.setAttribute("data-status","off"),r.className="badge off",r.textContent="NO",v.className="dot bad at-bl",d.textContent="Not configured"))}document.getElementById("totp-setup-btn")?.addEventListener("click",async()=>{try{const m=await(await secureFetch("/api/v1/totp/setup",{method:"POST"})).json();m.success&&(document.getElementById("totp-qr-image").src=m.qrCode,document.getElementById("totp-manual-key").textContent=m.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus())}catch(g){c.logError("[TOTP] Setup Failed",g,{function:"setupTOTP"})}}),document.getElementById("totp-import-btn")?.addEventListener("click",async()=>{const g=document.getElementById("totp-import-key").value.trim(),m=document.getElementById("totp-import-error");if(m.textContent="",!g){m.textContent="Paste a Base32 secret key first";return}try{const r=await(await secureFetch("/api/v1/totp/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:g})})).json();r.success?(m.textContent="",document.getElementById("totp-qr-image").src=r.qrCode,document.getElementById("totp-manual-key").textContent=r.manualKey,document.getElementById("totp-setup-section").style.display="none",document.getElementById("totp-qr-section").style.display="block",document.getElementById("totp-setup-code").value="",document.getElementById("totp-setup-error").textContent="",document.getElementById("totp-setup-code").focus()):m.textContent=r.error||r.message||"Import failed"}catch{m.textContent="Connection error \u2014 try refreshing the page"}}),document.getElementById("totp-copy-key")?.addEventListener("click",()=>{const g=document.getElementById("totp-manual-key").textContent;navigator.clipboard.writeText(g).then(()=>{const m=document.getElementById("totp-copy-key");m.textContent="\u2705",setTimeout(()=>{m.textContent="\u{1F4CB}"},2e3)})}),document.getElementById("totp-download-backup")?.addEventListener("click",()=>{const g=document.getElementById("totp-manual-key").textContent.trim();if(!g)return;const m={service:"DashCaddy",type:"totp-secret",secret:g,issuer:"DashCaddy",algorithm:"SHA1",digits:6,period:30,issued:new Date().toISOString(),recovery_url:`${window.location.origin}/ (login screen \u2192 "Lost access?")`,note:'Keep this file somewhere safe. Anyone with this secret can generate your login codes. Use it ONLY to recover TOTP access via the "Lost access?" link on the DashCaddy login screen.'},b=new Blob([JSON.stringify(m,null,2)],{type:"application/json"}),r=URL.createObjectURL(b),v=document.createElement("a");v.href=r,v.download=`dashcaddy-totp-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(v),v.click(),document.body.removeChild(v),URL.revokeObjectURL(r);const d=document.getElementById("totp-download-backup");d.textContent="\u2705 Saved",setTimeout(()=>{d.textContent="\u2B07 Download"},2e3)}),document.getElementById("totp-confirm-setup")?.addEventListener("click",async()=>{const g=document.getElementById("totp-setup-code").value,m=document.getElementById("totp-setup-error");if(!/^\d{6}$/.test(g)){m.textContent="Enter a 6-digit code";return}try{const r=await(await secureFetch("/api/v1/totp/verify-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:g})})).json();r.success?(m.textContent="",a()):m.textContent=r.error||"Invalid code"}catch{m.textContent="Connection error"}}),document.getElementById("totp-setup-code")?.addEventListener("keydown",g=>{g.key==="Enter"&&document.getElementById("totp-confirm-setup")?.click()}),document.getElementById("totp-duration-select")?.addEventListener("change",async g=>{try{await secureFetch("/api/v1/totp/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionDuration:g.target.value})}),a()}catch(m){c.logError("[TOTP] Update Session Duration",m,{function:"updateSessionDuration"})}}),document.getElementById("totp-disable-btn")?.addEventListener("click",async()=>{if(confirm("Disable TOTP authentication? All services will be accessible without a code."))try{(await(await secureFetch("/api/v1/totp/disable",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"})).json()).success&&a()}catch(g){c.logError("[TOTP] Disable Failed",g,{function:"disableTOTP"})}}),document.getElementById("auth-settings-btn")?.addEventListener("click",()=>{a(),openModal("totp-settings-modal")}),document.getElementById("totp-modal-close")?.addEventListener("click",()=>{closeModal("totp-settings-modal")}),document.getElementById("totp-settings-modal")?.addEventListener("click",g=>{g.target.id==="totp-settings-modal"&&closeModal("totp-settings-modal")}),window._updateAuthCard=h,(async()=>{try{const m=await(await fetch("/api/v1/totp/config")).json();if(m.success){const b=m.config.enabled&&m.config.isSetUp;h(b,m.config.sessionDuration)}}catch(g){c.logError("[TOTP] AuthCard Update",g,{function:"authCardUpdate"})}})()})(),(function(){"use strict";const c={me:"/api/v1/auth/me",users:"/api/v1/auth/admin/users",allowlist:"/api/v1/auth/admin/allowlist",invites:"/api/v1/auth/admin/invites"};function a(s,e,...n){const l=document.createElement(s);if(e)for(const t of Object.keys(e)){const i=e[t];i==null||i===!1||(t==="class"?l.className=i:t==="text"?l.textContent=i:t==="html"?l.innerHTML=i:t.startsWith("on")&&typeof i=="function"?l.addEventListener(t.slice(2).toLowerCase(),i):l.setAttribute(t,i))}for(const t of n)t==null||t===!1||(typeof t=="string"?l.appendChild(document.createTextNode(t)):l.appendChild(t));return l}async function f(s,e){const n=window.SITE&&window.SITE.csrfToken||"";e=e||{},e.headers=Object.assign({"Content-Type":"application/json"},e.headers||{},n?{"X-CSRF-Token":n}:{}),e.body&&typeof e.body!="string"&&(e.body=JSON.stringify(e.body));const l=await fetch(s,e),t=await l.json().catch(()=>({}));if(!l.ok){const i=t&&(t.message||t.error)||"HTTP "+l.status,y=new Error(i);throw y.status=l.status,y}return t}function h(s){const e={admin:"background:#7c3aed;color:#fff",operator:"background:#2563eb;color:#fff",viewer:"background:#6b7280;color:#fff"};return a("span",{class:"role-badge",style:"display:inline-block;padding:2px 8px;border-radius:4px;font-size:0.75rem;font-weight:600;text-transform:uppercase;"+(e[s]||e.viewer),text:s})}function g(s,e,n){if(s.innerHTML="",!e||e.length===0){s.appendChild(a("p",{style:"color:var(--muted)",text:"No users yet."}));return}const l=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});l.appendChild(a("thead",null,a("tr",{style:"border-bottom:1px solid var(--border)"},a("th",{style:"text-align:left;padding:8px",text:"Email"}),a("th",{style:"text-align:left;padding:8px",text:"Role"}),a("th",{style:"text-align:left;padding:8px",text:"Created"}),a("th",{style:"text-align:left;padding:8px",text:"Last login"}),a("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const t=a("tbody");for(const i of e){const y=a("tr",{style:"border-bottom:1px solid var(--border)"}),u=a("td",{style:"padding:8px"});u.appendChild(a("span",{text:i.email||"(no email)"})),i.displayName&&i.displayName!==(i.email||"").split("@")[0]&&(u.appendChild(a("br")),u.appendChild(a("small",{style:"color:var(--muted)",text:i.displayName}))),y.appendChild(u);const w=a("td",{style:"padding:8px"});w.appendChild(h(i.role)),y.appendChild(w),y.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:i.createdAt?new Date(i.createdAt).toLocaleDateString():"\u2014"})),y.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:i.lastLoginAt?new Date(i.lastLoginAt).toLocaleString():"\u2014"}));const T=a("td",{style:"padding:8px;text-align:right"}),L=a("select",{style:"padding:2px 6px;margin-right:6px",onchange:async C=>{try{await f(c.users+"/"+encodeURIComponent(i.id),{method:"PATCH",body:{role:C.target.value}}),n&&n()}catch(B){window.errorHandler&&window.errorHandler.show("Role update failed: "+B.message),C.target.value=i.role}}});for(const C of["admin","operator","viewer"]){const B=a("option",{value:C,text:C});C===i.role&&(B.selected=!0),L.appendChild(B)}T.appendChild(L);const P=a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Delete",onclick:async()=>{if(confirm("Delete user "+(i.email||i.id)+"? This cannot be undone."))try{await f(c.users+"/"+encodeURIComponent(i.id),{method:"DELETE"}),n&&n()}catch(C){window.errorHandler&&window.errorHandler.show("Delete failed: "+C.message)}}});T.appendChild(P),y.appendChild(T),t.appendChild(y)}l.appendChild(t),s.appendChild(l)}function m(s,e){const n=a("form",{style:"display:flex;gap:8px;flex-wrap:wrap;align-items:end",onsubmit:async t=>{t.preventDefault();const i=new FormData(t.target),y={email:i.get("email"),role:i.get("role"),ttlHours:parseInt(i.get("ttlHours"),10)||24,sendEmail:i.get("sendEmail")==="on"};try{const u=await f(c.invites,{method:"POST",body:y});t.target.reset(),e&&e(u)}catch(u){window.errorHandler&&window.errorHandler.show("Invite failed: "+u.message)}}});n.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"Email"}),a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})));const l=a("select",{name:"role",style:"padding:6px"});for(const t of["operator","viewer","admin"])l.appendChild(a("option",{value:t,text:t}));n.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"Role"}),l)),n.appendChild(a("label",{style:"display:flex;flex-direction:column;gap:2px;font-size:0.85rem"},a("span",{text:"TTL (hours)"}),a("input",{name:"ttlHours",type:"number",min:"1",max:"168",value:"24",style:"padding:6px;width:80px"}))),n.appendChild(a("label",{style:"display:flex;gap:4px;align-items:center;font-size:0.85rem"},a("input",{name:"sendEmail",type:"checkbox",checked:!0}),a("span",{text:"Send email"}))),n.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Issue invite"})),s.appendChild(n)}function b(s,e,n){if(s.innerHTML="",!e||e.length===0){s.appendChild(a("p",{style:"color:var(--muted)",text:"No outstanding invites."}));return}const l=a("table",{style:"width:100%;border-collapse:collapse;font-size:0.9rem"});l.appendChild(a("thead",null,a("tr",{style:"border-bottom:1px solid var(--border)"},a("th",{style:"text-align:left;padding:8px",text:"Email"}),a("th",{style:"text-align:left;padding:8px",text:"Role"}),a("th",{style:"text-align:left;padding:8px",text:"Invited by"}),a("th",{style:"text-align:left;padding:8px",text:"Expires"}),a("th",{style:"text-align:right;padding:8px",text:"Actions"}))));const t=a("tbody");for(const i of e){const y=a("tr",{style:"border-bottom:1px solid var(--border)"});y.appendChild(a("td",{style:"padding:8px",text:i.email})),y.appendChild(a("td",{style:"padding:8px"},h(i.role))),y.appendChild(a("td",{style:"padding:8px;color:var(--muted)",text:i.invitedBy||"\u2014"})),y.appendChild(a("td",{style:"padding:8px;color:var(--muted);font-size:0.85rem",text:i.expiresAt?new Date(i.expiresAt).toLocaleString():"\u2014"}));const u=a("td",{style:"padding:8px;text-align:right"});u.appendChild(a("button",{class:"btn-sm",style:"padding:2px 8px",text:"Revoke",onclick:async()=>{if(confirm("Revoke invite for "+i.email+"?"))try{await f(c.invites+"/"+encodeURIComponent(i.id),{method:"DELETE"}),n&&n()}catch(w){window.errorHandler&&window.errorHandler.show("Revoke failed: "+w.message)}}})),y.appendChild(u),t.appendChild(y)}l.appendChild(t),s.appendChild(l)}function r(s,e){const n=a("div",{style:"margin-top:12px;padding:12px;border:1px solid #16a34a;border-radius:6px;background:#052e1a;color:#bbf7d0;font-size:0.85rem"});n.appendChild(a("strong",{text:"Invite issued \u2014 copy the link below. It will not be shown again."})),n.appendChild(a("br")),n.appendChild(a("code",{style:"display:block;margin-top:8px;padding:8px;background:#000;border-radius:4px;word-break:break-all;color:#d1fae5",text:s.acceptUrl}));const l=a("button",{class:"btn-sm",style:"margin-top:8px;padding:4px 10px",text:"Copy link",onclick:async()=>{try{await navigator.clipboard.writeText(s.acceptUrl),l.textContent="Copied!",setTimeout(()=>{l.textContent="Copy link"},2e3)}catch{window.errorHandler&&window.errorHandler.show("Clipboard blocked: select the link manually.")}}});n.appendChild(l),s.deliveredVia==="dev-console"?n.appendChild(a("p",{style:"margin-top:8px;color:#fbbf24;font-size:0.8rem",text:"SMTP not configured \u2014 the invite was logged to the server console (search for [DC-048-DEV-INVITE-LINK])."})):s.deliveredVia==="email"&&n.appendChild(a("p",{style:"margin-top:8px;color:#86efac;font-size:0.8rem",text:"Email sent to "+s.email+"."})),e.appendChild(n)}async function v(s){s.innerHTML="",s.appendChild(a("h2",{style:"margin:0 0 16px",text:"Admin \xB7 Users & Invites"}));const e=await f(c.me).catch(()=>({}));if(!e||!e.user||e.user.role!=="admin"){s.appendChild(a("p",{style:"color:var(--muted)",text:"Admin role required to view this panel. If multi-user mode is enabled and you should have access, check /api/v1/auth/me."}));return}const n=a("button",{class:"btn-sm",style:"float:right;padding:4px 10px",text:"Refresh",onclick:()=>v(s)});s.appendChild(n);const l=a("h3",{style:"margin:24px 0 8px;clear:both",text:"Users"});s.appendChild(l);const t=a("div",{id:"admin-users-list"});s.appendChild(t);const i=await f(c.users).catch(()=>({users:[]}));g(t,i.users,()=>v(s)),s.appendChild(a("h4",{style:"margin:24px 0 8px;font-size:0.95rem",text:"Pre-authorize email"}));const y=a("form",{style:"display:flex;gap:8px;align-items:end",onsubmit:async L=>{L.preventDefault();const P=L.target.email.value.trim();if(P)try{await f(c.users,{method:"POST",body:{email:P}}),L.target.reset(),v(s)}catch(C){window.errorHandler&&window.errorHandler.show("Add failed: "+C.message)}}});y.appendChild(a("input",{name:"email",type:"email",required:!0,placeholder:"user@example.com",style:"padding:6px"})),y.appendChild(a("button",{type:"submit",class:"btn-sm",style:"padding:6px 12px",text:"Add to allowlist"})),s.appendChild(y),s.appendChild(a("h3",{style:"margin:24px 0 8px",text:"Issue invite"}));const u=a("div");s.appendChild(u);const w=a("div",{id:"admin-invites-list",style:"margin-top:16px"});s.appendChild(w);const T=await f(c.invites).catch(()=>({invites:[]}));b(w,T.invites,()=>v(s)),m(u,L=>{r(L,u),v(s)})}async function d(){if(document.getElementById("admin-panel-root"))return;const e=a("div",{id:"admin-panel-root",style:"position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:1000;display:flex;align-items:center;justify-content:center;",onclick:t=>{t.target===e&&o()}}),n=a("div",{style:"background:var(--card-base,#1f2937);color:var(--text,#f3f4f6);border-radius:8px;padding:24px;max-width:900px;width:90%;max-height:85vh;overflow:auto;position:relative;box-shadow:0 10px 30px rgba(0,0,0,0.3)"});n.appendChild(a("button",{class:"btn-sm",style:"position:absolute;top:12px;right:12px;padding:4px 10px",text:"Close",onclick:o}));const l=a("div",{id:"admin-panel-body"});n.appendChild(l),e.appendChild(n),document.body.appendChild(e);try{await v(l)}catch(t){l.innerHTML='<p style="color:#f87171">Failed to load admin panel: '+(t.message||t)+"</p>"}}function o(){const s=document.getElementById("admin-panel-root");s&&s.remove()}async function p(s){async function e(){const n=await f(c.me).catch(()=>({})),l=document.getElementById("admin-trigger-btn");if(n&&n.user&&n.user.role==="admin"){if(l)return;const t=a("button",{id:"admin-trigger-btn",class:"btn-sm",style:"margin-left:8px;padding:6px 12px",text:"Admin",onclick:d});s?s.appendChild(t):document.body&&document.body.appendChild(t)}else l&&l.remove()}await e(),setInterval(e,6e4)}window.AdminPanel={open:d,close:o,attachTrigger:p}})(),(function(){injectModal("token-management-modal",`
|
|
<div id="token-management-modal" class="weather-modal">
|
|
<div class="weather-modal-content" style="min-width: 500px; max-width: 600px;">
|
|
<h3>\u{1F511} DNS Credentials</h3>
|
|
|
|
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 16px;">
|
|
Enter Technitium DNS login credentials. Read-only accounts are used for logs; admin accounts for restarts, records, and updates.
|
|
</p>
|
|
|
|
<div id="dns-cred-sections"></div>
|
|
|
|
<div class="weather-modal-buttons modal-footer-bar">
|
|
<button id="token-clear-all" style="margin-right: auto; background: color-mix(in srgb, var(--bad-fg) 15%, transparent); border-color: var(--bad-fg); color: var(--bad-fg);">Clear All</button>
|
|
<button id="token-cancel">Cancel</button>
|
|
<button id="token-save" class="btn-accent">Save</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
`);function c(){return Object.keys(SITE.dnsServers||{})}function a(t){return(SITE.dnsServers||{})[t]?.name||t.toUpperCase()}function f(){const t=document.getElementById("dns-cred-sections");if(!t)return;t.innerHTML="";const i=c();if(i.length===0){t.innerHTML='<p style="color: var(--muted); text-align: center; padding: 20px;">No DNS servers configured.</p>';return}for(const y of i)t.insertAdjacentHTML("beforeend",`
|
|
<div class="token-section">
|
|
<h4 class="token-section-title">${a(y)}</h4>
|
|
<div class="token-grid">
|
|
<div class="token-field">
|
|
<label for="${y}-readonly-username">\u{1F4D6} Read-Only (Logs):</label>
|
|
<input type="text" id="${y}-readonly-username" placeholder="Username" autocomplete="off" style="margin-bottom: 4px;" />
|
|
<div class="token-input-row">
|
|
<input type="password" id="${y}-readonly-token" placeholder="Password" autocomplete="off" />
|
|
<button type="button" class="token-toggle" data-target="${y}-readonly-token">\u{1F441}</button>
|
|
</div>
|
|
</div>
|
|
<div class="token-field">
|
|
<label for="${y}-admin-username">\u{1F527} Admin:</label>
|
|
<input type="text" id="${y}-admin-username" placeholder="Username" autocomplete="off" style="margin-bottom: 4px;" />
|
|
<div class="token-input-row">
|
|
<input type="password" id="${y}-admin-token" placeholder="Password" autocomplete="off" />
|
|
<button type="button" class="token-toggle" data-target="${y}-admin-token">\u{1F441}</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="token-status" id="${y}-token-status"></div>
|
|
</div>
|
|
`)}function h(){let t=safeSessionGet("dashcaddy-encryption-key");if(t)return t;const i=safeGet("dashcaddy-encryption-key");if(i)return safeSessionSet("dashcaddy-encryption-key",i),safeRemove("dashcaddy-encryption-key"),i;const y=new Uint8Array(32);return crypto.getRandomValues(y),t=Array.from(y,u=>u.toString(16).padStart(2,"0")).join(""),safeSessionSet("dashcaddy-encryption-key",t),t}const g=h();function m(t,i){if(!t)return"";const y=crypto.getRandomValues(new Uint8Array(8)),u=Array.from(y,L=>L.toString(16).padStart(2,"0")).join(""),w=new TextEncoder().encode(i+u);let T="";for(let L=0;L<t.length;L++){const P=t.charCodeAt(L)^w[L%w.length]^y[L%y.length]^L*31+17&255;T+=String.fromCharCode(P)}return u+":"+btoa(T)}function b(t,i){if(!t)return"";try{if(t.indexOf(":")===16){const T=t.substring(0,16),L=new Uint8Array(T.match(/.{2}/g).map($=>parseInt($,16))),P=atob(t.substring(17)),C=new TextEncoder().encode(i+T);let B="";for(let $=0;$<P.length;$++){const k=P.charCodeAt($)^C[$%C.length]^L[$%L.length]^$*31+17&255;B+=String.fromCharCode(k)}return B}const u=atob(t);let w="";for(let T=0;T<u.length;T++){const L=u.charCodeAt(T)^i.charCodeAt(T%i.length);w+=String.fromCharCode(L)}return w}catch{return""}}function r(t,i,y){const u=safeGet(`${t}-${i}-${y}-enc`);return b(u,g)}function v(t,i,y,u){const w=`${t}-${i}-${y}-enc`;u?safeSet(w,m(u,g)):safeRemove(w)}function d(t,i){return r(t,i,"token")}function o(t,i){return r(t,i,"username")}function p(t,i,y){v(t,i,"token",y)}function s(t,i,y){v(t,i,"username",y)}function e(){const t={};for(const i of c())t[i]={readonly:{username:o(i,"readonly"),token:d(i,"readonly")},admin:{username:o(i,"admin"),token:d(i,"admin")}};return t}function n(){c().forEach(t=>{["readonly","admin"].forEach(i=>{["token","username"].forEach(y=>{safeRemove(`${t}-${i}-${y}-enc`)})}),safeRemove(`${t}-token-enc`),safeRemove(`${t}-username-enc`)})}function l(t){const i=d(t,"readonly"),y=o(t,"readonly"),u=d(t,"admin"),w=o(t,"admin"),T=b(safeGet(`${t}-token-enc`),g),L=b(safeGet(`${t}-username-enc`),g);return{username:w||y||L,token:u||i||T,readonlyToken:i||T,readonlyUsername:y||L,adminToken:u||T,adminUsername:w||L}}document.getElementById("manage-tokens")?.addEventListener("click",()=>{f();const t=document.getElementById("token-management-modal"),i=e();c().forEach(y=>{const u=i[y];document.getElementById(`${y}-readonly-username`).value=u.readonly.username,document.getElementById(`${y}-readonly-token`).value=u.readonly.token,document.getElementById(`${y}-admin-username`).value=u.admin.username,document.getElementById(`${y}-admin-token`).value=u.admin.token,document.getElementById(`${y}-token-status`).textContent=""}),t.classList.add("show")}),document.getElementById("token-management-modal")?.addEventListener("click",t=>{const i=t.target.closest(".token-toggle");if(i){const y=i.dataset.target,u=document.getElementById(y);u.type==="password"?(u.type="text",i.textContent="\u{1F648}"):(u.type="password",i.textContent="\u{1F441}");return}t.target.id==="token-management-modal"&&t.target.classList.remove("show")}),document.getElementById("token-save")?.addEventListener("click",async()=>{const t=c();t.forEach(u=>{s(u,"readonly",document.getElementById(`${u}-readonly-username`).value.trim()),p(u,"readonly",document.getElementById(`${u}-readonly-token`).value.trim()),s(u,"admin",document.getElementById(`${u}-admin-username`).value.trim()),p(u,"admin",document.getElementById(`${u}-admin-token`).value.trim())});const i={};let y=!1;if(t.forEach(u=>{const w={},T=document.getElementById(`${u}-readonly-username`).value.trim(),L=document.getElementById(`${u}-readonly-token`).value.trim(),P=document.getElementById(`${u}-admin-username`).value.trim(),C=document.getElementById(`${u}-admin-token`).value.trim();T&&L&&(w.readonly={username:T,password:L},y=!0),P&&C&&(w.admin={username:P,password:C},y=!0),Object.keys(w).length>0&&(i[u]=w)}),y){t.forEach(u=>{i[u]&&(document.getElementById(`${u}-token-status`).textContent="Verifying...",document.getElementById(`${u}-token-status`).className="token-status")});try{const w=await(await secureFetch("/api/v1/dns/credentials",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({servers:i})})).json();w.results?t.forEach(T=>{const L=document.getElementById(`${T}-token-status`);if(!i[T]){L.textContent="";return}const P=w.results[T];P?.success?(L.textContent="\u2713 Verified & saved",L.className="token-status success"):P?.partial?(L.textContent="\u2713 "+P.partial,L.className="token-status success"):(L.textContent="\u2717 "+(P?.error||"Login failed"),L.className="token-status error")}):w.success?t.forEach(T=>{i[T]&&(document.getElementById(`${T}-token-status`).textContent="\u2713 Saved",document.getElementById(`${T}-token-status`).className="token-status success")}):t.forEach(T=>{i[T]&&(document.getElementById(`${T}-token-status`).textContent="\u2717 "+(w.error||"Failed"),document.getElementById(`${T}-token-status`).className="token-status error")})}catch(u){console.error("Failed to sync DNS credentials to backend:",u),t.forEach(w=>{i[w]&&(document.getElementById(`${w}-token-status`).textContent="\u2713 Saved locally (sync failed)",document.getElementById(`${w}-token-status`).className="token-status")})}}else t.forEach(u=>{document.getElementById(`${u}-token-status`).textContent=""});setTimeout(()=>{t.every(w=>{const T=document.getElementById(`${w}-token-status`)?.textContent;return!T||T.includes("\u2713")})&&closeModal("token-management-modal")},1500)}),document.getElementById("token-cancel")?.addEventListener("click",()=>{closeModal("token-management-modal")}),document.getElementById("token-clear-all")?.addEventListener("click",async()=>{if(confirm("Clear all stored DNS credentials? This cannot be undone.")){n(),c().forEach(t=>{document.getElementById(`${t}-readonly-username`).value="",document.getElementById(`${t}-readonly-token`).value="",document.getElementById(`${t}-admin-username`).value="",document.getElementById(`${t}-admin-token`).value="",document.getElementById(`${t}-token-status`).textContent="\u2713 Cleared",document.getElementById(`${t}-token-status`).className="token-status success"});try{await secureFetch("/api/v1/dns/credentials",{method:"DELETE"})}catch{}}}),window.getToken=d,window.getUsername=o,window.setToken=p,window.setUsername=s,window.getAllCredentials=e,window.getCredential=r,window.setCredential=v,window.getEncryptionKey=h,window.getDnsIds=c,window.getDnsDisplayName=a})(),(function(){function c(p,s,e=null){const n=document.getElementById(p+"-dot"),l=document.getElementById(p+"-pill"),t=document.getElementById(p+"-time"),i=document.querySelector(`[data-app="${p}"]`);n&&(n.classList.toggle("ok",s),n.classList.toggle("bad",!s)),l&&(l.textContent=s?"ON":"OFF",l.classList.toggle("on",s),l.classList.toggle("off",!s)),t&&e!==null&&(t.textContent=s?`${e}ms`:"timeout",t.className=`response-time ${a(e,s)}`),i&&i.setAttribute("data-status",s?"on":"off")}function a(p,s){return s?p<200?"excellent":p<500?"good":p<1e3?"fair":"slow":"timeout"}async function f(p){const s=performance.now();try{const e=await fetch("/probe/"+p,{cache:"no-store"}),n=performance.now(),l=Math.round(n-s);return{isUp:e.status>=200&&e.status<400||e.status===401||e.status===403,responseTime:l}}catch{const e=performance.now();return{isUp:!1,responseTime:Math.round(e-s)}}}window.APPS=[];let h=null,g=!1;async function m(){try{window.SkeletonLoader&&window.SkeletonLoader.show(6);const p=await fetch("/api/v1/services",{cache:"no-store"});if(p.ok){const s=await p.json();window.APPS=s.services||[],window.SkeletonLoader&&window.SkeletonLoader.hide()}else console.error("Failed to load services:",p.status),window.SkeletonLoader&&window.SkeletonLoader.hide()}catch(p){console.error("Failed to load services:",p),window.SkeletonLoader&&window.SkeletonLoader.hide()}}function b(p){const s=window.APPS?.find(n=>n.id===p);if(s?.url)return s.url.startsWith("http")?s.url:"https://"+s.url;if(s?.isExternal&&s.externalUrl)return s.externalUrl;const e=SITE.dnsServers?.[p];return e?"http://"+e.ip+":"+(e.port||5380):buildServiceUrl(p)}function r(p,s,e){const n=document.createElement(p);return s&&(n.className=s),e&&(n.textContent=e),n}function v(){const p=document.getElementById("cards");p.innerHTML="";for(let s=0;s<window.APPS.length;s++){const e=window.APPS[s];if(e.id==="ca")continue;const n=r("div","card");n.setAttribute("data-app",e.id),n.setAttribute("data-status","off"),e.containerId&&n.setAttribute("data-container-id",e.containerId),e.category&&n.setAttribute("data-category",e.category),e.recipeId&&n.setAttribute("data-recipe-id",e.recipeId);const l=r("span","dot bad at-bl");l.id="dot-"+e.id+"-grid",n.appendChild(l);const t=r("div","row"),i=r("div","logo-wrap"),y=document.createElement("img");y.src=e.logo,y.alt=e.name,y.className="logo-img",y.onerror=function(){let E=e.id||e.appTemplate;if(!E&&e.name&&(E=e.name.toLowerCase().replace(/\s+/g,"-")),E){const S=[`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${E}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${E.toLowerCase()}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${E.replace(/-/g,"")}.png`,`https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/${e.name.toLowerCase().replace(/\s+/g,"-")}.png`],A=[...new Set(S)],O=A.indexOf(this.src)+1;O<A.length?this.src=A[O]:this.style.display="none"}else this.style.display="none"},i.appendChild(y),t.appendChild(i);const u=r("span","name",e.name);if(t.appendChild(u),e.tailscaleOnly){const E=r("span","ts-badge","\u{1F510}");E.title="Tailscale-only access",E.style.cssText="margin-left: 6px; font-size: 0.75rem; opacity: 0.8;",u.appendChild(E)}if(e.category){const S=(typeof DC<"u"&&DC.CATEGORIES||window.DC_CATEGORIES||{})[e.category]||{},A=r("span","cat-badge",`${S.icon||""} ${e.category}`.trim());A.title=`Category: ${e.category}`,A.style.cssText=`margin-left: 6px; font-size: 0.65rem; padding: 1px 6px; border-radius: 999px; background: color-mix(in srgb, ${S.color||"#7f8c8d"} 25%, transparent); color: ${S.color||"#7f8c8d"}; border: 1px solid color-mix(in srgb, ${S.color||"#7f8c8d"} 50%, transparent); white-space: nowrap; font-weight: 500;`,u.appendChild(A)}t.appendChild(r("span","spacer"));const w=r("span","badge off","OFF");w.id="badge-"+e.id,t.appendChild(w);const T=r("span","update-available-badge","UPDATE");T.id="update-badge-"+e.id,T.title="Update available",t.appendChild(T),n.appendChild(t);const L=r("div","response-row"),P=r("span","response-time","--");P.id="time-"+e.id,L.appendChild(P),n.appendChild(L);const C=r("div","health-row");C.id="health-"+e.id;const B=r("span","uptime-chip","--");B.id="uptime-"+e.id,C.appendChild(B);const $=document.createElement("div");$.className="uptime-mini-bar";const k=document.createElement("div");k.className="fill",k.id="uptime-bar-"+e.id,k.style.width="0%",$.appendChild(k),C.appendChild($),n.appendChild(C);const x=r("div","btn-row");if(e.containerId){const E=r("button","logs-btn","\u{1F4CB}");E.title="View container logs",E.onclick=D=>{D.stopPropagation(),window.openContainerLogsModal(e.containerId,e.name)},x.appendChild(E);const S=r("button","update-btn","\u2B06\uFE0F");S.title="Update container to latest version",S.id=`update-btn-${e.id}`,S.onclick=D=>{D.stopPropagation(),window.updateContainer(e.containerId,e.name,e.id)},x.appendChild(S);const A=r("button","exec-btn",">_");A.title="Open terminal",A.onclick=D=>{D.stopPropagation(),window.openExecModal&&window.openExecModal(e.containerId,e.name)},x.appendChild(A)}if(e.logPath&&!e.containerId){const E=r("button","logs-btn","\u{1F4CB}");E.title="View application logs",E.onclick=S=>{S.stopPropagation(),window.openFileLogsModal(e.logPath,e.name)},x.appendChild(E)}if(e.isExternal||e.appTemplate||e.url){const E=r("button","creds-btn","\u{1F511}");E.title="Auto-login credentials",E.id=`creds-btn-${e.id}`,E.onclick=S=>{S.stopPropagation(),window.openServiceCredsModal(e)},x.appendChild(E)}if(e.id!=="internet"){const E=r("button","options-btn","\u2699\uFE0F");E.title="Edit service settings",E.onclick=S=>{S.stopPropagation(),window.openServiceEditModal(e)},x.appendChild(E)}if(e.id!=="internet"){const E=r("button","share-btn","\u{1F517}");E.title="Share this service (Pro)",E.onclick=S=>{S.stopPropagation(),typeof window.openShareModal=="function"?window.openShareModal(e):typeof window.showNotification=="function"&&window.showNotification("Share modal not loaded. Refresh the page.","error")},x.appendChild(E)}if(e.id!=="internet"){const E=r("button","delete-btn","\u{1F5D1}\uFE0F");E.title="Delete this service",E.onclick=S=>{S.stopPropagation(),window.deleteService(e.id,e.name)},x.appendChild(E)}const I=r("button",null,"Open");I.onclick=()=>window.open(b(e.id),"_blank","noopener"),x.appendChild(I),n.appendChild(x),n.style.transitionDelay=`${Math.min(s*45,270)}ms`,p.appendChild(n)}requestAnimationFrame(()=>{p.querySelectorAll(".card").forEach(s=>s.classList.add("loaded"))}),window.groupRecipeCards&&requestAnimationFrame(()=>window.groupRecipeCards()),window.refreshServiceFilter&&window.refreshServiceFilter()}function d(p,s,e=null){const n=document.getElementById("dot-"+p+"-grid"),l=document.getElementById("badge-"+p),t=document.getElementById("time-"+p),i=document.querySelector(`[data-app="${p}"]`);n&&(n.classList.toggle("ok",s),n.classList.toggle("bad",!s)),l&&(l.textContent=s?"ON":"OFF",l.classList.toggle("on",s),l.classList.toggle("off",!s)),t&&e!==null&&(t.textContent=s?`${e}ms`:"timeout",t.className=`response-time ${a(e,s)}`),i&&i.setAttribute("data-status",s?"on":"off")}async function o(){if(h)return g=!0,h;function p(n,l=new Date){const t=document.getElementById("stamp");t&&(t.textContent=`${n}: ${new Date(l).toLocaleTimeString()}`)}function s(n){Object.keys(SITE.dnsServers).forEach(t=>{const i=n[t];i&&c(t,i.isUp,i.responseTime)}),n.internet&&c("internet",n.internet.isUp,n.internet.responseTime),window.APPS.forEach(t=>{const i=n[t.id];i&&d(t.id,i.isUp,i.responseTime)})}async function e(){const n=Object.keys(SITE.dnsServers),l=n.map(u=>f(u));l.push(f("internet"));const t=await Promise.all(l);n.forEach((u,w)=>c(u,t[w].isUp,t[w].responseTime));const i=t[t.length-1];c("internet",i.isUp,i.responseTime),(await Promise.all(window.APPS.map(async u=>{const w=await f(u.id);return{id:u.id,...w}}))).forEach(u=>{d(u.id,u.isUp,u.responseTime)})}return h=(async()=>{try{const n=await fetch("/api/v1/services/status",{cache:"no-store"});if(!n.ok)throw new Error(`Status refresh failed (${n.status})`);const l=await n.json();s(l.statuses||{}),p("last check",l.checkedAt||new Date)}catch(n){console.warn("Batched status refresh failed, falling back to direct probes:",n);try{await e(),p("last check")}catch(l){console.error("Dashboard refresh failed:",l),p("last failed")}}finally{h=null,g&&(g=!1,setTimeout(()=>{window.refreshAll()},0))}})(),h}document.querySelector(".top")?.addEventListener("click",p=>{const s=p.target.closest('[id$="-open"]');if(!s)return;const e=s.id.replace("-open","");SITE.dnsServers[e]&&window.open(b(e),"_blank","noopener")}),document.getElementById("ca-open")?.addEventListener("click",()=>window.open(b("ca"),"_blank","noopener")),document.getElementById("creds-btn-ca")?.addEventListener("click",p=>{p.stopPropagation();const s=window.APPS.find(e=>e.id==="ca");s&&window.openServiceCredsModal&&window.openServiceCredsModal(s)}),document.getElementById("options-btn-ca")?.addEventListener("click",p=>{p.stopPropagation();const s=window.APPS.find(e=>e.id==="ca");s&&window.openServiceEditModal&&window.openServiceEditModal(s)}),document.getElementById("delete-btn-ca")?.addEventListener("click",p=>{p.stopPropagation(),window.deleteService&&window.deleteService("ca","DashCA")}),window.loadServices=m,window.buildGrid=v,window.refreshAll=o,window.setQuick=c,window.setBadge=d,window.getResponseTimeClass=a,window.checkServiceWithTiming=f,window.serviceUrl=b,window.el=r})(),(function(){async function c(r){const d=await(await secureFetch(`/api/v1/dns/restart/${r}`,{method:"POST"})).json();if(!d.success)throw new Error(d.error||"Restart failed");return d}document.querySelector(".top")?.addEventListener("click",async r=>{const v=r.target.closest('[id$="-restart"]');if(!v)return;const d=v.id.replace("-restart","");if(SITE.dnsServers[d]&&confirm(`Restart ${d.toUpperCase()} service?`))try{await withButton(v,"...",()=>c(d)),setTimeout(window.refreshAll,DC.DELAYS.RELOAD)}catch(o){showNotification("Restart failed: "+o.message,"error")}});async function a(r,v){const d=document.getElementById(`${r}-update`),o=d?.textContent||"\u2B06\uFE0F";try{d.textContent="\u{1F50D}",d.disabled=!0,d.title="Checking for updates...";const s=await(await fetch(`/api/v1/dns/check-update?server=${encodeURIComponent(v)}`)).json();if(!s.success)throw new Error(s.error||"Failed to check for updates");if(!s.updateAvailable){d.textContent="\u2705",d.title=`Already on latest version (${s.currentVersion})`,showNotification(`${r.toUpperCase()} is already up to date! Current version: ${s.currentVersion}`,"info"),setTimeout(()=>{d.textContent=o,d.disabled=!1,d.title="Update DNS server"},3e3);return}if(!confirm(`Update available for ${r.toUpperCase()}!
|
|
|
|
Current: ${s.currentVersion}
|
|
New: ${s.updateVersion}
|
|
|
|
`+(s.updateTitle?`${s.updateTitle}
|
|
|
|
`:"")+`The DNS server will restart during the update.
|
|
Proceed?`)){d.textContent=o,d.disabled=!1,d.title="Update DNS server";return}d.textContent="\u{1F504}",d.title="Updating...";const l=await(await secureFetch(`/api/v1/dns/update?server=${encodeURIComponent(v)}`,{method:"POST"})).json();if(!l.success)throw new Error(l.error||"Update failed");if(l.manualUpdateRequired){d.textContent="\u2B06\uFE0F",d.title=`Update available: ${l.newVersion}`;const t=l.downloadLink?`
|
|
Download: ${l.downloadLink}`:"",i=l.instructionsLink?`
|
|
Instructions: ${l.instructionsLink}`:"";showNotification(`${r.toUpperCase()} update requires manual installation. Current: ${l.previousVersion} \u2192 ${l.newVersion}. Please update manually on the host machine.`,"warning",8e3),d.disabled=!1;return}d.textContent="\u2705",d.title="Updated successfully!",showNotification(`${r.toUpperCase()} updated successfully! ${l.previousVersion} \u2192 ${l.newVersion}. Server is restarting...`,"success"),setTimeout(()=>{d.textContent=o,d.disabled=!1,d.title="Update DNS server",window.refreshAll()},1e4)}catch(p){console.error("DNS update error:",p),d.textContent="\u274C",d.title="Update failed",showNotification(`Failed to update ${r.toUpperCase()}: ${p.message}`,"error"),setTimeout(()=>{d.textContent=o,d.disabled=!1,d.title="Update DNS server"},3e3)}}document.querySelector(".top")?.addEventListener("click",r=>{const v=r.target.closest('[id$="-update"]');if(!v)return;const d=v.id.replace("-update","");SITE.dnsServers[d]&&a(d,SITE.dnsServers[d]?.ip)}),injectModal("dns-settings-modal",`
|
|
<div id="dns-settings-modal" class="weather-modal">
|
|
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
|
|
<h3 id="dns-settings-title">DNS Settings</h3>
|
|
|
|
<div style="display: grid; gap: 16px; margin-top: 16px;">
|
|
<div>
|
|
<label for="dns-edit-ip" class="form-label-accent-sm">Server IP</label>
|
|
<input type="text" id="dns-edit-ip" class="form-input-md" placeholder="192.168.1.1" />
|
|
</div>
|
|
<div>
|
|
<label for="dns-edit-port" class="form-label-accent-sm">Port</label>
|
|
<input type="number" id="dns-edit-port" class="form-input-md" placeholder="5380" />
|
|
</div>
|
|
<div>
|
|
<label for="dns-edit-name" class="form-label-accent-sm">Display Name (optional)</label>
|
|
<input type="text" id="dns-edit-name" class="form-input-md" placeholder="e.g. Primary DNS" />
|
|
</div>
|
|
<div class="form-hint-sm">Manage credentials via Tokens in the toolbar</div>
|
|
</div>
|
|
|
|
<div class="weather-modal-buttons" style="margin-top: 24px;">
|
|
<button id="dns-settings-cancel">Cancel</button>
|
|
<button id="dns-settings-delete" style="background: color-mix(in srgb, #e74c3c 20%, transparent); border-color: #e74c3c; color: #e74c3c;">Remove</button>
|
|
<button id="dns-settings-save" class="btn-accent">Save</button>
|
|
</div>
|
|
</div>
|
|
</div>`);let f=null;function h(r){f=r;const v=SITE.dnsServers[r]||{},d=document.getElementById("dns-settings-modal");document.getElementById("dns-settings-title").textContent=`${(v.name||r).toUpperCase()} Settings`,document.getElementById("dns-edit-ip").value=v.ip||"",document.getElementById("dns-edit-port").value=v.port||DC.DEFAULTS.DNS_PORT,document.getElementById("dns-edit-name").value=v.name||"",d.classList.add("show")}async function g(){if(!f)return;const r=document.getElementById("dns-edit-ip").value.trim(),v=document.getElementById("dns-edit-port").value.trim()||DC.DEFAULTS.DNS_PORT,d=document.getElementById("dns-edit-name").value.trim();if(!r){showNotification("Server IP is required","warning");return}const o={dnsServers:{}};o.dnsServers[f]={ip:r,port:String(v)},d&&(o.dnsServers[f].name=d);try{const s=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})).json();s.success?(SITE.dnsServers[f]=o.dnsServers[f],showNotification(`${f.toUpperCase()} settings saved`,"success"),b(),window.refreshAll()):showNotification(s.error||"Failed to save settings","error")}catch(p){showNotification("Failed to save: "+p.message,"error")}}async function m(){if(f&&confirm(`Remove ${f.toUpperCase()} from dashboard? This won't affect the actual DNS server.`))try{const v=await(await secureFetch("/api/v1/config")).json();v.dnsServers&&delete v.dnsServers[f];const o=await(await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dnsServers:v.dnsServers||{}})})).json();if(o.success){delete SITE.dnsServers[f];const p=document.querySelector(`.top [data-app="${f}"]`);p&&p.remove(),showNotification(`${f.toUpperCase()} removed from dashboard`,"success"),b()}else showNotification(o.error||"Failed to remove","error")}catch(r){showNotification("Failed to remove: "+r.message,"error")}}function b(){closeModal("dns-settings-modal"),f=null}document.getElementById("dns-settings-cancel")?.addEventListener("click",b),document.getElementById("dns-settings-save")?.addEventListener("click",g),document.getElementById("dns-settings-delete")?.addEventListener("click",m),document.getElementById("dns-settings-modal")?.addEventListener("click",r=>{r.target.id==="dns-settings-modal"&&b()}),document.querySelector(".top")?.addEventListener("click",r=>{const v=r.target.closest('[id$="-settings"]');if(!v)return;const d=v.id.replace("-settings","");SITE.dnsServers[d]&&(r.stopPropagation(),h(d))}),document.getElementById("refresh")?.addEventListener("click",window.refreshAll)})(),(function(){injectModal("logs-modal",`
|
|
<div id="logs-modal" class="logs-modal">
|
|
<div class="logs-modal-content" style="min-width: 800px; max-width: 1000px;">
|
|
<div class="logs-header">
|
|
<h3 id="logs-title">DNS Logs</h3>
|
|
<div class="logs-controls">
|
|
<label for="log-lines">Show:</label>
|
|
<select id="log-lines">
|
|
<option value="25" selected>25</option>
|
|
<option value="50">50</option>
|
|
<option value="100">100</option>
|
|
<option value="200">200</option>
|
|
</select>
|
|
<button id="logs-stream" class="stream-btn" title="Enable real-time streaming">\u{1F4E1} Live</button>
|
|
<button id="logs-pause" class="pause-btn">\u23F8\uFE0F Pause</button>
|
|
<button id="logs-close" class="close-btn">\u2715</button>
|
|
</div>
|
|
</div>
|
|
<div class="logs-container scroll-container">
|
|
<div id="logs-content" class="logs-content">
|
|
<div class="logs-loading">Loading logs...</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>`);let c=null,a=null,f=!1,h=null,g=null,m=!1,b=null,r=null,v=!1,d=null,o=!1;async function p(k,x=25){try{const I=getDnsServerAddr(k),E=await fetch(`/api/v1/dns/logs?server=${I}&limit=${x}`,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(E.ok){const S=await E.json();return S.success&&S.logs?{logs:S.logs,count:S.count,server:S.server}:{error:S.error||"Failed to fetch logs"}}else return E.status===401?{error:"DNS auto-auth failed - check credentials in settings"}:{error:`HTTP ${E.status}`}}catch(I){return console.error("DNS logs fetch failed:",I),{error:I.message}}}function s(k){return{NoError:"var(--ok-fg)",NOERROR:"var(--ok-fg)",NxDomain:"var(--muted)",NXDOMAIN:"var(--muted)",Refused:"var(--bad-fg)",REFUSED:"var(--bad-fg)",ServerFailure:"#f39c12",SERVFAIL:"#f39c12"}[k]||"var(--fg)"}function e(k){const x=document.createElement("div");if(x.className="log-entry",x.style.cssText="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: center;",k.parsed===!1)return x.style.gridTemplateColumns="1fr",x.innerHTML=`<span style="color: var(--muted); font-family: monospace; font-size: 0.75rem;">${escapeHtml(k.raw)}</span>`,x;const I=s(k.rcode),E=k.rcode==="Refused"||k.rcode==="REFUSED";return x.innerHTML=`
|
|
<span style="color: var(--muted); font-size: 0.75rem;">${escapeHtml(k.timestamp)}</span>
|
|
<span style="color: var(--accent); font-size: 0.75rem;" title="${escapeHtml(k.client)}">${escapeHtml(k.client)}</span>
|
|
<span style="font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; ${E?"text-decoration: line-through; opacity: 0.6;":""}" title="${escapeHtml(k.domain)}">${escapeHtml(k.domain)}</span>
|
|
<span style="color: var(--muted); font-size: 0.75rem;">${escapeHtml(k.type)}</span>
|
|
<span style="color: ${I}; font-weight: 500; font-size: 0.75rem;">${escapeHtml(k.rcode)}</span>
|
|
`,x}async function n(){if(v){await B();return}if(m){await T();return}if(f||!c)return;const k=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const I=await p(c,k);if(I.error){x.innerHTML=`
|
|
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
|
|
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
|
|
<div>${escapeHtml(I.error)}</div>
|
|
</div>`;return}x.innerHTML=`
|
|
<div style="display: grid; grid-template-columns: 140px 110px 1fr 70px 80px; gap: 8px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
|
|
<span>Time</span>
|
|
<span>Client</span>
|
|
<span>Domain</span>
|
|
<span>Type</span>
|
|
<span>Status</span>
|
|
</div>`,I.logs&&I.logs.length>0?I.logs.forEach(E=>{const S=e(E);x.appendChild(S)}):x.innerHTML+=`
|
|
<div style="padding: 20px; text-align: center; color: var(--muted);">
|
|
No DNS queries logged yet
|
|
</div>`}catch(I){x.innerHTML=`
|
|
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
|
|
Failed to fetch logs: ${escapeHtml(I.message)}
|
|
</div>`}}function l(k){c=k,f=!1,m=!1;const x=document.getElementById("logs-modal"),I=document.getElementById("logs-title"),E=document.getElementById("logs-pause"),S=document.getElementById("logs-stream");I.textContent=`${k.toUpperCase()} DNS Logs`,E.textContent="\u23F8\uFE0F Pause",E.classList.remove("paused"),S&&(S.style.display="none"),x.classList.add("show"),n(),a=setInterval(n,DC.POLL.LOGS)}function t(){document.getElementById("logs-modal").classList.remove("show"),a&&(clearInterval(a),a=null),y(),c=null,m=!1,h=null,g=null,v=!1,b=null,r=null,f=!1}function i(k){d&&y();const x=document.getElementById("logs-stream"),I=document.getElementById("logs-pause"),E=document.getElementById("logs-content");a&&(clearInterval(a),a=null);try{d=new EventSource(`/api/v1/logs/stream/${k}`),o=!0,x.classList.add("active"),x.textContent="\u{1F534} Live",x.title="Streaming - click to stop",I.style.display="none";const S=document.getElementById("logs-title");S.textContent.includes("\u{1F534}")||(S.innerHTML=S.textContent.replace("\u{1F4CB}","\u{1F4CB} \u{1F534}")),d.onmessage=A=>{try{const D=JSON.parse(A.data);if(D.error){console.error("Stream error:",D.error),y();return}const O=document.createElement("div");O.className="log-entry",O.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const R=(D.stream||"stdout")==="stderr",N=R?"var(--bad-fg)":"var(--fg)",_=`<span style="background: ${R?"var(--bad-bg)":"var(--ok-bg)"}; color: ${N}; padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; min-width: 50px; text-align: center;">${R?"STDERR":"STDOUT"}</span>`;for(O.innerHTML=`
|
|
<div style="flex-shrink: 0;">${_}</div>
|
|
<div style="flex: 1; color: ${N}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(D.text)}</div>
|
|
`,E.appendChild(O),E.scrollTop=E.scrollHeight;E.children.length>500;)E.removeChild(E.firstChild)}catch(D){console.error("Error parsing stream data:",D)}},d.onerror=A=>{console.error("EventSource error:",A),y()}}catch(S){console.error("Failed to start streaming:",S),y()}}function y(){d&&(d.close(),d=null),o=!1;const k=document.getElementById("logs-stream"),x=document.getElementById("logs-pause"),I=document.getElementById("logs-title");k&&(k.classList.remove("active"),k.textContent="\u{1F4E1} Live",k.title="Enable real-time streaming"),x&&(x.style.display=""),I&&(I.textContent=I.textContent.replace(" \u{1F534}","")),m&&h&&!a&&(a=setInterval(T,DC.POLL.LOGS))}async function u(k,x=100){try{const I=`/api/v1/logs/container/${k}?tail=${x}×tamps=true`,E=await fetch(I,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(E.ok){const S=await E.json();return S.success&&S.logs?{logs:S.logs,count:S.count,containerName:S.containerName,containerId:S.containerId}:{error:S.error||"Failed to fetch container logs"}}else return{error:`HTTP ${E.status}: ${E.statusText}`}}catch(I){return console.error("Container logs fetch failed:",I),{error:I.message}}}function w(k){const x=document.createElement("div");x.className="log-entry",x.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const I=k.stream==="stderr"?"var(--bad-fg)":"var(--fg)",E=k.stream==="stderr"?'<span style="background: var(--bad-bg); color: var(--bad-fg); padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600;">STDERR</span>':'<span style="background: var(--ok-bg); color: var(--ok-fg); padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600;">STDOUT</span>';return x.innerHTML=`
|
|
<div style="flex-shrink: 0;">${E}</div>
|
|
<div style="flex: 1; color: ${I}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(k.text)}</div>
|
|
`,x}async function T(){if(f||!h||!m)return;const k=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const I=await u(h,k);if(I.error){x.innerHTML=`
|
|
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
|
|
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
|
|
<div>${escapeHtml(I.error)}</div>
|
|
</div>`;return}x.innerHTML=`
|
|
<div style="display: flex; gap: 12px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
|
|
<span style="flex-shrink: 0; width: 80px;">Stream</span>
|
|
<span style="flex: 1;">Log Output</span>
|
|
</div>`,I.logs&&I.logs.length>0?(I.logs.forEach(E=>{const S=w(E);x.appendChild(S)}),x.scrollTop=x.scrollHeight):x.innerHTML+=`
|
|
<div style="padding: 20px; text-align: center; color: var(--muted);">
|
|
No logs available for this container
|
|
</div>`}catch(I){x.innerHTML=`
|
|
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
|
|
Failed to fetch logs: ${escapeHtml(I.message)}
|
|
</div>`}}function L(k,x){h=k,g=x,m=!0,v=!1,f=!1,y();const I=document.getElementById("logs-modal"),E=document.getElementById("logs-title"),S=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");E.textContent=`\u{1F4CB} ${x} - Container Logs`,S.textContent="\u23F8\uFE0F Pause",S.classList.remove("paused"),A&&(A.style.display=""),I.classList.add("show"),T(),a=setInterval(T,DC.POLL.LOGS)}async function P(k,x=100){try{const I=`/api/v1/logs/file?path=${encodeURIComponent(k)}&tail=${x}`,E=await fetch(I,{cache:"no-store",headers:{Accept:"application/json","Cache-Control":"no-cache"}});if(E.ok){const S=await E.json();return S.success&&S.logs?{logs:S.logs,count:S.count,logPath:S.logPath,totalLines:S.totalLines}:{error:S.error||"Failed to fetch file logs"}}else return{error:(await E.json().catch(()=>({}))).error||`HTTP ${E.status}`}}catch(I){return console.error("File logs fetch failed:",I),{error:I.message}}}function C(k){const x=document.createElement("div");x.className="log-entry",x.style.cssText="display: flex; gap: 12px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-size: 0.8rem; align-items: flex-start; font-family: monospace;";const I=k.text;let E="INFO",S="var(--fg)";I.match(/ERROR|FATAL|CRITICAL/i)?(E="ERROR",S="var(--bad-fg)"):I.match(/WARN|WARNING/i)?(E="WARN",S="#f39c12"):I.match(/DEBUG/i)&&(E="DEBUG",S="var(--muted)");const D=`<span style="background: ${S==="var(--bad-fg)"?"var(--bad-bg)":"var(--ok-bg)"}; color: ${S}; padding: 2px 6px; border-radius: 4px; font-size: 0.7rem; font-weight: 600; min-width: 50px; text-align: center;">${E}</span>`;return x.innerHTML=`
|
|
<div style="flex-shrink: 0;">${D}</div>
|
|
<div style="flex: 1; color: ${S}; word-break: break-all; white-space: pre-wrap;">${escapeHtml(I)}</div>
|
|
`,x}async function B(){if(f||!b||!v)return;const k=parseInt(document.getElementById("log-lines").value),x=document.getElementById("logs-content");try{const I=await P(b,k);if(I.error){x.innerHTML=`
|
|
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
|
|
<div style="font-size: 1.2rem; margin-bottom: 8px;">\u26A0\uFE0F Error</div>
|
|
<div>${escapeHtml(I.error)}</div>
|
|
</div>`;return}x.innerHTML=`
|
|
<div style="display: flex; gap: 12px; padding: 8px 10px; background: var(--card-base); border-bottom: 2px solid var(--border); font-size: 0.75rem; font-weight: 600; color: var(--muted); position: sticky; top: 0;">
|
|
<span style="flex: 1;">Log Output (${I.count} of ${I.totalLines} lines)</span>
|
|
</div>`,I.logs&&I.logs.length>0?(I.logs.forEach(E=>{const S=C(E);x.appendChild(S)}),x.scrollTop=x.scrollHeight):x.innerHTML+=`
|
|
<div style="padding: 20px; text-align: center; color: var(--muted);">
|
|
No logs available in this file
|
|
</div>`}catch(I){x.innerHTML=`
|
|
<div style="padding: 20px; text-align: center; color: var(--bad-fg);">
|
|
Failed to fetch logs: ${escapeHtml(I.message)}
|
|
</div>`}}function $(k,x){b=k,r=x,v=!0,m=!1,f=!1;const I=document.getElementById("logs-modal"),E=document.getElementById("logs-title"),S=document.getElementById("logs-pause"),A=document.getElementById("logs-stream");E.textContent=`\u{1F4CB} ${x} - Application Logs`,S.textContent="\u23F8\uFE0F Pause",S.classList.remove("paused"),A&&(A.style.display="none"),I.classList.add("show"),B(),a=setInterval(B,DC.POLL.LOGS)}document.querySelector(".top")?.addEventListener("click",k=>{const x=k.target.closest('[id$="-logs"]');if(!x)return;const I=x.id.replace("-logs","");SITE.dnsServers[I]&&l(I)}),document.getElementById("logs-close")?.addEventListener("click",t),document.getElementById("logs-pause")?.addEventListener("click",()=>{f=!f;const k=document.getElementById("logs-pause");f?(k.textContent="\u25B6\uFE0F Resume",k.classList.add("paused")):(k.textContent="\u23F8\uFE0F Pause",k.classList.remove("paused"),n())}),document.getElementById("log-lines")?.addEventListener("change",()=>{f||n()}),document.getElementById("logs-stream")?.addEventListener("click",()=>{!m||!h||(o?y():i(h))}),document.getElementById("logs-modal")?.addEventListener("click",k=>{k.target.id==="logs-modal"&&t()}),document.addEventListener("keydown",k=>{k.key==="Escape"&&document.getElementById("logs-modal")?.classList.contains("show")&&t()}),window.openContainerLogsModal=L,window.openFileLogsModal=$,window.openLogsModal=l})(),(function(){injectModal("service-edit-modal",`
|
|
<div id="service-edit-modal" class="weather-modal">
|
|
<div class="weather-modal-content" style="min-width: 500px; max-width: 600px;">
|
|
<h3 id="service-edit-title">Edit Service</h3>
|
|
|
|
<div style="display: grid; gap: 16px; margin-top: 16px;">
|
|
<!-- Service Info -->
|
|
<div style="display: flex; align-items: center; gap: 12px; padding: 12px; background: var(--card-bg); border-radius: 8px;">
|
|
<img id="edit-service-logo-preview" src="" alt="" style="width: 48px; height: 48px; border-radius: 8px; object-fit: contain; background: var(--bg);" />
|
|
<div style="flex: 1;">
|
|
<div id="edit-service-url-display" class="text-muted-sm"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Display Name -->
|
|
<div>
|
|
<label for="edit-service-name" class="form-label-accent-sm">
|
|
Display Name
|
|
</label>
|
|
<input type="text" id="edit-service-name" class="form-input-md" placeholder="Service name shown on dashboard" />
|
|
</div>
|
|
|
|
<!-- Subdomain -->
|
|
<div>
|
|
<label for="edit-subdomain" class="form-label-accent-sm">
|
|
Subdomain
|
|
</label>
|
|
<div class="flex-row-gap-center">
|
|
<input type="text" id="edit-subdomain" class="input-flex" />
|
|
<span id="edit-tld-suffix" style="color: var(--muted);">.home</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Port -->
|
|
<div>
|
|
<label for="edit-port" class="form-label-accent-sm">
|
|
Port
|
|
</label>
|
|
<input type="number" id="edit-port" class="form-input-md" />
|
|
<div class="form-hint-sm">
|
|
The port Caddy will proxy to (container's exposed port)
|
|
</div>
|
|
</div>
|
|
|
|
<!-- IP Address -->
|
|
<div>
|
|
<label for="edit-ip" class="form-label-accent-sm">
|
|
IP Address
|
|
</label>
|
|
<input type="text" id="edit-ip" class="form-input-md" />
|
|
</div>
|
|
|
|
<!-- Tailscale Protection -->
|
|
<div>
|
|
<label style="display: flex; align-items: center; gap: 10px; padding: 12px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer;">
|
|
<input type="checkbox" id="edit-tailscale-only" style="width: 18px; height: 18px;" />
|
|
<div>
|
|
<div class="fw-500">Tailscale-Only Access</div>
|
|
<div class="text-hint">Restrict this service to Tailscale users only</div>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
|
|
<!-- Logo -->
|
|
<div>
|
|
<label class="form-label-accent-sm">
|
|
Service Logo
|
|
</label>
|
|
<div class="flex-row-gap-center">
|
|
<input type="text" id="edit-logo-url" placeholder="/assets/service.png or https://..." class="input-flex" />
|
|
<label style="padding: 10px 16px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px; cursor: pointer; white-space: nowrap;">
|
|
<input type="file" id="edit-logo-file" accept="image/*" style="display: none;" />
|
|
Upload
|
|
</label>
|
|
</div>
|
|
<div class="form-hint-sm">
|
|
Enter a URL or upload an image file (PNG, JPG, SVG)
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Category -->
|
|
<div>
|
|
<label for="edit-service-category" class="form-label-accent-sm">
|
|
Category
|
|
</label>
|
|
<select id="edit-service-category" data-role="service-category" class="form-input-md">
|
|
<option value="">\u2014 No category \u2014</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="weather-modal-buttons" style="margin-top: 24px;">
|
|
<button id="service-edit-cancel">Cancel</button>
|
|
<button id="service-edit-save" class="btn-accent">
|
|
Save Changes
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>`),injectModal("delete-service-modal",`
|
|
<div id="delete-service-modal" class="weather-modal">
|
|
<div class="weather-modal-content" style="min-width: 400px; max-width: 500px;">
|
|
<h3 id="delete-modal-title" class="mb-16">Delete Service</h3>
|
|
|
|
<div id="delete-modal-message" style="margin-bottom: 20px; line-height: 1.5;">
|
|
<!-- Dynamic content -->
|
|
</div>
|
|
|
|
<div id="delete-modal-container-info" style="display: none; margin-bottom: 20px; padding: 12px; background: var(--card-bg); border-radius: 8px; border: 1px solid var(--border);">
|
|
<div style="font-weight: 500; margin-bottom: 8px;">Docker Container</div>
|
|
<div id="delete-modal-container-name" style="font-size: 0.9rem; color: var(--muted);"></div>
|
|
</div>
|
|
|
|
<div class="weather-modal-buttons" style="display: flex; gap: 8px; justify-content: flex-end;">
|
|
<button id="delete-modal-cancel" style="padding: 10px 20px;">Cancel</button>
|
|
<button id="delete-modal-remove" style="padding: 10px 20px; background: color-mix(in srgb, var(--accent) 20%, transparent); border-color: var(--accent); color: var(--accent);">
|
|
Remove
|
|
</button>
|
|
<button id="delete-modal-delete" style="display: none; padding: 10px 20px; background: color-mix(in srgb, #e74c3c 20%, transparent); border-color: #e74c3c; color: #e74c3c;">
|
|
Delete
|
|
</button>
|
|
</div>
|
|
|
|
<div id="delete-modal-help" style="display: none; margin-top: 16px; padding: 12px; background: color-mix(in srgb, var(--muted) 10%, transparent); border-radius: 8px; font-size: 0.85rem; color: var(--muted);">
|
|
<div><strong>Remove:</strong> Remove from dashboard only (container keeps running)</div>
|
|
<div style="margin-top: 6px;"><strong>Delete:</strong> Full removal - stops container, removes DNS & Caddy config</div>
|
|
</div>
|
|
</div>
|
|
</div>`),injectModal("add-service-modal",`
|
|
<div id="add-service-modal" class="weather-modal">
|
|
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
|
|
<h3>Add Service</h3>
|
|
|
|
<!-- Service Type Tabs -->
|
|
<div style="display: flex; gap: 2px; margin-bottom: 16px; background: var(--card-bg); border-radius: 8px; padding: 3px; border: 1px solid var(--border);">
|
|
<label id="tab-local" style="flex: 1; text-align: center; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 500; background: var(--accent); color: var(--bg); transition: all 0.15s;">
|
|
<input type="radio" name="service-type" value="local" id="service-type-local" checked style="display: none;" />
|
|
Local
|
|
</label>
|
|
<label id="tab-external" style="flex: 1; text-align: center; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 500; color: var(--muted); transition: all 0.15s;">
|
|
<input type="radio" name="service-type" value="external" id="service-type-external" style="display: none;" />
|
|
External
|
|
</label>
|
|
</div>
|
|
<span id="service-type-description" style="display: none;"></span>
|
|
|
|
<!-- LOCAL SERVICE -->
|
|
<div id="local-service-config" style="display: grid; gap: 12px;">
|
|
<div>
|
|
<label for="service-name-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Name</label>
|
|
<input type="text" id="service-name-input" placeholder="e.g., Jellyfin" style="font-size: 1rem;" />
|
|
<div id="subdomain-preview" style="font-size: 0.75rem; color: var(--accent); margin-top: 4px; min-height: 1em;"></div>
|
|
</div>
|
|
|
|
<div class="grid-2col">
|
|
<div>
|
|
<label for="service-port-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Port</label>
|
|
<input type="number" id="service-port-input" placeholder="e.g., 8096" style="font-size: 1rem;" />
|
|
</div>
|
|
<div>
|
|
<label for="service-ip-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">IP Address</label>
|
|
<input type="text" id="service-ip-input" placeholder="Auto-detected" style="font-size: 1rem;" />
|
|
<div class="quick-ip-buttons" style="display: flex; gap: 4px; margin-top: 4px; flex-wrap: wrap;">
|
|
<button type="button" class="quick-ip-btn" data-ip="127.0.0.1" title="Localhost" style="font-size: 0.7rem; padding: 2px 6px;">localhost</button>
|
|
<button type="button" class="quick-ip-btn" data-ip="" id="quick-ip-lan" title="LAN IP" style="font-size: 0.7rem; padding: 2px 6px;">LAN</button>
|
|
<button type="button" class="quick-ip-btn" data-ip="" id="quick-ip-tailscale" title="Tailscale IP" style="font-size: 0.7rem; padding: 2px 6px;">Tailscale</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Options (collapsed by default) -->
|
|
<details id="local-advanced-options">
|
|
<summary style="cursor: pointer; color: var(--accent); font-size: 0.8rem; user-select: none;">Options</summary>
|
|
<div style="margin-top: 10px; display: grid; gap: 10px; font-size: 0.8rem;">
|
|
|
|
<div class="grid-2col">
|
|
<div>
|
|
<label for="service-subdomain-input">Subdomain:</label>
|
|
<input type="text" id="service-subdomain-input" placeholder="auto-derived from name" />
|
|
</div>
|
|
<div>
|
|
<label for="service-logo-input">Logo URL:</label>
|
|
<input type="text" id="service-logo-input" placeholder="/assets/name.png" />
|
|
</div>
|
|
</div>
|
|
|
|
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; align-items: start;">
|
|
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
|
|
<input type="checkbox" id="create-dns-record" checked />
|
|
Create DNS Record
|
|
</label>
|
|
<div>
|
|
<label for="ssl-type-select">SSL:</label>
|
|
<select id="ssl-type-select" style="width: 100%;">
|
|
<option value="caddy-managed">Caddy Managed (Internal)</option>
|
|
<option value="letsencrypt">Let's Encrypt</option>
|
|
<option value="existing-ca">Existing CA</option>
|
|
<option value="custom-ca">Custom CA</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="dns-config">
|
|
<div class="grid-2col">
|
|
<div>
|
|
<label for="dns-ttl-input">DNS TTL:</label>
|
|
<input type="number" id="dns-ttl-input" value="300" />
|
|
</div>
|
|
<div>
|
|
<label for="caddyfile-path-input">Caddyfile Path:</label>
|
|
<input type="text" id="caddyfile-path-input" value="C:\\caddy\\Caddyfile" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="existing-ca-config" style="display: none;">
|
|
<label for="existing-ca-select">Existing CA:</label>
|
|
<div class="flex-row-gap">
|
|
<select id="existing-ca-select" style="flex: 1;">
|
|
<option value="">Loading CAs...</option>
|
|
</select>
|
|
<button type="button" id="refresh-cas" style="padding: 4px 8px; font-size: 0.75rem;">\u{1F504}</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="custom-ca-config" style="display: none;">
|
|
<label for="ca-name-input">CA Name:</label>
|
|
<input type="text" id="ca-name-input" placeholder="e.g., sami-ca" />
|
|
</div>
|
|
|
|
<div id="manual-tailscale-status" style="padding: 6px 10px; background: var(--card-bg); border-radius: 6px; font-size: 0.75rem;">
|
|
<span style="color: var(--muted);">Checking Tailscale...</span>
|
|
</div>
|
|
<label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
|
|
<input type="checkbox" id="manual-tailscale-only" />
|
|
Tailscale-Only Access
|
|
</label>
|
|
|
|
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
|
|
<input type="checkbox" id="reload-caddy" checked />
|
|
Reload Caddy after adding
|
|
</label>
|
|
|
|
<!-- Category -->
|
|
<div>
|
|
<label for="service-category-input" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Category</label>
|
|
<select id="service-category-input" data-role="service-category" style="width: 100%;">
|
|
<option value="">\u2014 No category \u2014</option>
|
|
</select>
|
|
<div style="font-size: 0.7rem; color: var(--muted); margin-top: 3px;">Group services on the dashboard by purpose (Media, Productivity, etc.)</div>
|
|
</div>
|
|
|
|
<hr style="border: none; border-top: 1px solid var(--border); margin: 4px 0;" />
|
|
|
|
<div class="grid-2col">
|
|
<div>
|
|
<label class="field-label-sm">
|
|
<input type="checkbox" id="enable-auth" />
|
|
Authentication
|
|
</label>
|
|
<label class="field-label-sm">
|
|
<input type="checkbox" id="enable-cors" />
|
|
CORS Headers
|
|
</label>
|
|
<label for="upstream-path-input">Upstream Path:</label>
|
|
<input type="text" id="upstream-path-input" value="/" />
|
|
</div>
|
|
<div>
|
|
<label for="health-check-input">Health Check:</label>
|
|
<input type="text" id="health-check-input" placeholder="/health" />
|
|
<label for="timeout-input">Timeout (s):</label>
|
|
<input type="number" id="timeout-input" value="30" />
|
|
<label for="custom-headers-input">Headers (JSON):</label>
|
|
<textarea id="custom-headers-input" placeholder='{"X-Custom": "value"}' rows="2" style="font-size: 0.7rem;"></textarea>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</details>
|
|
</div>
|
|
|
|
<!-- EXTERNAL SERVICE -->
|
|
<div id="external-service-config" style="display: none;">
|
|
<div style="display: grid; gap: 12px;">
|
|
<div>
|
|
<label for="external-service-name" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Name</label>
|
|
<input type="text" id="external-service-name" placeholder="e.g., Radarr (Seedhost)" style="font-size: 1rem;" />
|
|
<div id="external-subdomain-preview" style="font-size: 0.75rem; color: var(--accent); margin-top: 4px; min-height: 1em;"></div>
|
|
</div>
|
|
|
|
<div>
|
|
<label for="external-service-url" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">External URL</label>
|
|
<input type="url" id="external-service-url" placeholder="https://username.seedhost.eu/radarr" style="font-size: 1rem;" />
|
|
</div>
|
|
|
|
<!-- Options (collapsed by default) -->
|
|
<details id="external-advanced-options">
|
|
<summary style="cursor: pointer; color: var(--accent); font-size: 0.8rem; user-select: none;">Options</summary>
|
|
<div style="margin-top: 10px; display: grid; gap: 10px; font-size: 0.8rem;">
|
|
|
|
<div class="grid-2col">
|
|
<div>
|
|
<label for="external-service-subdomain">Subdomain:</label>
|
|
<input type="text" id="external-service-subdomain" placeholder="auto-derived from name" />
|
|
<span id="external-domain-preview" style="font-size: 0.7rem; color: var(--accent);"></span>
|
|
</div>
|
|
<div>
|
|
<label for="external-service-logo">Logo URL:</label>
|
|
<input type="text" id="external-service-logo" placeholder="/assets/name.png" />
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<label for="external-service-icon">Icon Emoji:</label>
|
|
<input type="text" id="external-service-icon" placeholder="\u{1F3AC}" maxlength="2" style="width: 60px;" />
|
|
</div>
|
|
|
|
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
|
|
<input type="checkbox" id="external-create-dns" checked />
|
|
Create DNS Record
|
|
</label>
|
|
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
|
|
<input type="checkbox" id="external-create-caddy" checked />
|
|
Create Caddy Reverse Proxy
|
|
</label>
|
|
|
|
<div>
|
|
<label for="external-proxy-ip">Proxy Server IP:</label>
|
|
<input type="text" id="external-proxy-ip" placeholder="Auto-detected" />
|
|
</div>
|
|
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
|
|
<input type="checkbox" id="external-preserve-host" checked />
|
|
Preserve Host Header
|
|
</label>
|
|
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer;">
|
|
<input type="checkbox" id="external-follow-redirects" checked />
|
|
Follow Redirects
|
|
</label>
|
|
|
|
<!-- Category (external) -->
|
|
<div>
|
|
<label for="external-service-category" style="font-size: 0.8rem; color: var(--muted); margin-bottom: 4px; display: block;">Category</label>
|
|
<select id="external-service-category" data-role="service-category" style="width: 100%;">
|
|
<option value="">\u2014 No category \u2014</option>
|
|
</select>
|
|
</div>
|
|
|
|
</div>
|
|
</details>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="weather-modal-buttons" style="margin-top: 16px; display: flex; gap: 8px; justify-content: flex-end;">
|
|
<button id="add-service-cancel">Cancel</button>
|
|
<button id="add-service-create" class="btn-accent">Create Service</button>
|
|
</div>
|
|
</div>
|
|
</div>`)})(),(function(){async function c(m){try{const b=await fetch(`/api/v1/caddy/cas?caddyfilePath=${encodeURIComponent(m)}`);if(!b.ok)throw new Error(`Failed to load CAs: ${b.status}`);const r=await b.json();if(r.success){const v=document.getElementById("existing-ca-select");return v.innerHTML="",r.cas.length===0?v.innerHTML='<option value="">No CAs found in Caddyfile</option>':(v.innerHTML='<option value="">Select existing CA...</option>',r.cas.forEach(d=>{const o=document.createElement("option");typeof d=="object"?(o.value=d.id,o.textContent=d.displayName||d.name):(o.value=d,o.textContent=d),v.appendChild(o)})),r.data.cas}else throw new Error(r.message)}catch(b){console.error("Error loading CAs:",b);const r=document.getElementById("existing-ca-select");return r.innerHTML='<option value="">Error loading CAs</option>',[]}}function a(m){const{subdomain:b,port:r,ip:v,sslType:d,caName:o,existingCa:p,enableAuth:s,enableCors:e,customHeaders:n,upstreamPath:l,healthCheck:t,timeout:i,tailscaleOnly:y}=m;let u=`${buildDomain(b)} {
|
|
`;switch(y&&(u+=` @blocked not remote_ip 100.64.0.0/10
|
|
`,u+=` respond @blocked "Access denied. Tailscale connection required." 403
|
|
`),d){case"letsencrypt":break;case"caddy-managed":u+=` tls internal
|
|
`;break;case"existing-ca":p&&(u+=` tls {
|
|
ca ${p}
|
|
}
|
|
`);break;case"custom-ca":o&&(u+=` tls {
|
|
ca ${o}
|
|
}
|
|
`);break}if(s&&(u+=` basicauth {
|
|
admin $2a$14$hashed_password_here
|
|
}
|
|
`),e&&(u+=` header {
|
|
`,u+=` Access-Control-Allow-Origin "*"
|
|
`,u+=` Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
|
|
`,u+=` Access-Control-Allow-Headers "Content-Type, Authorization"
|
|
`,u+=` }
|
|
`),n)try{const w=JSON.parse(n);u+=` header {
|
|
`,Object.entries(w).forEach(([T,L])=>{u+=` ${T} "${L}"
|
|
`}),u+=` }
|
|
`}catch{console.warn("Invalid JSON in custom headers")}return t&&(u+=` health_uri ${t}
|
|
`),u+=` reverse_proxy ${v}:${r} {
|
|
`,l&&l!=="/"&&(u+=` rewrite ${l}
|
|
`),i&&i!==30&&(u+=` transport http {
|
|
`,u+=` dial_timeout ${i}s
|
|
`,u+=` response_header_timeout ${i}s
|
|
`,u+=` }
|
|
`),u+=` }
|
|
`,u+=`}
|
|
`,u}async function f(m,b,r=DC.DEFAULTS.TTL){const v=window.getToken(getPrimaryDnsId(),"admin");if(!v)throw new Error("DNS admin token not configured. Please set it in the Tokens menu.");const d=buildDomain(m),o=await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:d,ip:b,ttl:r,token:v,server:SITE.dnsIp})});if(!o.ok){const s=await o.text();throw new Error(`DNS API Error: ${o.status} - ${s}`)}const p=await o.json();if(!p.success)throw new Error(`DNS Error: ${p.error||"Unknown error"}`);return p}async function h(m){const b={id:m.subdomain,name:m.name,logo:m.logo||`/assets/${m.subdomain}.png`};m.category&&(b.category=m.category),m.containerId&&(b.containerId=m.containerId);try{const r=await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)});if(!r.ok){const v=await r.json();throw new Error(v.error||"Failed to save service")}return await window.loadServices(),window.buildGrid(),b}catch(r){throw console.error("Failed to add service to config:",r),r}}async function g(m){const b=document.getElementById("service-subdomain-input").value.trim(),r=document.getElementById("service-ip-input").value.trim()||"localhost",v=document.getElementById("service-port-input").value.trim()||"80",d=await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(b),upstream:`${r}:${v}`,config:m})}),o=await d.json();if(!d.ok||!o.success)throw new Error(o.error||`Caddy API Error: ${d.status}`);return o}window.loadExistingCAs=c,window.generateCaddyConfig=a,window.createDnsRecord=f,window.addServiceToConfig=h,window.addToCaddyfile=g})(),(function(){let c=null;function a(r){c=r;const v=document.getElementById("service-edit-modal");document.getElementById("service-edit-title").textContent=`Edit ${r.name}`,document.getElementById("edit-service-name").value=r.name,document.getElementById("edit-service-url-display").textContent=r.url||buildServiceUrl(r.id),document.getElementById("edit-service-logo-preview").src=r.logo||`/assets/${r.id}.png`,document.getElementById("edit-subdomain").value=r.id,document.getElementById("edit-port").value=r.port||"",document.getElementById("edit-ip").value=r.ip||"localhost",document.getElementById("edit-tailscale-only").checked=r.tailscaleOnly||!1,document.getElementById("edit-logo-url").value=r.logo||"";const d=document.getElementById("edit-service-category");d&&(d.dataset.current=r.category||"",typeof window.populateCategorySelects=="function"&&window.populateCategorySelects()),v.classList.add("show")}function f(){closeModal("service-edit-modal"),c=null}async function h(){if(!c)return;const r=document.getElementById("edit-subdomain").value.trim().toLowerCase(),v=document.getElementById("edit-service-name").value.trim(),d=document.getElementById("edit-port").value.trim(),o=document.getElementById("edit-ip").value.trim()||"localhost",p=document.getElementById("edit-tailscale-only").checked,s=document.getElementById("edit-logo-url").value.trim(),e=document.getElementById("edit-service-category")?.value||"";if(!r){showNotification("Subdomain is required","warning");return}const n=c.id,l=[];if(r!==n&&l.push("subdomain"),v&&v!==c.name&&l.push("name"),d&&d!==String(c.port)&&l.push("port"),o!==c.ip&&l.push("ip"),p!==(c.tailscaleOnly||!1)&&l.push("tailscale"),s&&s!==c.logo&&l.push("logo"),e!==(c.category||"")&&l.push("category"),l.length===0){f();return}const t=document.getElementById("service-edit-save");t.textContent="Saving...",t.disabled=!0;try{const y=await(await secureFetch("/api/v1/services/update",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubdomain:n,newSubdomain:r,name:v||c.name,port:d||c.port,ip:o,tailscaleOnly:p,logo:s||void 0,category:e})})).json();if(!y.success)throw new Error(y.error||"Failed to update service");const u=window.APPS.findIndex(w=>w.id===n);u!==-1&&(window.APPS[u]={...window.APPS[u],id:r,name:v||window.APPS[u].name,port:d||window.APPS[u].port,ip:o,tailscaleOnly:p,logo:s||window.APPS[u].logo,category:e||void 0}),f(),window.buildGrid(),window.refreshAll()}catch(i){console.error("Error saving service changes:",i),showNotification(`Error saving changes: ${i.message}`,"error")}finally{t.textContent="Save Changes",t.disabled=!1}}document.getElementById("edit-logo-file")?.addEventListener("change",async r=>{const v=r.target.files[0];if(!v)return;if(!v.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const d=new FileReader;d.onload=async o=>{const p=o.target.result;if(document.getElementById("edit-service-logo-preview").src=p,document.getElementById("edit-logo-url").value=p,c)try{const e=await(await secureFetch("/api/v1/assets/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({filename:`${c.id}.png`,data:p})})).json();e.success&&e.path&&(document.getElementById("edit-logo-url").value=e.path)}catch{}},d.readAsDataURL(v)}),document.getElementById("service-edit-cancel")?.addEventListener("click",f),document.getElementById("service-edit-save")?.addEventListener("click",h),document.getElementById("service-edit-modal")?.addEventListener("click",r=>{r.target.id==="service-edit-modal"&&f()});function g(r,v,d){return new Promise(o=>{const p=document.getElementById("delete-service-modal"),s=document.getElementById("delete-modal-title"),e=document.getElementById("delete-modal-message"),n=document.getElementById("delete-modal-container-info"),l=document.getElementById("delete-modal-container-name"),t=document.getElementById("delete-modal-help"),i=document.getElementById("delete-modal-cancel"),y=document.getElementById("delete-modal-remove"),u=document.getElementById("delete-modal-delete");s.textContent=`Delete "${r}"`,v?(e.innerHTML="This service has an associated Docker container.<br>Choose how to proceed:",n.style.display="block",l.textContent=`Container ID: ${d?.slice(0,12)||"Unknown"}`,t.style.display="block",u.style.display="block"):(e.textContent="Remove this service from the dashboard?",n.style.display="none",t.style.display="none",u.style.display="none");const w=()=>{p.classList.remove("show"),i.removeEventListener("click",T),y.removeEventListener("click",L),u.removeEventListener("click",P),p.removeEventListener("click",C)},T=()=>{w(),o(null)},L=()=>{w(),o(!1)},P=()=>{w(),o(!0)},C=B=>{B.target===p&&(w(),o(null))};i.addEventListener("click",T),y.addEventListener("click",L),u.addEventListener("click",P),p.addEventListener("click",C),p.classList.add("show")})}async function m(r,v,d){const o=document.getElementById(`update-btn-${d}`),p=o?.textContent;if(confirm(`Update ${v} to the latest version?
|
|
|
|
This will:
|
|
1. Pull the latest image
|
|
2. Stop the container
|
|
3. Recreate with same settings
|
|
|
|
The service will be briefly unavailable.`))try{o&&(o.textContent="\u{1F504}",o.disabled=!0,o.title="Updating...");const e=await(await secureFetch(`/api/v1/containers/${r}/update`,{method:"POST"})).json();if(e.success){const n=window.APPS.find(l=>l.id===d);n&&e.newContainerId&&(n.containerId=e.newContainerId),o&&(o.textContent="\u2705",o.title="Updated successfully!",setTimeout(()=>{o.textContent=p,o.disabled=!1,o.title="Update container to latest version"},3e3)),setTimeout(()=>window.refreshAll(),2e3),showNotification(`${v} updated successfully!`,"success")}else throw new Error(e.error||"Update failed")}catch(s){console.error("Update error:",s),o&&(o.textContent="\u274C",o.title="Update failed",setTimeout(()=>{o.textContent=p,o.disabled=!1,o.title="Update container to latest version"},3e3)),showNotification(`Failed to update ${v}: ${s.message}`,"error")}}async function b(r,v){const d=window.APPS.find(u=>u.id===r),o=d?buildDomain(d.id):null,p=d?.containerId,s=await g(v||r,p,d?.containerId);if(s===null)return;let e={dashboard:!1,container:null,dns:null,caddy:null,service:null};if(s&&p)try{const u=new URLSearchParams({containerId:d.containerId,subdomain:d.id,ip:d.ip||"localhost",deleteContainer:"true"}),T=await(await secureFetch(`/api/v1/apps/${encodeURIComponent(d.id)}?${u.toString()}`,{method:"DELETE"})).json();T.success?e={...e,...T.results,dashboard:!1}:console.error("App removal failed:",T.error)}catch(u){console.error("App removal error:",u)}else if(s&&o){try{const u=d?.ip||"localhost",T=await(await secureFetch(`/api/v1/dns/record?domain=${encodeURIComponent(o)}&type=A&ipAddress=${encodeURIComponent(u)}&server=${SITE.dnsIp}`,{method:"DELETE"})).json();e.dns=T.success?"deleted":T.error||"failed"}catch(u){e.dns=u.message}try{const w=await(await secureFetch(`/api/v1/site/${encodeURIComponent(o)}`,{method:"DELETE"})).json();e.caddy=w.success||w.error&&w.error.includes("not found")?"removed":w.error||"failed"}catch(u){e.caddy=u.message}}const n=window.APPS.findIndex(u=>u.id===r);n>-1&&(window.APPS.splice(n,1),e.dashboard=!0);try{const u=safeGetJSON("custom-apps",[]),w=u.findIndex(T=>T.id===r);w>-1&&(u.splice(w,1),safeSet("custom-apps",JSON.stringify(u)))}catch{}try{const w=await(await secureFetch(`/api/v1/services/${encodeURIComponent(r)}`,{method:"DELETE"})).json();e.service=w.success?"removed":w.error||"failed"}catch(u){e.service=u.message}window.buildGrid(),window.refreshAll();let l=!1,t=[];e.dashboard||(l=!0,t.push("\u2717 Failed to remove from dashboard"));const i=["removed","already removed","not found","deleted","kept (user choice)","skipped","no such record","does not exist"],y=u=>!u||i.some(w=>u.toLowerCase().includes(w.toLowerCase()));e.container&&!y(e.container)&&(l=!0,t.push(`\u26A0 Container: ${e.container}`)),e.dns&&!y(e.dns)&&(l=!0,t.push(`\u26A0 DNS Record: ${e.dns}`)),e.caddy&&!y(e.caddy)&&(l=!0,t.push(`\u26A0 Caddy Config: ${e.caddy}`)),e.service&&!y(e.service)&&(l=!0,t.push(`\u26A0 Service File: ${e.service}`)),l&&showNotification(`Error deleting "${v||r}": ${t.join(", ")}`,"error",6e3)}window.openServiceEditModal=a,window.showDeleteModal=g,window.updateContainer=m,window.deleteService=b})(),(function(){function c(e){return e.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"")}function a(){return SITE.defaults?.sslType||(SITE.configurationType==="public"?"letsencrypt":"caddy-managed")}function f(){const e=document.getElementById("service-subdomain-input").value||"subdomain",n=document.getElementById("service-ip-input").value||h.lan||"localhost",l=document.getElementById("service-port-input").value||DC.DEFAULTS.SERVICE_PORT,t=document.getElementById("ssl-type-select").value,i=document.getElementById("ca-name-input").value||"sami-ca",y=document.getElementById("existing-ca-select").value,u=document.getElementById("enable-auth").checked,w=document.getElementById("enable-cors").checked,T=document.getElementById("custom-headers-input").value,L=document.getElementById("upstream-path-input").value||"/",P=document.getElementById("health-check-input").value,C=document.getElementById("timeout-input").value||30,B=document.getElementById("dns-preview");B&&(B.textContent=`${buildDomain(e)} \u2192 ${n}`);const $=document.getElementById("url-preview");$&&($.textContent=buildServiceUrl(e));const k={subdomain:e,port:l,ip:n,sslType:t,caName:i,existingCa:y,enableAuth:u,enableCors:w,customHeaders:T,upstreamPath:L,healthCheck:P,timeout:C},x=window.generateCaddyConfig(k),I=document.getElementById("caddy-config-preview");I&&(I.value=x)}const h={localhost:"127.0.0.1",lan:"",tailscale:""};async function g(){try{const t=await fetch("/api/v1/network/ips",{signal:AbortSignal.timeout(2e3)});if(t.ok){const i=await t.json();i.lan&&(h.lan=i.lan),i.tailscale&&(h.tailscale=i.tailscale)}}catch{}const e=document.getElementById("quick-ip-lan"),n=document.getElementById("quick-ip-tailscale");e&&(h.lan?(e.dataset.ip=h.lan,e.textContent=`LAN (${h.lan})`,e.title=`LAN IP: ${h.lan}`):e.style.display="none"),n&&(h.tailscale?(n.dataset.ip=h.tailscale,n.textContent=`Tailscale (${h.tailscale})`,n.title=`Tailscale IP: ${h.tailscale}`):n.style.display="none");const l=document.getElementById("service-ip-input");l&&!l.value&&h.lan&&(l.value=h.lan)}function m(){document.querySelectorAll(".quick-ip-btn").forEach(e=>{e.addEventListener("click",()=>{const n=e.dataset.ip;n&&(document.getElementById("service-ip-input").value=n,document.querySelectorAll(".quick-ip-btn").forEach(l=>l.classList.remove("active")),e.classList.add("active"),f())})}),document.getElementById("service-ip-input")?.addEventListener("input",e=>{const n=e.target.value;document.querySelectorAll(".quick-ip-btn").forEach(l=>{l.classList.toggle("active",l.dataset.ip===n)})})}async function b(){const e=document.getElementById("add-service-modal");e.classList.add("show");const n=e.querySelector(".weather-modal-content");n&&(n.scrollTop=0),document.body.style.overflow="hidden";const l=document.getElementById("ssl-type-select");l&&(l.value=a()),await g();const t=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(t);const i=document.getElementById("manual-tailscale-status"),y=document.getElementById("manual-tailscale-only");try{const w=await(await fetch("/api/v1/tailscale/status")).json();w.success&&w.installed&&w.connected?(i.innerHTML=`
|
|
<span style="color: #4caf50;">\u2713 Connected</span>
|
|
<span style="color: var(--muted); margin-left: 6px;">${w.self?.hostname} (${w.self?.ip})</span>
|
|
`,y.disabled=!1):w.installed?(i.innerHTML='<span style="color: #ff9800;">\u26A0 Not connected</span>',y.disabled=!0):(i.innerHTML='<span style="color: var(--muted);">Not available</span>',y.disabled=!0)}catch{i.innerHTML='<span style="color: var(--muted);">Could not check</span>',y.disabled=!0}y.checked=!1,f()}function r(){const e=document.getElementById("service-type-local"),n=document.getElementById("service-type-external"),l=document.getElementById("local-service-config"),t=document.getElementById("external-service-config"),i=document.getElementById("tab-local"),y=document.getElementById("tab-external");function u(){e.checked?(l.style.display="grid",t.style.display="none",i&&(i.style.background="var(--accent)",i.style.color="var(--bg)"),y&&(y.style.background="transparent",y.style.color="var(--muted)")):(l.style.display="none",t.style.display="block",y&&(y.style.background="var(--accent)",y.style.color="var(--bg)"),i&&(i.style.background="transparent",i.style.color="var(--muted)"))}e?.addEventListener("change",u),n?.addEventListener("change",u)}function v(){const e=document.getElementById("service-name-input"),n=document.getElementById("service-subdomain-input"),l=document.getElementById("subdomain-preview");let t=!1;e?.addEventListener("input",()=>{const L=c(e.value);!t&&n&&(n.value=L),l&&(l.textContent=L?`\u2192 ${buildDomain(L)}`:""),f()}),n?.addEventListener("input",()=>{t=n.value!==c(e?.value||"");const L=n.value.trim()||c(e?.value||"");l&&(l.textContent=L?`\u2192 ${buildDomain(L)}`:""),f()});const i=document.getElementById("external-service-name"),y=document.getElementById("external-service-subdomain"),u=document.getElementById("external-subdomain-preview"),w=document.getElementById("external-domain-preview");let T=!1;i?.addEventListener("input",()=>{const L=c(i.value);!T&&y&&(y.value=L);const P=y?.value||L;u&&(u.textContent=P?`\u2192 ${buildDomain(P)}`:""),w&&(w.textContent=P?buildDomain(P):"")}),y?.addEventListener("input",()=>{T=y.value!==c(i?.value||"");const L=y.value.trim()||c(i?.value||"");u&&(u.textContent=L?`\u2192 ${buildDomain(L)}`:""),w&&(w.textContent=L?buildDomain(L):"")})}async function d(){const e=document.getElementById("external-service-name").value.trim(),n=document.getElementById("external-service-url").value.trim(),l=(document.getElementById("external-service-subdomain").value.trim()||c(e)).toLowerCase(),t=document.getElementById("external-service-logo").value.trim(),i=document.getElementById("external-service-icon").value.trim(),y=document.getElementById("external-create-dns").checked,u=document.getElementById("external-create-caddy").checked,w=document.getElementById("external-proxy-ip").value.trim()||SITE.dnsIp||"localhost",T=document.getElementById("external-preserve-host").checked,L=document.getElementById("external-follow-redirects").checked,P=document.getElementById("external-service-category")?.value||"";if(!e||!n){showNotification("Please fill in Name and External URL","warning");return}if(!l){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(!n.startsWith("http://")&&!n.startsWith("https://")){showNotification("External URL must start with http:// or https://","warning");return}const C=buildDomain(l);try{const B={dns:null,caddy:null,dashboard:!1};if(y)if(window.getToken(getPrimaryDnsId(),"admin"))try{const A=await(await secureFetch("/api/v1/dns/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:C,ip:w,ttl:DC.DEFAULTS.TTL,server:SITE.dnsIp})})).json();B.dns=A.success?"created":A.error||"failed"}catch(S){B.dns=S.message}else B.dns="no admin token (configure in \u{1F511} Tokens)";if(u)try{const E={subdomain:l,externalUrl:n,preserveHost:T,followRedirects:L,sslType:"caddy-managed",caddyfilePath:DC.DEFAULTS.CADDYFILE,reloadCaddy:!0},A=await(await secureFetch("/api/v1/site/external",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(E)})).json();B.caddy=A.success?"created":A.error||"failed"}catch(E){B.caddy=E.message}const $={id:l,name:e,url:`https://${C}`,externalUrl:n,logo:t||i||"\u{1F310}",isExternal:!0,isCustom:!0};P&&($.category=P),window.APPS.push($),B.dashboard=!0;const k=["plex","router","chat","sync","torrent","radarr","sonarr","prowlarr","portainer","requests","jellyfin","emby"],x=window.APPS.filter(E=>!k.includes(E.id));safeSet("custom-services",JSON.stringify(x));try{await secureFetch("/api/v1/services",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(window.APPS)})}catch(E){console.warn("Failed to save to services.json:",E)}window.buildGrid(),window.refreshAll(),o();const I=[`External service "${e}" added!`];y&&I.push(`DNS: ${B.dns==="created"?"\u2713":"\u26A0 "+B.dns}`),u&&I.push(`Caddy: ${B.caddy==="created"?"\u2713":"\u26A0 "+B.caddy}`),I.push(`Access at: https://${C}`),showNotification(I.join(" | "),"success",6e3)}catch(B){console.error("Failed to create external service:",B),showNotification(`Failed to create external service: ${B.message}`,"error")}}function o(){closeModal("add-service-modal"),document.body.style.overflow="",document.getElementById("service-name-input").value="",document.getElementById("service-subdomain-input").value="",document.getElementById("service-port-input").value="",document.getElementById("service-ip-input").value=h.lan||"",document.getElementById("service-logo-input").value="",document.getElementById("dns-ttl-input").value=DC.DEFAULTS.TTL,document.getElementById("ssl-type-select").value=a(),document.getElementById("ca-name-input").value="",document.getElementById("enable-auth").checked=!1,document.getElementById("enable-cors").checked=!1,document.getElementById("custom-headers-input").value="",document.getElementById("upstream-path-input").value="/",document.getElementById("health-check-input").value="",document.getElementById("timeout-input").value="30";const e=document.getElementById("subdomain-preview");e&&(e.textContent="");const n=document.getElementById("external-subdomain-preview");n&&(n.textContent="");const l=document.getElementById("external-service-name");l&&(l.value="");const t=document.getElementById("external-service-subdomain");t&&(t.value="");const i=document.getElementById("external-service-url");i&&(i.value="");const y=document.getElementById("external-service-logo");y&&(y.value="");const u=document.getElementById("external-service-icon");u&&(u.value="");const w=document.getElementById("local-advanced-options");w&&w.removeAttribute("open");const T=document.getElementById("external-advanced-options");T&&T.removeAttribute("open");const L=document.getElementById("service-type-local");L&&(L.checked=!0);const P=document.getElementById("local-service-config"),C=document.getElementById("external-service-config");P&&(P.style.display="grid"),C&&(C.style.display="none");const B=document.getElementById("tab-local"),$=document.getElementById("tab-external");B&&(B.style.background="var(--accent)",B.style.color="var(--bg)"),$&&($.style.background="transparent",$.style.color="var(--muted)")}async function p(){const e=document.getElementById("service-name-input").value.trim(),n=(document.getElementById("service-subdomain-input").value.trim()||c(e)).toLowerCase(),l=document.getElementById("service-port-input").value.trim(),t=document.getElementById("service-ip-input").value.trim(),i=document.getElementById("service-logo-input").value.trim(),y=document.getElementById("create-dns-record").checked,u=parseInt(document.getElementById("dns-ttl-input").value)||DC.DEFAULTS.TTL,w=document.getElementById("manual-tailscale-only")?.checked||!1,T=document.getElementById("ssl-type-select")?.value||"caddy-managed",L=document.getElementById("ca-name-input")?.value||"",P=document.getElementById("existing-ca-select")?.value||"",C=document.getElementById("enable-auth")?.checked||!1,B=document.getElementById("enable-cors")?.checked||!1,$=document.getElementById("custom-headers-input")?.value||"",k=document.getElementById("upstream-path-input")?.value||"/",x=document.getElementById("health-check-input")?.value||"",I=document.getElementById("timeout-input")?.value||30,S=(document.getElementById("service-category-input")||document.getElementById("external-service-category"))?.value||"",A=window.getToken(getPrimaryDnsId(),"admin");if(!e||!l||!t){showNotification("Please fill in Name, Port, and IP Address","warning");return}if(!n){showNotification("Could not derive subdomain from name. Please set one in Options.","warning");return}if(y&&!A){showNotification("DNS Admin token required. Configure it in the Tokens menu first.","warning");return}const D={dns:null,caddy:null,dashboard:!1};try{if(y)try{await window.createDnsRecord(n,t,u),D.dns="created"}catch(N){throw console.error("DNS creation failed:",N),D.dns=N.message,new Error(`DNS creation failed: ${N.message}`)}else D.dns="skipped";const O=window.generateCaddyConfig({subdomain:n,port:l,ip:t,sslType:T,caName:L,existingCa:P,enableAuth:C,enableCors:B,customHeaders:$,upstreamPath:k,healthCheck:x,timeout:I,tailscaleOnly:w});try{const U=await(await secureFetch("/api/v1/site",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({domain:buildDomain(n),upstream:`${t}:${l}`,config:O})})).json();if(U.success)D.caddy="added & reloaded";else throw console.error("Caddy configuration failed:",U.error),D.caddy=U.error||"failed",new Error(`Caddy configuration failed: ${U.error}`)}catch(N){throw console.error("Caddy API error:",N),D.caddy=N.message,new Error(`Caddy API error: ${N.message}`)}const M={name:e,subdomain:n,port:l,ip:t,logo:i||`/assets/${n}.png`,tailscaleOnly:w||!1};S&&(M.category=S),await window.addServiceToConfig(M),D.dashboard=!0;const R=[`DNS: ${D.dns==="created"?"\u2713":D.dns==="skipped"?"\u25CB":"\u2717"}`,`Caddy: ${D.caddy==="added & reloaded"?"\u2713":"\u2717"}`,`Dashboard: ${D.dashboard?"\u2713":"\u2717"}`];showNotification(`Service "${e}" created! ${R.join(" | ")} \u2014 ${buildServiceUrl(n)}${w?" (Tailscale)":""}`,"success",6e3),o(),window.buildGrid(),window.refreshAll()}catch(O){console.error("Error creating service:",O),showNotification(`Error creating "${e}": ${O.message}`,"error",6e3)}}document.getElementById("add-service")?.addEventListener("click",b),document.getElementById("add-service-cancel")?.addEventListener("click",o),document.getElementById("add-service-create")?.addEventListener("click",()=>{document.querySelector('input[name="service-type"]:checked')?.value==="external"?d():p()}),r(),v(),m(),document.getElementById("ssl-type-select")?.addEventListener("change",e=>{const n=document.getElementById("existing-ca-config"),l=document.getElementById("custom-ca-config");n.style.display="none",l.style.display="none",e.target.value==="existing-ca"?n.style.display="block":e.target.value==="custom-ca"&&(l.style.display="block"),f()}),document.getElementById("refresh-cas")?.addEventListener("click",async()=>{const e=document.getElementById("refresh-cas"),n=e.textContent;e.textContent="\u231B Loading...",e.disabled=!0;try{const l=document.getElementById("caddyfile-path-input").value||DC.DEFAULTS.CADDYFILE;await window.loadExistingCAs(l),e.textContent="\u2705 Refreshed"}catch(l){e.textContent="\u274C Failed",console.error("Failed to refresh CAs:",l)}setTimeout(()=>{e.textContent=n,e.disabled=!1},2e3)}),document.getElementById("create-dns-record")?.addEventListener("change",e=>{const n=document.getElementById("dns-config");n.style.display=e.target.checked?"block":"none"}),["service-subdomain-input","service-ip-input","service-port-input","ca-name-input","existing-ca-select","enable-auth","enable-cors","custom-headers-input","upstream-path-input","health-check-input","timeout-input"].forEach(e=>{const n=document.getElementById(e);n&&(n.addEventListener("input",f),n.addEventListener("change",f))});function s(){const e=safeGet("custom-services");if(e)try{JSON.parse(e).forEach(l=>{window.APPS.find(t=>t.id===l.id)||window.APPS.push(l)})}catch(n){console.warn("Failed to load custom services:",n)}}s(),window.openAddServiceModal=b,window.closeAddServiceModal=o})(),(function(){let c=null,a=1e3;const f=3e4;function h(){if(c)try{c.close()}catch{}c=new EventSource("/api/v1/events/stream"),c.addEventListener("connected",()=>{a=1e3,debug("[SSE] Connected to event stream")}),c.addEventListener("status-change",g=>{try{const m=JSON.parse(g.data);if(m.serviceId&&typeof window.setBadge=="function"){const b=m.status==="up"||m.status==="healthy";window.setBadge(m.serviceId,b,m.responseTime||null)}}catch{}}),c.addEventListener("resource-alert",g=>{try{const m=JSON.parse(g.data),b=`${m.containerName||m.containerId}: ${m.metric} at ${m.value}% (threshold: ${m.threshold}%)`;typeof showNotification=="function"&&showNotification(b,"warning")}catch{}}),c.addEventListener("auto-restart",g=>{try{const m=JSON.parse(g.data);typeof showNotification=="function"&&showNotification(`Container "${m.containerName}" was auto-restarted`,"info")}catch{}}),c.addEventListener("update-available",g=>{try{const m=JSON.parse(g.data),b=document.getElementById("updates-btn");if(b&&!b.querySelector(".sse-dot")){const r=document.createElement("span");r.className="sse-dot",r.style.cssText="display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-left:6px;vertical-align:middle;",b.appendChild(r)}typeof showNotification=="function"&&showNotification(`Update available for ${m.containerName||m.containerId}`,"info")}catch{}}),c.addEventListener("update-complete",g=>{try{const m=JSON.parse(g.data);typeof showNotification=="function"&&showNotification(`Update completed: ${m.containerName||m.containerId}`,"success"),typeof window.refreshAll=="function"&&window.refreshAll()}catch{}}),c.addEventListener("update-failed",g=>{try{const m=JSON.parse(g.data);typeof showNotification=="function"&&showNotification(`Update failed: ${m.containerName||m.containerId} \u2014 ${m.error||"unknown error"}`,"error")}catch{}}),c.addEventListener("incident",g=>{try{const m=JSON.parse(g.data);typeof showNotification=="function"&&(m.type==="created"?showNotification(`Incident: ${m.message||m.serviceId}`,"error"):m.type==="resolved"&&showNotification(`Resolved: ${m.serviceId||"incident"}`,"success"))}catch{}}),c.onerror=()=>{c.close(),console.warn(`[SSE] Disconnected, reconnecting in ${a/1e3}s...`),setTimeout(h,a),a=Math.min(a*2,f)}}h(),window._sseReconnect=h})(),(function(){const c=document.getElementById("service-filter-search"),a=document.getElementById("service-filter-status"),f=document.getElementById("service-filter-category"),h=document.getElementById("service-filter-count");function g(){const v=new Set,d=new Set;document.querySelectorAll("#cards .card[data-category]").forEach(s=>{const e=s.dataset.category.trim();e&&d.add(e)});const o=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES||{};return Object.keys(o).concat([...d].filter(s=>!o[s])).forEach(s=>v.add(s)),{list:[...v],apiCats:o}}function m(){if(!f)return;const{list:v,apiCats:d}=g(),o=f.value;f.innerHTML='<option value="all">All Categories</option>',v.sort().forEach(p=>{const s=d[p],e=document.createElement("option");e.value=p,e.textContent=s?`${s.icon||""} ${p}`.trim():p,f.appendChild(e)}),o&&[...f.options].some(p=>p.value===o)?f.value=o:f.value="all"}function b(){m();const v=c.value.toLowerCase().trim(),d=a.value,o=f?f.value:"all",p=document.querySelectorAll("#cards .card");let s=0;if(p.forEach(e=>{const n=e.querySelector(".name")?.textContent?.toLowerCase()||"",l=e.dataset.app?.toLowerCase()||"",t=e.dataset.status||"off",i=e.dataset.category||"";(!v||n.includes(v)||l.includes(v))&&(d==="all"||t===d)&&(o==="all"||i===o)?(e.style.display="",s++):e.style.display="none"}),h){const e=p.length;h.textContent=`${s} of ${e} services`}}function r(v,d){let o;return function(...p){clearTimeout(o),o=setTimeout(()=>v.apply(this,p),d)}}c?.addEventListener("input",r(b,200)),a?.addEventListener("change",b),f?.addEventListener("change",b),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>setTimeout(b,500)):setTimeout(b,500),window.refreshServiceFilter=b,window.refreshCategoryDropdown=m})(),(function(){const c=document.getElementById("batch-operations-btn"),a=document.getElementById("batch-action-bar"),f=document.getElementById("batch-selected-count"),h=document.getElementById("batch-start-btn"),g=document.getElementById("batch-stop-btn"),m=document.getElementById("batch-restart-btn"),b=document.getElementById("batch-cancel-btn");let r=!1,v=new Set;function d(){r=!0,v.clear(),a.style.display="",c.textContent="\u2713 Exit Batch Mode",p(),document.querySelectorAll("#cards .card[data-app]").forEach(n=>{const l=n.dataset.containerId;if(!l)return;const t=n.querySelector(".batch-checkbox");t&&t.remove();const i=document.createElement("input");i.type="checkbox",i.className="batch-checkbox",i.dataset.containerId=l,i.dataset.serviceName=n.querySelector(".name")?.textContent||l,i.style.cssText="position: absolute; top: 8px; left: 8px; z-index: 10; width: 18px; height: 18px; cursor: pointer;",i.addEventListener("change",y=>{y.stopPropagation(),i.checked?v.add(l):v.delete(l),p()}),n.style.position="relative",n.insertBefore(i,n.firstChild)})}function o(){r=!1,v.clear(),a.style.display="none",c.textContent="\u2630 Batch Operations",document.querySelectorAll(".batch-checkbox").forEach(e=>e.remove())}function p(){const e=v.size;f.textContent=`${e} selected`,h.disabled=e===0,g.disabled=e===0,m.disabled=e===0}async function s(e){if(v.size===0)return;const n=Array.from(v),l={start:"Starting",stop:"Stopping",restart:"Restarting"}[e];if(!confirm(`${l} ${n.length} container(s)? This cannot be undone.`))return;const t=[h,g,m];t.forEach(w=>{w.disabled=!0,w.textContent="..."});let i=0,y=0;const u=[];for(const w of n)try{const T=await fetch(`/api/v1/containers/${encodeURIComponent(w)}/${e}`,{method:"POST"});if(T.ok)i++;else{y++;const L=await T.json().catch(()=>({}));u.push(`${w}: ${L.error||T.statusText}`)}}catch(T){y++,u.push(`${w}: ${T.message}`)}t[0].textContent="\u25B6 Start All",t[1].textContent="\u2B1B Stop All",t[2].textContent="\u{1F504} Restart All",p(),y===0?typeof showNotification=="function"&&showNotification(`${l} completed: ${i} container(s)`,"success"):(typeof showNotification=="function"&&showNotification(`${l}: ${i} succeeded, ${y} failed`,"warning"),console.error("Batch operation errors:",u)),setTimeout(()=>{typeof refreshAll=="function"&&refreshAll()},1500)}c?.addEventListener("click",()=>{r?o():d()}),h?.addEventListener("click",()=>s("start")),g?.addEventListener("click",()=>s("stop")),m?.addEventListener("click",()=>s("restart")),b?.addEventListener("click",o)})();
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBFcnJvciBIYW5kbGVyXG4gKiBIYW5kbGVzIGVycm9ycyBncmFjZWZ1bGx5IHdpdGhvdXQgYnJlYWtpbmcgdGhlIG9uYm9hcmRpbmcgdG91clxuICovXG5cbihmdW5jdGlvbih3aW5kb3cpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGNsYXNzIEVycm9ySGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgdGhpcy5tYXhFcnJvcnMgPSA1MDsgLy8gS2VlcCBsYXN0IDUwIGVycm9yc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciB3aXRob3V0IGJyZWFraW5nIHRoZSB0b3VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHQgLSBDb250ZXh0IHdoZXJlIGVycm9yIG9jY3VycmVkXG4gICAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCBvciBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1ldGFkYXRhIC0gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ0Vycm9yKGNvbnRleHQsIGVycm9yLCBtZXRhZGF0YSA9IHt9KSB7XG4gICAgICBjb25zdCBlcnJvckVudHJ5ID0ge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IG51bGwsXG4gICAgICAgIG1ldGFkYXRhXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgdG8gZXJyb3JzIGFycmF5XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yRW50cnkpO1xuXG4gICAgICAvLyBLZWVwIG9ubHkgbGFzdCBtYXhFcnJvcnNcbiAgICAgIGlmICh0aGlzLmVycm9ycy5sZW5ndGggPiB0aGlzLm1heEVycm9ycykge1xuICAgICAgICB0aGlzLmVycm9ycy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgdG8gY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihgW09uYm9hcmRpbmcgRXJyb3JdICR7Y29udGV4dH06YCwgZXJyb3IsIG1ldGFkYXRhKTtcblxuICAgICAgLy8gT3B0aW9uYWxseSBzZW5kIHRvIGVycm9yIHRyYWNraW5nIHNlcnZpY2VcbiAgICAgIC8vIHRoaXMuc2VuZFRvRXJyb3JUcmFja2luZyhlcnJvckVudHJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBhbiBlcnJvciBhbmQgY29udGludWUgdG91clxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RlcCAtIEN1cnJlbnQgc3RlcCBpbmRleFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJlY292ZXJ5IGFjdGlvblxuICAgICAqL1xuICAgIHJlY292ZXJGcm9tRXJyb3IoZXJyb3IsIGN1cnJlbnRTdGVwKSB7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSB0aGlzLmNsYXNzaWZ5RXJyb3IoZXJyb3IpO1xuXG4gICAgICBzd2l0Y2ggKGVycm9yVHlwZSkge1xuICAgICAgICBjYXNlICdFTEVNRU5UX05PVF9GT1VORCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignRWxlbWVudCBOb3QgRm91bmQnLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIGFjdGlvbjogJ1NLSVBfU1RFUCcsIFxuICAgICAgICAgICAgbmV4dFN0ZXA6IGN1cnJlbnRTdGVwICsgMSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUYXJnZXQgZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nIHRvIG5leHQgc3RlcCdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ1NUT1JBR0VfVU5BVkFJTEFCTEUnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBhY3Rpb246ICdVU0VfTUVNT1JZX1NUT1JBR0UnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0xvY2FsIHN0b3JhZ2UgdW5hdmFpbGFibGUsIHVzaW5nIGluLW1lbW9yeSBzdG9yYWdlJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnRFJJVkVSX05PVF9MT0FERUQnOlxuICAgICAgICAgIHRoaXMubG9nRXJyb3IoJ0RyaXZlci5qcyBOb3QgTG9hZGVkJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEcml2ZXIuanMgbGlicmFyeSBub3QgbG9hZGVkLCBjYW5ub3Qgc3RhcnQgdG91cidcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ0lOVkFMSURfVE9PTFRJUCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignSW52YWxpZCBUb29sdGlwIENvbmZpZ3VyYXRpb24nLCBlcnJvciwgeyBjdXJyZW50U3RlcCB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnU0tJUF9TVEVQJyxcbiAgICAgICAgICAgIG5leHRTdGVwOiBjdXJyZW50U3RlcCArIDEsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b29sdGlwIGNvbmZpZ3VyYXRpb24sIHNraXBwaW5nJ1xuICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVGhlbWUgRGV0ZWN0aW9uIEZhaWxlZCcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWN0aW9uOiAnVVNFX0RFRkFVTFRfVEhFTUUnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1VzaW5nIGRlZmF1bHQgZGFyayB0aGVtZSdcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcignVW5rbm93biBFcnJvcicsIGVycm9yLCB7IGN1cnJlbnRTdGVwIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3Rpb246ICdBQk9SVF9UT1VSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLCBhYm9ydGluZyB0b3VyJ1xuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3NpZnkgZXJyb3IgdHlwZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ30gRXJyb3IgdHlwZVxuICAgICAqL1xuICAgIGNsYXNzaWZ5RXJyb3IoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IGVycm9yLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdlbGVtZW50JykgJiYgbWVzc2FnZS5pbmNsdWRlcygnbm90IGZvdW5kJykpIHtcbiAgICAgICAgcmV0dXJuICdFTEVNRU5UX05PVF9GT1VORCc7XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnc3RvcmFnZScpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ3F1b3RhJykpIHtcbiAgICAgICAgcmV0dXJuICdTVE9SQUdFX1VOQVZBSUxBQkxFJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdkcml2ZXInKSB8fCBtZXNzYWdlLmluY2x1ZGVzKCd1bmRlZmluZWQnKSkge1xuICAgICAgICByZXR1cm4gJ0RSSVZFUl9OT1RfTE9BREVEJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHwgbWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICAgIHJldHVybiAnSU5WQUxJRF9UT09MVElQJztcbiAgICAgIH1cbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCd0aGVtZScpKSB7XG4gICAgICAgIHJldHVybiAnVEhFTUVfREVURUNUSU9OX0ZBSUxFRCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnVU5LTk9XTic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBsb2dnZWQgZXJyb3JzXG4gICAgICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiBlcnJvciBlbnRyaWVzXG4gICAgICovXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIFsuLi50aGlzLmVycm9yc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGxvZ2dlZCBlcnJvcnNcbiAgICAgKi9cbiAgICBjbGVhckVycm9ycygpIHtcbiAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVycm9yIHN0YXRpc3RpY3NcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBFcnJvciBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgZ2V0U3RhdGlzdGljcygpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICB0b3RhbDogdGhpcy5lcnJvcnMubGVuZ3RoLFxuICAgICAgICBieUNvbnRleHQ6IHt9LFxuICAgICAgICBieVR5cGU6IHt9LFxuICAgICAgICByZWNlbnQ6IHRoaXMuZXJyb3JzLnNsaWNlKC0xMClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBDb3VudCBieSBjb250ZXh0XG4gICAgICAgIHN0YXRzLmJ5Q29udGV4dFtlcnJvci5jb250ZXh0XSA9IChzdGF0cy5ieUNvbnRleHRbZXJyb3IuY29udGV4dF0gfHwgMCkgKyAxO1xuXG4gICAgICAgIC8vIENvdW50IGJ5IHR5cGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY2xhc3NpZnlFcnJvcih7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICAgIHN0YXRzLmJ5VHlwZVt0eXBlXSA9IChzdGF0cy5ieVR5cGVbdHlwZV0gfHwgMCkgKyAxO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZ3JhY2VmdWwgZGVncmFkYXRpb24gd2hlbiBEcml2ZXIuanMgZmFpbHMgdG8gbG9hZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGZhbGxiYWNrIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgaGFuZGxlRHJpdmVyTG9hZEZhaWx1cmUoKSB7XG4gICAgICB0aGlzLmxvZ0Vycm9yKCdEcml2ZXIuanMgTG9hZCBGYWlsdXJlJywgJ0RyaXZlci5qcyBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIC8vIFNob3cgZmFsbGJhY2sgbWVzc2FnZVxuICAgICAgY29uc3QgZmFsbGJhY2tNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaWQgPSAnb25ib2FyZGluZy1mYWxsYmFjayc7XG4gICAgICBmYWxsYmFja01lc3NhZ2Uuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDIwcHg7XG4gICAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMyYTJhMmEpO1xuICAgICAgICBjb2xvcjogdmFyKC0tZmcsICNmZmZmZmYpO1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICAgIHotaW5kZXg6IDk5OTk7XG4gICAgICAgIG1heC13aWR0aDogMzAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGA7XG4gICAgICBmYWxsYmFja01lc3NhZ2UuaW5uZXJIVE1MID0gYFxuICAgICAgICA8c3Ryb25nPldlbGNvbWUgdG8gRGFzaENhZGR5ITwvc3Ryb25nPjxicj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDEwcHggMCAwIDA7IGZvbnQtc2l6ZTogMTJweDtcIj5cbiAgICAgICAgICBUaGUgaW50ZXJhY3RpdmUgdG91ciBpcyB1bmF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gZXhwbG9yZSB0aGUgZGFzaGJvYXJkIGZyZWVseS5cbiAgICAgICAgICBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaGVscCBnZXR0aW5nIHN0YXJ0ZWQuXG4gICAgICAgIDwvcD5cbiAgICAgIGA7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZmFsbGJhY2tNZXNzYWdlKTtcblxuICAgICAgLy8gQXV0by1yZW1vdmUgYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChmYWxsYmFja01lc3NhZ2UucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGZhbGxiYWNrTWVzc2FnZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZhbGxiYWNrTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMDAwKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0b3JhZ2UgdW5hdmFpbGFibGUgc2NlbmFyaW9cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBJbi1tZW1vcnkgc3RvcmFnZSBmYWxsYmFja1xuICAgICAqL1xuICAgIGhhbmRsZVN0b3JhZ2VVbmF2YWlsYWJsZSgpIHtcbiAgICAgIHRoaXMubG9nRXJyb3IoJ1N0b3JhZ2UgVW5hdmFpbGFibGUnLCAnTG9jYWwgc3RvcmFnZSBpcyBub3QgYXZhaWxhYmxlJyk7XG5cbiAgICAgIC8vIENyZWF0ZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgICAgY29uc3QgbWVtb3J5U3RvcmFnZSA9IHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGdldEl0ZW0oa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldIHx8IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc29sZS53YXJuKCdbRXJyb3JIYW5kbGVyXSBVc2luZyBpbi1tZW1vcnkgc3RvcmFnZSAtIHByb2dyZXNzIHdpbGwgbm90IHBlcnNpc3QnKTtcbiAgICAgIHJldHVybiBtZW1vcnlTdG9yYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgZXJyb3IgdG8gdHJhY2tpbmcgc2VydmljZSAocGxhY2Vob2xkZXIpXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXJyb3JFbnRyeSAtIEVycm9yIGVudHJ5IHRvIHNlbmRcbiAgICAgKi9cbiAgICBzZW5kVG9FcnJvclRyYWNraW5nKGVycm9yRW50cnkpIHtcbiAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciBlcnJvciB0cmFja2luZyBpbnRlZ3JhdGlvblxuICAgICAgLy8gQ291bGQgaW50ZWdyYXRlIHdpdGggU2VudHJ5LCBMb2dSb2NrZXQsIGV0Yy5cbiAgICAgIC8vIEV4YW1wbGU6XG4gICAgICAvLyBpZiAod2luZG93LlNlbnRyeSkge1xuICAgICAgLy8gICBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoZXJyb3JFbnRyeS5tZXNzYWdlKSwge1xuICAgICAgLy8gICAgIGV4dHJhOiBlcnJvckVudHJ5Lm1ldGFkYXRhXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHdpbmRvdy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gIGNvbnNvbGUubG9nKCdbRXJyb3JIYW5kbGVyXSBNb2R1bGUgbG9hZGVkJyk7XG5cbn0pKHdpbmRvdyk7XG47XG4vLyA9PT09PSBEQVNIQk9BUkQgQ09OU1RBTlRTID09PT09XG5jb25zdCBEQyA9IHtcbiAgTkFNRTogJ0Rhc2hDYWRkeScsXG4gIFBPTEw6IHtcbiAgICBEQVNIQk9BUkQ6ICAxMDAwMCwgICAvLyAxMHMgXHUyMDE0IG1haW4gcmVmcmVzaEFsbCBpbnRlcnZhbFxuICAgIExPR1M6ICAgICAgIDMwMDAsICAgIC8vIDNzICBcdTIwMTQgbG9nIHZpZXdlciB1cGRhdGVzXG4gICAgU1RBVFM6ICAgICAgNTAwMCwgICAgLy8gNXMgIFx1MjAxNCByZXNvdXJjZSBtb25pdG9yIHJlZnJlc2hcbiAgICBXRUFUSEVSOiAgICA2MDAwMDAsICAvLyAxMG0gXHUyMDE0IHdlYXRoZXIgd2lkZ2V0IHJlZnJlc2hcbiAgICBIRUFMVEg6ICAgICAxMDAwLCAgICAvLyAxcyAgXHUyMDE0IGNhcmQgaGVhbHRoIGJhZGdlIHJlZnJlc2hcbiAgICBERVBMT1lfU1NMOiA1MDAwLCAgICAvLyA1cyAgXHUyMDE0IFNTTCBjZXJ0IGNoZWNrIGR1cmluZyBkZXBsb3lcbiAgfSxcbiAgREVMQVlTOiB7XG4gICAgQlROX1JFU0VUOiAgMjAwMCwgICAgLy8gQnV0dG9uIHRleHQgcmVzZXQgYWZ0ZXIgYWN0aW9uXG4gICAgUkVMT0FEOiAgICAgNTAwMCwgICAgLy8gUGFnZSByZWxvYWQgYWZ0ZXIgcmVzdGFydFxuICAgIE1PREFMX0NMT1NFOiA1MDAsICAgIC8vIE1vZGFsIGNsb3NlIGFuaW1hdGlvblxuICAgIFBPUlRfQ0hFQ0s6IDUwMCwgICAgIC8vIERlYm91bmNlIGZvciBwb3J0IGF2YWlsYWJpbGl0eSBjaGVja1xuICAgIERFUExPWV9JTklUOiAzMDAwLCAgIC8vIEluaXRpYWwgZGVwbG95IGNlcnQgY2hlY2sgZGVsYXlcbiAgfSxcbiAgREVGQVVMVFM6IHtcbiAgICBETlNfUE9SVDogICAgJzUzODAnLFxuICAgIFNFUlZJQ0VfUE9SVDogJzgwODAnLFxuICAgIFRUTDogICAgICAgICAzMDAsXG4gICAgQ0FERFlGSUxFOiAgICdDOlxcXFxjYWRkeVxcXFxDYWRkeWZpbGUnLFxuICB9LFxufTtcblxuLy8gRXJyb3IgaGFuZGxlciBmb3IgdHJhY2tpbmcgaXNzdWVzXG5jb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG5cbi8vID09PT09IEdMT0JBTCBTSVRFIENPTkZJRyAobG9hZGVkIGZyb20gc2VydmVyLCBjYWNoZWQgaW4gbG9jYWxTdG9yYWdlKSA9PT09PVxuLy8gT25seSBub24tc2Vuc2l0aXZlIGRpc3BsYXkgcHJlZmVyZW5jZXMgYXJlIGNhY2hlZDsgRE5TIElQcy90b3BvbG9neSBhcmUgZmV0Y2hlZCBmcm9tIEFQSVxuY29uc3QgX2NhY2hlZENmZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rhc2hjYWRkeV9zaXRlX2NvbmZpZycpIHx8ICdudWxsJyk7XG5jb25zdCBTSVRFID0ge1xuICB0bGQ6IChfY2FjaGVkQ2ZnICYmIF9jYWNoZWRDZmcudGxkKSB8fCAnLmhvbWUnLFxuICBkbnNJcDogJycsXG4gIGRuc1BvcnQ6IERDLkRFRkFVTFRTLkROU19QT1JULFxuICBkbnNTZXJ2ZXJzOiB7fSxcbiAgY29uZmlndXJhdGlvblR5cGU6IChfY2FjaGVkQ2ZnICYmIF9jYWNoZWRDZmcuY29uZmlndXJhdGlvblR5cGUpIHx8ICdob21lbGFiJyxcbiAgZG9tYWluOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmRvbWFpbikgfHwgJycsXG4gIGRlZmF1bHRzOiAoX2NhY2hlZENmZyAmJiBfY2FjaGVkQ2ZnLmRlZmF1bHRzKSB8fCB7fSxcbiAgcm91dGluZ01vZGU6IChfY2FjaGVkQ2ZnICYmIF9jYWNoZWRDZmcucm91dGluZ01vZGUpIHx8ICdzdWJkb21haW4nLFxuICBvbmJvYXJkaW5nQ29tcGxldGVkOiBmYWxzZVxufTtcbndpbmRvdy5fX2Rhc2hjYWRkeVNpdGVDb25maWdMb2FkZWQgPSAoYXN5bmMgZnVuY3Rpb24gbG9hZFNpdGVDb25maWcoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgIGlmIChyLm9rKSB7XG4gICAgICBjb25zdCBjID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoYy50bGQpIFNJVEUudGxkID0gYy50bGQuc3RhcnRzV2l0aCgnLicpID8gYy50bGQgOiAnLicgKyBjLnRsZDtcbiAgICAgIGlmIChjLmRucykge1xuICAgICAgICBTSVRFLmRuc0lwID0gYy5kbnMuaXAgfHwgJyc7XG4gICAgICAgIFNJVEUuZG5zUG9ydCA9IGMuZG5zLnBvcnQgfHwgREMuREVGQVVMVFMuRE5TX1BPUlQ7XG4gICAgICB9XG4gICAgICBpZiAoYy5kbnNTZXJ2ZXJzICYmIHR5cGVvZiBjLmRuc1NlcnZlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGMuZG5zU2VydmVycykpIHtcbiAgICAgICAgICBpZiAoayAhPT0gJ19fcHJvdG9fXycgJiYgayAhPT0gJ2NvbnN0cnVjdG9yJyAmJiBrICE9PSAncHJvdG90eXBlJykgU0lURS5kbnNTZXJ2ZXJzW2tdID0gdjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMuY29uZmlndXJhdGlvblR5cGUpIFNJVEUuY29uZmlndXJhdGlvblR5cGUgPSBjLmNvbmZpZ3VyYXRpb25UeXBlO1xuICAgICAgaWYgKGMuZG9tYWluKSBTSVRFLmRvbWFpbiA9IGMuZG9tYWluO1xuICAgICAgaWYgKGMuZGVmYXVsdHMpIFNJVEUuZGVmYXVsdHMgPSBjLmRlZmF1bHRzO1xuICAgICAgaWYgKGMucm91dGluZ01vZGUpIFNJVEUucm91dGluZ01vZGUgPSBjLnJvdXRpbmdNb2RlO1xuICAgICAgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkID0gYy5vbmJvYXJkaW5nQ29tcGxldGVkID09PSB0cnVlO1xuICAgICAgLy8gQ2FjaGUgb25seSBub24tc2Vuc2l0aXZlIGRpc3BsYXkgY29uZmlnIChUTEQsIGRvbWFpbiwgcm91dGluZyBtb2RlKVxuICAgICAgLy8gRE5TIElQcyBhbmQgc2VydmVyIHRvcG9sb2d5IGFyZSBOT1QgY2FjaGVkIFx1MjAxNCBmZXRjaGVkIGZyb20gQVBJIGVhY2ggbG9hZFxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Rhc2hjYWRkeV9zaXRlX2NvbmZpZycsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGxkOiBTSVRFLnRsZCwgY29uZmlndXJhdGlvblR5cGU6IFNJVEUuY29uZmlndXJhdGlvblR5cGUsXG4gICAgICAgIGRvbWFpbjogU0lURS5kb21haW4sIHJvdXRpbmdNb2RlOiBTSVRFLnJvdXRpbmdNb2RlXG4gICAgICB9KSk7XG4gICAgICAvLyBSZW5kZXIgRE5TIGNhcmRzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIGNvbmZpZ3VyZWQgc2VydmVyc1xuICAgICAgcmVuZGVyRG5zQ2FyZHMoKTtcbiAgICAgIC8vIEhpZGUgVG9rZW5zIGJ1dHRvbiBpZiBubyBETlMgc2VydmVycyBjb25maWd1cmVkXG4gICAgICBjb25zdCB0b2tlbnNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFuYWdlLXRva2VucycpO1xuICAgICAgaWYgKHRva2Vuc0J0bikgdG9rZW5zQnRuLnN0eWxlLmRpc3BsYXkgPSBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMpLmxlbmd0aCA/ICcnIDogJ25vbmUnO1xuICAgIH1cbiAgfSBjYXRjaCAoXykge31cbiAgLy8gVXBkYXRlIHN0YXRpYyBIVE1MIGVsZW1lbnRzIHdpdGggY29uZmlndXJlZCBUTERcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdGxkXScpLmZvckVhY2goZWwgPT4gZWwudGV4dENvbnRlbnQgPSBTSVRFLnRsZCk7XG4gIGNvbnN0IHRsZFN1ZmZpeCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXRsZC1zdWZmaXgnKTtcbiAgaWYgKHRsZFN1ZmZpeCkgdGxkU3VmZml4LnRleHRDb250ZW50ID0gU0lURS50bGQ7XG4gIGNvbnN0IHByb3h5SXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1wcm94eS1pcCcpO1xuICBpZiAocHJveHlJcElucHV0ICYmIFNJVEUuZG5zSXApIHsgcHJveHlJcElucHV0LnZhbHVlID0gU0lURS5kbnNJcDsgcHJveHlJcElucHV0LnBsYWNlaG9sZGVyID0gU0lURS5kbnNJcDsgfVxufSkoKTtcbmZ1bmN0aW9uIGJ1aWxkRG9tYWluKHN1YikgeyByZXR1cm4gc3ViICsgU0lURS50bGQ7IH1cbmZ1bmN0aW9uIGJ1aWxkU2VydmljZVVybChzdWIpIHtcbiAgaWYgKFNJVEUucm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknICYmIFNJVEUuZG9tYWluKSByZXR1cm4gJ2h0dHBzOi8vJyArIFNJVEUuZG9tYWluICsgJy8nICsgc3ViO1xuICBpZiAoU0lURS5jb25maWd1cmF0aW9uVHlwZSA9PT0gJ3B1YmxpYycgJiYgU0lURS5kb21haW4pIHJldHVybiAnaHR0cHM6Ly8nICsgc3ViICsgJy4nICsgU0lURS5kb21haW47XG4gIHJldHVybiAnaHR0cHM6Ly8nICsgYnVpbGREb21haW4oc3ViKTtcbn1cbmZ1bmN0aW9uIGdldERuc1NlcnZlckFkZHIoZG5zSWQpIHtcbiAgY29uc3QgcyA9IFNJVEUuZG5zU2VydmVyc1tkbnNJZF07XG4gIHJldHVybiBzID8gYCR7cy5pcH06JHtzLnBvcnR9YCA6IGJ1aWxkRG9tYWluKGRuc0lkKTtcbn1cbi8qKiBHZXQgdGhlIEROUyBJRCB3aG9zZSBJUCBtYXRjaGVzIHRoZSBwcmltYXJ5IEROUyBjb25maWcgKGRucy5pcCkgKi9cbmZ1bmN0aW9uIGdldFByaW1hcnlEbnNJZCgpIHtcbiAgaWYgKCFTSVRFLmRuc0lwKSByZXR1cm4gbnVsbDtcbiAgZm9yIChjb25zdCBbaWQsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKFNJVEUuZG5zU2VydmVycykpIHtcbiAgICBpZiAoaW5mby5pcCA9PT0gU0lURS5kbnNJcCkgcmV0dXJuIGlkO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyA9PT09PSBEWU5BTUlDIEROUyBDQVJEIFJFTkRFUkVSID09PT09XG5mdW5jdGlvbiByZW5kZXJEbnNDYXJkcygpIHtcbiAgY29uc3QgdG9wUm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpO1xuICBpZiAoIXRvcFJvdykgcmV0dXJuO1xuICBjb25zdCBkbnNJZHMgPSBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMpO1xuICBpZiAoIWRuc0lkcy5sZW5ndGgpIHJldHVybjsgLy8gTm8gRE5TIHNlcnZlcnMgY29uZmlndXJlZCBcdTIwMTQgc2hvdyBub3RoaW5nXG5cbiAgY29uc3Qgc3ZnSWNvbiA9ICc8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPidcbiAgICArICc8cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE2XCIgcng9XCIyXCIgZmlsbD1cIiMzNDQ5NWVcIi8+J1xuICAgICsgJzxyZWN0IHg9XCI1XCIgeT1cIjZcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiIGZpbGw9XCIjMzQ5OGRiXCIvPidcbiAgICArICc8cmVjdCB4PVwiNVwiIHk9XCI5XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiMTFcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMVwiIGZpbGw9XCIjZWNmMGYxXCIvPidcbiAgICArICc8cmVjdCB4PVwiNVwiIHk9XCIxM1wiIHdpZHRoPVwiOFwiIGhlaWdodD1cIjFcIiBmaWxsPVwiI2VjZjBmMVwiLz4nXG4gICAgKyAnPHJlY3QgeD1cIjVcIiB5PVwiMTVcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMVwiIGZpbGw9XCIjZWNmMGYxXCIvPidcbiAgICArICc8Y2lyY2xlIGN4PVwiMTdcIiBjeT1cIjExXCIgcj1cIjJcIiBmaWxsPVwiI2U3NGMzY1wiLz4nXG4gICAgKyAnPHBhdGggZD1cIk0xNyA5djRNMTUgMTFoNFwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMVwiLz48L3N2Zz4nO1xuXG4gIGNvbnN0IGZpcnN0Q2hpbGQgPSB0b3BSb3cuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gIGRuc0lkcy5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBzYWZlSWQgPSBlc2NhcGVIdG1sKGlkKTtcbiAgICBjb25zdCBsYWJlbCA9IGVzY2FwZUh0bWwoKFNJVEUuZG5zU2VydmVyc1tpZF0ubmFtZSB8fCBpZCkudG9VcHBlckNhc2UoKSk7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNhcmQuY2xhc3NOYW1lID0gJ2NhcmQnO1xuICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWFwcCcsIGlkKTtcbiAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCAnb2ZmJyk7XG4gICAgY2FyZC5pbm5lckhUTUwgPVxuICAgICAgYDxzcGFuIGlkPVwiJHtzYWZlSWR9LWRvdFwiIGNsYXNzPVwiZG90IGJhZCBhdC1ibFwiPjwvc3Bhbj5gXG4gICAgICArIGA8ZGl2IGNsYXNzPVwicm93XCI+PGRpdiBjbGFzcz1cImxvZ28td3JhcFwiPiR7c3ZnSWNvbn08L2Rpdj5gXG4gICAgICArIGA8c3BhbiBjbGFzcz1cIm5hbWVcIj4ke2xhYmVsfTwvc3Bhbj48c3BhbiBjbGFzcz1cInNwYWNlclwiPjwvc3Bhbj5gXG4gICAgICArIGA8c3BhbiBpZD1cIiR7c2FmZUlkfS1waWxsXCIgY2xhc3M9XCJiYWRnZSBvZmZcIj5PRkY8L3NwYW4+PC9kaXY+YFxuICAgICAgKyBgPGRpdiBjbGFzcz1cInJlc3BvbnNlLXJvd1wiPjxzcGFuIGlkPVwiJHtzYWZlSWR9LXRpbWVcIiBjbGFzcz1cInJlc3BvbnNlLXRpbWVcIj4tLTwvc3Bhbj48L2Rpdj5gXG4gICAgICArIGA8ZGl2IGNsYXNzPVwiaGVhbHRoLXJvd1wiIGlkPVwiaGVhbHRoLSR7c2FmZUlkfVwiPjxzcGFuIGlkPVwidXB0aW1lLSR7c2FmZUlkfVwiIGNsYXNzPVwidXB0aW1lLWNoaXBcIj4tLTwvc3Bhbj48ZGl2IGNsYXNzPVwidXB0aW1lLW1pbmktYmFyXCI+PGRpdiBjbGFzcz1cImZpbGxcIiBpZD1cInVwdGltZS1iYXItJHtzYWZlSWR9XCIgc3R5bGU9XCJ3aWR0aDogMCVcIj48L2Rpdj48L2Rpdj48L2Rpdj5gXG4gICAgICArIGA8ZGl2IGNsYXNzPVwiYnRuLXJvd1wiPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tcmVzdGFydFwiIGNsYXNzPVwicmVzdGFydC1idG5cIj5SZXN0YXJ0PC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS11cGRhdGVcIiBjbGFzcz1cInVwZGF0ZS1idG5cIiB0aXRsZT1cIlVwZGF0ZSBETlMgc2VydmVyXCI+XHUyQjA2XHVGRTBGPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1vcGVuXCI+T3BlbjwvYnV0dG9uPmBcbiAgICAgICsgYDxidXR0b24gaWQ9XCIke3NhZmVJZH0tbG9nc1wiIGNsYXNzPVwibG9ncy1idG5cIj5Mb2dzPC9idXR0b24+YFxuICAgICAgKyBgPGJ1dHRvbiBpZD1cIiR7c2FmZUlkfS1zZXR0aW5nc1wiIGNsYXNzPVwic2V0dGluZ3MtYnRuXCI+XHUyNjk5XHVGRTBGPC9idXR0b24+YFxuICAgICAgKyBgPC9kaXY+YDtcbiAgICB0b3BSb3cuaW5zZXJ0QmVmb3JlKGNhcmQsIGZpcnN0Q2hpbGQpO1xuICB9KTtcbn1cbndpbmRvdy5yZW5kZXJEbnNDYXJkcyA9IHJlbmRlckRuc0NhcmRzO1xuXG4vLyA9PT09PSBDU1JGIFBST1RFQ1RJT04gPT09PT1cbmxldCBjc3JmVG9rZW4gPSBudWxsO1xuXG4vKipcbiAqIEdldCBDU1JGIHRva2VuIGZyb20gc2VydmVyIChjYWNoZWQpXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBDU1JGIHRva2VuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENTUkZUb2tlbigpIHtcbiAgaWYgKGNzcmZUb2tlbikgcmV0dXJuIGNzcmZUb2tlbjtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY3NyZi10b2tlbicpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIENTUkYgdG9rZW4nKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBjc3JmVG9rZW4gPSBkYXRhLnRva2VuO1xuICAgIHJldHVybiBjc3JmVG9rZW47XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQ1NSRl0gR2V0IFRva2VuJywgZXJyb3IsIHsgZnVuY3Rpb246ICdnZXRDU1JGVG9rZW4nIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogU2VjdXJlIGZldGNoIHdyYXBwZXIgdGhhdCBhdXRvbWF0aWNhbGx5IGFkZHMgQ1NSRiB0b2tlbiB0byBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0cy5cbiAqIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIENTUkYgZXJyb3IgKDQwMyB3aXRoIERDLTEwMC9EQy0xMDEpLCBhdXRvbWF0aWNhbGx5XG4gKiByZWZyZXNoZXMgdGhlIHRva2VuIGFuZCByZXRyaWVzIG9uY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVVJMIHRvIGZldGNoXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIEZldGNoIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJlc3BvbnNlPn0gRmV0Y2ggcmVzcG9uc2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VjdXJlRmV0Y2godXJsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgbWV0aG9kID0gKG9wdGlvbnMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBuZWVkc0NzcmYgPSAhWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJ10uaW5jbHVkZXMobWV0aG9kKTtcblxuICBpZiAobmVlZHNDc3JmKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0Q1NSRlRva2VuKCk7XG4gICAgICBvcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgJ1gtQ1NSRi1Ub2tlbic6IHRva2VuXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tDU1JGXSBBZGQgdG8gUmVxdWVzdCcsIGVycm9yLCB7IGZ1bmN0aW9uOiAnc2VjdXJlRmV0Y2gnIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIERlZmF1bHQgMTVzIHRpbWVvdXQgaWYgbm8gc2lnbmFsIHByb3ZpZGVkIChwcmV2ZW50cyBoYW5naW5nIHJlcXVlc3RzKVxuICBpZiAoIW9wdGlvbnMuc2lnbmFsKSB7XG4gICAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1MDAwKSB9O1xuICB9XG5cbiAgb3B0aW9ucy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJztcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIG9wdGlvbnMpO1xuXG4gIC8vIEF1dG8tcmV0cnkgb25jZSBvbiBDU1JGIGZhaWx1cmUgKHRva2VuIG1heSBoYXZlIGJlZW4gcm90YXRlZCBieSBUT1RQIHJlLWF1dGgpXG4gIGlmIChuZWVkc0NzcmYgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmNsb25lKCkuanNvbigpO1xuICAgICAgaWYgKGJvZHkuZXJyb3IgJiYgKGJvZHkuZXJyb3IuaW5jbHVkZXMoJ0RDLTEwMCcpIHx8IGJvZHkuZXJyb3IuaW5jbHVkZXMoJ0RDLTEwMScpKSkge1xuICAgICAgICBjc3JmVG9rZW4gPSBudWxsOyAvLyBDbGVhciBjYWNoZWQgdG9rZW5cbiAgICAgICAgY29uc3QgZnJlc2hUb2tlbiA9IGF3YWl0IGdldENTUkZUb2tlbigpO1xuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB7IC4uLm9wdGlvbnMuaGVhZGVycywgJ1gtQ1NSRi1Ub2tlbic6IGZyZXNoVG9rZW4gfTtcbiAgICAgICAgLy8gTmV3IHNpZ25hbCBmb3IgcmV0cnkgKG9sZCBvbmUgbWF5IGhhdmUgYmVlbiBjb25zdW1lZClcbiAgICAgICAgb3B0aW9ucy5zaWduYWwgPSBBYm9ydFNpZ25hbC50aW1lb3V0KDE1MDAwKTtcbiAgICAgICAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLy8gSWYgY2xvbmUvanNvbiBmYWlscywgcmV0dXJuIG9yaWdpbmFsIHJlc3BvbnNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG4vLyA9PT09PSBBUEkgQ0FMTCBIRUxQRVJTID09PT09XG5cbi8qKiBQT1NUIEpTT04gYW5kIHJldHVybiBwYXJzZWQgcmVzcG9uc2UuIFRocm93cyBvbiBIVFRQIG9yIEFQSSBlcnJvci4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RKU09OKHVybCwgZGF0YSkge1xuICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgaWYgKCFyZXNwLm9rIHx8IHJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgYFJlcXVlc3QgZmFpbGVkICgke3Jlc3Auc3RhdHVzfSlgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogR0VUIEpTT04gYW5kIHJldHVybiBwYXJzZWQgcmVzcG9uc2UuIFRocm93cyBvbiBIVFRQIGVycm9yIHdpdGggc2VydmVyIG1lc3NhZ2UuICovXG5hc3luYyBmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2godXJsKTtcbiAgaWYgKCFyZXNwLm9rKSB7XG4gICAgbGV0IG1zZyA9IGBSZXF1ZXN0IGZhaWxlZCAoJHtyZXNwLnN0YXR1c30pYDtcbiAgICB0cnkgeyBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCk7IG1zZyA9IGJvZHkuZXJyb3IgfHwgbXNnOyB9IGNhdGNoIChfKSB7fVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG4gIHJldHVybiByZXNwLmpzb24oKTtcbn1cblxuLyoqIERFTEVURSByZXF1ZXN0LiBSZXR1cm5zIHBhcnNlZCBKU09OIHJlc3BvbnNlLiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQVBJKHVybCkge1xuICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2godXJsLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICBpZiAoIXJlc3Aub2sgfHwgcmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCBgRGVsZXRlIGZhaWxlZCAoJHtyZXNwLnN0YXR1c30pYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSdW4gYW4gYXN5bmMgb3BlcmF0aW9uIHdpdGggYnV0dG9uIGxvYWRpbmcgc3RhdGUuXG4gKiBEaXNhYmxlcyB0aGUgYnV0dG9uLCBzaG93cyBsb2FkaW5nIHRleHQsIHJlc3RvcmVzIG9uIGNvbXBsZXRlLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYnRuIC0gQnV0dG9uIGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2FkaW5nVGV4dCAtIFRleHQgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIChlLmcuICdTYXZpbmcuLi4nKVxuICogQHBhcmFtIHtmdW5jdGlvbn0gYXN5bmNGbiAtIEFzeW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gT3B0aW9uczogeyBzdWNjZXNzVGV4dCwgcmVzZXREZWxheSB9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhCdXR0b24oYnRuLCBsb2FkaW5nVGV4dCwgYXN5bmNGbiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG9yaWdpbmFsID0gYnRuLmlubmVySFRNTDtcbiAgY29uc3QgeyBzdWNjZXNzVGV4dCA9ICdcdTI3MDUnLCByZXNldERlbGF5ID0gREMuREVMQVlTLkJUTl9SRVNFVCB9ID0gb3B0cztcbiAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgYnRuLmlubmVySFRNTCA9IGxvYWRpbmdUZXh0O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFzeW5jRm4oKTtcbiAgICBidG4uaW5uZXJIVE1MID0gc3VjY2Vzc1RleHQ7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi5pbm5lckhUTUwgPSBvcmlnaW5hbDsgYnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIHJlc2V0RGVsYXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBidG4uaW5uZXJIVE1MID0gb3JpZ2luYWw7XG4gICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG4vKiogU2hvdy9oaWRlIGEgbW9kYWwgYnkgSUQgKi9cbmZ1bmN0aW9uIG9wZW5Nb2RhbChpZCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbn1cbmZ1bmN0aW9uIGNsb3NlTW9kYWwoaWQpIHtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG59XG5cbi8qKiBXaXJlIGJhY2tkcm9wLWNsaWNrIGNsb3NlICsgb3B0aW9uYWwgY2xvc2UgYnV0dG9ucyBmb3IgYSBtb2RhbCBlbGVtZW50ICovXG5mdW5jdGlvbiB3aXJlTW9kYWwobW9kYWwsIC4uLmNsb3NlQnRucykge1xuICBpZiAoIW1vZGFsKSByZXR1cm47XG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpOyB9KTtcbiAgLy8gU2tpcCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcmVhbCBsaXN0ZW5lciB0YXJnZXQuIFdpdGhvdXQgdGhpcyBndWFyZCwgYVxuICAvLyBzaW5nbGUgdHlwbyAoZS5nLiBwYXNzaW5nIGEgZnVuY3Rpb24gb3IgbnVsbCBpbnN0ZWFkIG9mIGEgYnV0dG9uIGVsZW1lbnQpXG4gIC8vIHRocm93cyBhbmQgYWJvcnRzIHRoZSByZXN0IG9mIHRoZSBjYWxsaW5nIG1vZHVsZSdzIGluaXQgXHUyMDE0IHdoaWNoIGNhbiB0YWtlXG4gIC8vIGRvd24gbGljZW5zZS5qcyAoRlJFRSBUSUVSIGJhZGdlKSwgVE9UUCB3aXJpbmcsIGV0Yy5cbiAgY2xvc2VCdG5zLmZvckVhY2goYnRuID0+IHtcbiAgICBpZiAoYnRuICYmIHR5cGVvZiBidG4uYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKiogVG9hc3Qtc3R5bGUgbm90aWZpY2F0aW9uIChyZXBsYWNlcyBhbGwgYWxlcnQoKSB1c2FnZSkgKi9cbmZ1bmN0aW9uIHNob3dOb3RpZmljYXRpb24odGV4dCwgdHlwZSA9ICdpbmZvJywgZHVyYXRpb24gPSAzMDAwKSB7XG4gIGNvbnN0IGV4aXN0aW5nTm90aWYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZGVwbG95LW5vdGlmaWNhdGlvbicpO1xuICBpZiAoZXhpc3RpbmdOb3RpZikgZXhpc3RpbmdOb3RpZi5yZW1vdmUoKTtcblxuICBjb25zdCBjb2xvcnMgPSB7XG4gICAgaW5mbzogICAgeyBiZzogJyMyMTk2RjMnLCAgICAgICBmZzogJyNmZmYnIH0sXG4gICAgc3VjY2VzczogeyBiZzogJ3ZhcigtLW9rLWJnKScsICBmZzogJ3ZhcigtLW9rLWZnKScgfSxcbiAgICBlcnJvcjogICB7IGJnOiAnI2Y0NDMzNicsICAgICAgIGZnOiAnI2ZmZicgfSxcbiAgICB3YXJuaW5nOiB7IGJnOiAnI2ZmOTgwMCcsICAgICAgIGZnOiAnI2ZmZicgfVxuICB9O1xuXG4gIGNvbnN0IGMgPSBjb2xvcnNbdHlwZV0gfHwgY29sb3JzLmluZm87XG4gIGNvbnN0IG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBtc2cuY2xhc3NOYW1lID0gJ2RlcGxveS1ub3RpZmljYXRpb24nO1xuICBtc2cudGV4dENvbnRlbnQgPSB0ZXh0O1xuICBtc2cuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICBwb3NpdGlvbjogZml4ZWQ7IHRvcDogMjBweDsgcmlnaHQ6IDIwcHg7XG4gICAgYmFja2dyb3VuZDogJHtjLmJnfTsgY29sb3I6ICR7Yy5mZ307XG4gICAgcGFkZGluZzogMTZweCAyNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLC4zKTtcbiAgICB6LWluZGV4OiAxMDAwMDsgYW5pbWF0aW9uOiBzbGlkZUluIDAuM3MgZWFzZS1vdXQ7XG4gICAgbWF4LXdpZHRoOiA0MDBweDsgd2hpdGUtc3BhY2U6IHByZS1saW5lOyBmb250LXNpemU6IDE0cHg7XG4gIGA7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobXNnKTtcbiAgaWYgKGR1cmF0aW9uID4gMCkgc2V0VGltZW91dCgoKSA9PiBtc2cucmVtb3ZlKCksIGR1cmF0aW9uKTtcbn1cblxuLyoqIFJlbGF0aXZlIHRpbWUgZGlzcGxheSAoZS5nLiBcIjVtIGFnb1wiLCBcIjJoIGFnb1wiKSAqL1xuZnVuY3Rpb24gdGltZUFnbyh0cykge1xuICBjb25zdCBkaWZmID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKHRzKS5nZXRUaW1lKCk7XG4gIGlmIChkaWZmIDwgNjAwMDApIHJldHVybiAnanVzdCBub3cnO1xuICBpZiAoZGlmZiA8IDM2MDAwMDApIHJldHVybiBNYXRoLmZsb29yKGRpZmYgLyA2MDAwMCkgKyAnbSBhZ28nO1xuICBpZiAoZGlmZiA8IDg2NDAwMDAwKSByZXR1cm4gTWF0aC5mbG9vcihkaWZmIC8gMzYwMDAwMCkgKyAnaCBhZ28nO1xuICByZXR1cm4gTWF0aC5mbG9vcihkaWZmIC8gODY0MDAwMDApICsgJ2QgYWdvJztcbn1cblxuLy8gPT09PT0gU0FGRSBTVE9SQUdFIFdSQVBQRVJTID09PT09XG4vLyBQcmV2ZW50cyBjcmFzaGVzIGluIFNhZmFyaSBwcml2YXRlIGJyb3dzaW5nLCBxdW90YSBleGNlZWRlZCwgb3IgcmVzdHJpY3RlZCBlbnZpcm9ubWVudHNcbmZ1bmN0aW9uIHNhZmVHZXQoa2V5LCBmYWxsYmFjayA9IG51bGwpIHtcbiAgdHJ5IHsgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7IHJldHVybiB2ICE9PSBudWxsID8gdiA6IGZhbGxiYWNrOyB9IGNhdGNoIChfKSB7IHJldHVybiBmYWxsYmFjazsgfVxufVxuZnVuY3Rpb24gc2FmZVNldChrZXksIHZhbHVlKSB7XG4gIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpOyB9IGNhdGNoIChfKSB7IC8qIHF1b3RhIGV4Y2VlZGVkIG9yIHByaXZhdGUgbW9kZSAqLyB9XG59XG5mdW5jdGlvbiBzYWZlUmVtb3ZlKGtleSkge1xuICB0cnkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpOyB9IGNhdGNoIChfKSB7fVxufVxuZnVuY3Rpb24gc2FmZVNlc3Npb25HZXQoa2V5LCBmYWxsYmFjayA9IG51bGwpIHtcbiAgdHJ5IHsgY29uc3QgdiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTsgcmV0dXJuIHYgIT09IG51bGwgPyB2IDogZmFsbGJhY2s7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuIGZhbGxiYWNrOyB9XG59XG5mdW5jdGlvbiBzYWZlU2Vzc2lvblNldChrZXksIHZhbHVlKSB7XG4gIHRyeSB7IHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7IH0gY2F0Y2ggKF8pIHt9XG59XG4vKiogUGFyc2UgSlNPTiBmcm9tIGxvY2FsU3RvcmFnZSB3aXRoIGZhbGxiYWNrIFx1MjAxNCBhdm9pZHMgdHJ5L2NhdGNoIGF0IGV2ZXJ5IGNhbGwgc2l0ZSAqL1xuZnVuY3Rpb24gc2FmZUdldEpTT04oa2V5LCBmYWxsYmFjayA9IG51bGwpIHtcbiAgdHJ5IHsgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7IHJldHVybiB2ID8gSlNPTi5wYXJzZSh2KSA6IGZhbGxiYWNrOyB9IGNhdGNoIChfKSB7IHJldHVybiBmYWxsYmFjazsgfVxufVxuXG4vKiogRXNjYXBlIEhUTUwgZW50aXRpZXMgZm9yIHNhZmUgaW5uZXJIVE1MIGluc2VydGlvbiAoaGFuZGxlcyBib3RoIGNvbnRlbnQgYW5kIGF0dHJpYnV0ZXMpICovXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQpIHtcbiAgcmV0dXJuIFN0cmluZyh0ZXh0ID8/ICcnKS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpLnJlcGxhY2UoLycvZywgJyYjMzk7Jyk7XG59XG5cbi8qKiBJbmplY3QgbW9kYWwgSFRNTCBpbnRvIERPTSAoaWRlbXBvdGVudCBcdTIwMTQgc2tpcHMgaWYgZWxlbWVudCBhbHJlYWR5IGV4aXN0cykgKi9cbmZ1bmN0aW9uIGluamVjdE1vZGFsKGlkLCBodG1sKSB7XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpIHJldHVybjtcbiAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xufVxuXG4vLyA9PT09PSBFVkVOVCBCVVMgPT09PT1cbi8vIExpZ2h0d2VpZ2h0IHB1Yi9zdWIgZm9yIGNyb3NzLW1vZHVsZSBjb21tdW5pY2F0aW9uIHdpdGhvdXQgd2luZG93IGdsb2JhbHMuXG4vLyBVc2FnZTogRENfQlVTLm9uKCdzZXJ2aWNlczpsb2FkZWQnLCBoYW5kbGVyKTsgRENfQlVTLmVtaXQoJ3NlcnZpY2VzOmxvYWRlZCcsIGRhdGEpO1xuY29uc3QgRENfQlVTID0ge1xuICBfaGFuZGxlcnM6IHt9LFxuICBvbihldmVudCwgZm4pIHsgKHRoaXMuX2hhbmRsZXJzW2V2ZW50XSB8fD0gW10pLnB1c2goZm4pOyB9LFxuICBvZmYoZXZlbnQsIGZuKSB7IHRoaXMuX2hhbmRsZXJzW2V2ZW50XSA9IHRoaXMuX2hhbmRsZXJzW2V2ZW50XT8uZmlsdGVyKGggPT4gaCAhPT0gZm4pOyB9LFxuICBlbWl0KGV2ZW50LCBkYXRhKSB7IHRoaXMuX2hhbmRsZXJzW2V2ZW50XT8uZm9yRWFjaChmbiA9PiBmbihkYXRhKSk7IH1cbn07XG5cbi8vID09PT09IENFTlRSQUxJWkVEIEFQUCBTVEFURSA9PT09PVxuLy8gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHNlcnZpY2VzIGFycmF5LiBNb2R1bGVzIHNob3VsZCB1c2UgQXBwU3RhdGVcbi8vIGluc3RlYWQgb2YgbXV0YXRpbmcgd2luZG93LkFQUFMgZGlyZWN0bHkuIEVtaXRzICdhcHBzOmNoYW5nZWQnIG9uIHVwZGF0ZXMuXG5jb25zdCBBcHBTdGF0ZSA9IHtcbiAgX2FwcHM6IFtdLFxuICBnZXRBcHBzKCkgeyByZXR1cm4gdGhpcy5fYXBwczsgfSxcbiAgc2V0QXBwcyhhcHBzKSB7IHRoaXMuX2FwcHMgPSBhcHBzOyB3aW5kb3cuQVBQUyA9IGFwcHM7IERDX0JVUy5lbWl0KCdhcHBzOmNoYW5nZWQnLCBhcHBzKTsgfSxcbiAgZmluZEFwcChpZCkgeyByZXR1cm4gdGhpcy5fYXBwcy5maW5kKGEgPT4gYS5pZCA9PT0gaWQpOyB9LFxuICBhZGRBcHAoYXBwKSB7IHRoaXMuX2FwcHMucHVzaChhcHApOyB3aW5kb3cuQVBQUyA9IHRoaXMuX2FwcHM7IERDX0JVUy5lbWl0KCdhcHBzOmNoYW5nZWQnLCB0aGlzLl9hcHBzKTsgfSxcbiAgcmVtb3ZlQXBwKGlkKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5fYXBwcy5maW5kSW5kZXgoYSA9PiBhLmlkID09PSBpZCk7XG4gICAgaWYgKGlkeCA+IC0xKSB7IHRoaXMuX2FwcHMuc3BsaWNlKGlkeCwgMSk7IHdpbmRvdy5BUFBTID0gdGhpcy5fYXBwczsgRENfQlVTLmVtaXQoJ2FwcHM6Y2hhbmdlZCcsIHRoaXMuX2FwcHMpOyB9XG4gICAgcmV0dXJuIGlkeCA+IC0xO1xuICB9LFxuICB1cGRhdGVBcHAoaWQsIGNoYW5nZXMpIHtcbiAgICBjb25zdCBhcHAgPSB0aGlzLl9hcHBzLmZpbmQoYSA9PiBhLmlkID09PSBpZCk7XG4gICAgaWYgKGFwcCkge1xuICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykpIHtcbiAgICAgICAgaWYgKGsgIT09ICdfX3Byb3RvX18nICYmIGsgIT09ICdjb25zdHJ1Y3RvcicgJiYgayAhPT0gJ3Byb3RvdHlwZScpIGFwcFtrXSA9IHY7XG4gICAgICB9XG4gICAgICBEQ19CVVMuZW1pdCgnYXBwczpjaGFuZ2VkJywgdGhpcy5fYXBwcyk7XG4gICAgfVxuICAgIHJldHVybiBhcHA7XG4gIH1cbn07XG47XG4vLyA9PT09PT09PT09IFNLRUxFVE9OIExPQURJTkcgUExBQ0VIT0xERVJTID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2tlbGV0b25DYXJkKCkge1xuICAgIGNvbnN0IGNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjYXJkLmNsYXNzTmFtZSA9ICdza2VsZXRvbi1jYXJkJztcbiAgICBjYXJkLmlubmVySFRNTCA9XG4gICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEycHg7bWFyZ2luLWJvdHRvbToxMnB4XCI+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo0OHB4O2hlaWdodDo0OHB4O2JvcmRlci1yYWRpdXM6OHB4O2ZsZXgtc2hyaW5rOjBcIj48L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJmbGV4OjFcIj4nICtcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cInNrZWxldG9uLWJhclwiIHN0eWxlPVwid2lkdGg6NjAlO2hlaWdodDoxNHB4O21hcmdpbi1ib3R0b206NnB4XCI+PC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjM1JTtoZWlnaHQ6MTBweFwiPjwvZGl2PicgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo0MnB4O2hlaWdodDoyMnB4O2JvcmRlci1yYWRpdXM6MTFweFwiPjwvZGl2PicgK1xuICAgICAgJzwvZGl2PicgK1xuICAgICAgJzxkaXYgY2xhc3M9XCJza2VsZXRvbi1iYXJcIiBzdHlsZT1cIndpZHRoOjQ1JTtoZWlnaHQ6MTJweDttYXJnaW4tYm90dG9tOjEwcHhcIj48L2Rpdj4nICtcbiAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLXRvcDphdXRvXCI+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo2NHB4O2hlaWdodDoyOHB4O2JvcmRlci1yYWRpdXM6OHB4XCI+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwic2tlbGV0b24tYmFyXCIgc3R5bGU9XCJ3aWR0aDo2NHB4O2hlaWdodDoyOHB4O2JvcmRlci1yYWRpdXM6OHB4XCI+PC9kaXY+JyArXG4gICAgICAnPC9kaXY+JztcbiAgICByZXR1cm4gY2FyZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dTa2VsZXRvbnMoY291bnQpIHtcbiAgICBjb25zdCBncmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRzJyk7XG4gICAgaWYgKCFncmlkIHx8IGdyaWQucXVlcnlTZWxlY3RvcignLmNhcmQnKSkgcmV0dXJuOyAvLyBEb24ndCBzaG93IGlmIHJlYWwgY2FyZHMgZXhpc3RcbiAgICBjb3VudCA9IGNvdW50IHx8IDY7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHNrID0gY3JlYXRlU2tlbGV0b25DYXJkKCk7XG4gICAgICBncmlkLmFwcGVuZENoaWxkKHNrKTtcbiAgICAgIC8vIFN0YWdnZXIgZmFkZS1pblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHNrLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpOyB9LCBpICogNjApO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGVTa2VsZXRvbnMoKSB7XG4gICAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkcycpO1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIHZhciBza2VsZXRvbnMgPSBncmlkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5za2VsZXRvbi1jYXJkJyk7XG4gICAgaWYgKCFza2VsZXRvbnMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBza2VsZXRvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2ssIGkpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzay5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICBzay5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgtMTBweCknO1xuICAgICAgfSwgaSAqIDI1KTtcbiAgICB9KTtcbiAgICAvLyBSZW1vdmUgYWZ0ZXIgYW5pbWF0aW9uXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBza2VsZXRvbnMuZm9yRWFjaChmdW5jdGlvbiAoc2spIHsgaWYgKHNrLnBhcmVudE5vZGUpIHNrLnJlbW92ZSgpOyB9KTtcbiAgICB9LCBza2VsZXRvbnMubGVuZ3RoICogMjUgKyAzMDApO1xuICB9XG5cbiAgd2luZG93LlNrZWxldG9uTG9hZGVyID0geyBzaG93OiBzaG93U2tlbGV0b25zLCBoaWRlOiBoaWRlU2tlbGV0b25zIH07XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBUSEVNRSBDT05UUk9MTEVSID09PT09PT09PT1cbi8vIFVzZXItY3JlYXRlZCB0aGVtZXMgYXJlIHN0b3JlZCBzZXJ2ZXItc2lkZSBhcyBpbmRpdmlkdWFsIEpTT04gZmlsZXMuXG4vLyBsb2NhbFN0b3JhZ2UgY2FjaGVzIHRoZW0gZm9yIGluc3RhbnQgbG9hZDsgc2VydmVyIGlzIHNvdXJjZSBvZiB0cnV0aC5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBUSEVNRV9LRVkgPSAndGhlbWUnO1xuICB2YXIgVVNFUl9USEVNRVNfS0VZID0gJ3VzZXItdGhlbWVzJztcbiAgdmFyIExFR0FDWV9DVVNUT01fS0VZID0gJ2N1c3RvbS10aGVtZSc7XG5cbiAgdmFyIEJVSUxUSU5fVEhFTUVTID0gWydkYXJrJywgJ2xpZ2h0JywgJ2JsdWUnLCAnYmxhY2snLCAnbm9yZCcsICdkcmFjdWxhJywgJ3NvbGFyaXplZC1kYXJrJywgJ3NvbGFyaXplZC1saWdodCcsICd0YXhpJywgJ29jZWFuJ107XG4gIHZhciBUSEVNRVMgPSBCVUlMVElOX1RIRU1FUy5zbGljZSgpO1xuXG4gIHZhciBUSEVNRV9QUk9QUyA9IFtcbiAgICAnYmcnLCAnZmcnLCAnbXV0ZWQnLCAnZmctbXV0ZWQnLCAnY2FyZC1iYXNlJywgJ2NhcmQtYmcnLCAnYm9yZGVyJyxcbiAgICAnaG92ZXInLCAnY2FyZC1ob3ZlcicsICdiYXNlJyxcbiAgICAnb2stYmcnLCAnb2stZmcnLCAnYmFkLWJnJywgJ2JhZC1mZycsICdkb3Qtb2snLCAnZG90LWJhZCcsICd1cHRpbWUnLFxuICAgICdzdWNjZXNzJywgJ2Vycm9yJywgJ3dhcm5pbmcnLFxuICAgICdhY2NlbnQnLCAnYWNjZW50LXN0cm9uZydcbiAgXTtcblxuICAvLyBCYXNlIHByb3BzIHRoZSB1c2VyIHBpY2tzIGluIHRoZSBidWlsZGVyIChzdWJzZXQgb2YgVEhFTUVfUFJPUFMpXG4gIHZhciBCQVNFX1BST1BTID0gW1xuICAgICdiZycsICdmZycsICdtdXRlZCcsICdjYXJkLWJhc2UnLCAnY2FyZC1iZycsICdib3JkZXInLFxuICAgICdvay1iZycsICdvay1mZycsICdiYWQtYmcnLCAnYmFkLWZnJywgJ2RvdC1vaycsICdkb3QtYmFkJywgJ3VwdGltZScsXG4gICAgJ2FjY2VudCcsICdhY2NlbnQtc3Ryb25nJ1xuICBdO1xuXG4gIC8vIFByb3BzIHRoYXQgYXJlIGF1dG8tZGVyaXZlZCBpZiBub3QgZXhwbGljaXRseSBzZXRcbiAgdmFyIERFUklWRURfUFJPUFMgPSBbJ2ZnLW11dGVkJywgJ2hvdmVyJywgJ2NhcmQtaG92ZXInLCAnYmFzZScsICdzdWNjZXNzJywgJ2Vycm9yJywgJ3dhcm5pbmcnXTtcblxuICB2YXIgVEhFTUVfQ09MT1JTID0ge1xuICAgIGRhcms6ICAgICAgICAgICAgIHsgYmc6ICcjMGIwZjFhJywgZmc6ICcjZThlY2Y1JywgbXV0ZWQ6ICcjOWFhNmJmJywgJ2ZnLW11dGVkJzogJyM2YjdhOTQnLCAnY2FyZC1iYXNlJzogJyMxMjE4MjYnLCAnY2FyZC1iZyc6ICcjMTIxODI2JywgYm9yZGVyOiAnIzI2MzU1MicsIGhvdmVyOiAnIzFhMjIzNScsICdjYXJkLWhvdmVyJzogJyMxNjFlMmUnLCBiYXNlOiAnIzE1MWMyYicsICdvay1iZyc6ICcjMGMyNDMwJywgJ29rLWZnJzogJyM3ZWYyZmYnLCAnYmFkLWJnJzogJyMyYTEyMWEnLCAnYmFkLWZnJzogJyNmZjlhYTMnLCAnZG90LW9rJzogJyMzNWQxZmYnLCAnZG90LWJhZCc6ICcjZmY1ZjdhJywgdXB0aW1lOiAnIzM1ZDFmZicsIHN1Y2Nlc3M6ICcjNGNhZjUwJywgZXJyb3I6ICcjZTc0YzNjJywgd2FybmluZzogJyNmMzljMTInLCBhY2NlbnQ6ICcjOEZENkZGJywgJ2FjY2VudC1zdHJvbmcnOiAnIzFGN0JGRicgfSxcbiAgICBsaWdodDogICAgICAgICAgICB7IGJnOiAnI2Y2ZjdmYicsIGZnOiAnIzBmMTExNScsIG11dGVkOiAnIzVmNmI3YScsICdmZy1tdXRlZCc6ICcjODk5M2E0JywgJ2NhcmQtYmFzZSc6ICcjZmZmZmZmJywgJ2NhcmQtYmcnOiAnI2ZmZmZmZicsIGJvcmRlcjogJyNlMmU3ZWYnLCBob3ZlcjogJyNlZWYxZjYnLCAnY2FyZC1ob3Zlcic6ICcjZjVmNmZhJywgYmFzZTogJyNlYmVlZjMnLCAnb2stYmcnOiAnI2VhZmZmMScsICdvay1mZyc6ICcjMGE3YzNhJywgJ2JhZC1iZyc6ICcjZmZlZmVmJywgJ2JhZC1mZyc6ICcjYjAwMDIwJywgJ2RvdC1vayc6ICcjMGZiMTVhJywgJ2RvdC1iYWQnOiAnI2Q5M2IzYicsIHVwdGltZTogJyMwZmIxNWEnLCBzdWNjZXNzOiAnIzBhN2MzYScsIGVycm9yOiAnI2IwMDAyMCcsIHdhcm5pbmc6ICcjZDY4YTAwJywgYWNjZW50OiAnIzRhOTBkOScsICdhY2NlbnQtc3Ryb25nJzogJyMyNTYzZWInLCBsaWdodEJnOiB0cnVlIH0sXG4gICAgYmx1ZTogICAgICAgICAgICAgeyBiZzogJyMxOTA4QUMnLCBmZzogJyNlOGYxZmYnLCBtdXRlZDogJyNkNmUyZmYnLCAnZmctbXV0ZWQnOiAnIzllYWZkYicsICdjYXJkLWJhc2UnOiAnIzBkMTUzMycsICdjYXJkLWJnJzogJyMwZDE1MzMnLCBib3JkZXI6ICcjMWMyZDZhJywgaG92ZXI6ICcjMTQxZjRhJywgJ2NhcmQtaG92ZXInOiAnIzExMWEzZScsIGJhc2U6ICcjMGYxODQwJywgJ29rLWJnJzogJyMxNjIwNDAnLCAnb2stZmcnOiAnI2VkZmZmZicsICdiYWQtYmcnOiAnIzBhMGUyNCcsICdiYWQtZmcnOiAnI2ZmYjNjMCcsICdkb3Qtb2snOiAnI2M3ZTVmZicsICdkb3QtYmFkJzogJyNmZmQ2ZGMnLCB1cHRpbWU6ICcjN2VjOGZmJywgc3VjY2VzczogJyM3ZWM4ZmYnLCBlcnJvcjogJyNmZmIzYzAnLCB3YXJuaW5nOiAnI2ZmZDA4MCcsIGFjY2VudDogJyM5Y2Q0ZmYnLCAnYWNjZW50LXN0cm9uZyc6ICcjNmZiMmZmJyB9LFxuICAgIGJsYWNrOiAgICAgICAgICAgIHsgYmc6ICcjMGUwZTBlJywgZmc6ICcjZjVmNWY1JywgbXV0ZWQ6ICcjOTk5OTk5JywgJ2ZnLW11dGVkJzogJyM2NjY2NjYnLCAnY2FyZC1iYXNlJzogJyMxYTFhMWEnLCAnY2FyZC1iZyc6ICcjMWExYTFhJywgYm9yZGVyOiAnIzJlMmUyZScsIGhvdmVyOiAnIzI0MjQyNCcsICdjYXJkLWhvdmVyJzogJyMyMDIwMjAnLCBiYXNlOiAnIzE2MTYxNicsICdvay1iZyc6ICcjMGYyYTEyJywgJ29rLWZnJzogJyM2NmZmN2EnLCAnYmFkLWJnJzogJyMyYTBmMGYnLCAnYmFkLWZnJzogJyNmZjZiNmInLCAnZG90LW9rJzogJyM0Y2FmNTAnLCAnZG90LWJhZCc6ICcjZmY0NDQ0JywgdXB0aW1lOiAnI2UwZTBlMCcsIHN1Y2Nlc3M6ICcjNGNhZjUwJywgZXJyb3I6ICcjZmY0NDQ0Jywgd2FybmluZzogJyNmZjk4MDAnLCBhY2NlbnQ6ICcjRTYzOTQ2JywgJ2FjY2VudC1zdHJvbmcnOiAnI0M2MjgyOCcgfSxcbiAgICBub3JkOiAgICAgICAgICAgICB7IGJnOiAnIzJlMzQ0MCcsIGZnOiAnI2VjZWZmNCcsIG11dGVkOiAnIzgxYTFjMScsICdmZy1tdXRlZCc6ICcjNjg4MmEwJywgJ2NhcmQtYmFzZSc6ICcjM2I0MjUyJywgJ2NhcmQtYmcnOiAnIzNiNDI1MicsIGJvcmRlcjogJyM0YzU2NmEnLCBob3ZlcjogJyM0MzRjNWUnLCAnY2FyZC1ob3Zlcic6ICcjM2Y0ODU4JywgYmFzZTogJyMzNTNjNGEnLCAnb2stYmcnOiAnIzJkNGYzZScsICdvay1mZyc6ICcjYTNiZThjJywgJ2JhZC1iZyc6ICcjNGEyYzJhJywgJ2JhZC1mZyc6ICcjYmY2MTZhJywgJ2RvdC1vayc6ICcjYTNiZThjJywgJ2RvdC1iYWQnOiAnI2JmNjE2YScsIHVwdGltZTogJyNhM2JlOGMnLCBzdWNjZXNzOiAnI2EzYmU4YycsIGVycm9yOiAnI2JmNjE2YScsIHdhcm5pbmc6ICcjZWJjYjhiJywgYWNjZW50OiAnIzg4YzBkMCcsICdhY2NlbnQtc3Ryb25nJzogJyM1ZTgxYWMnIH0sXG4gICAgZHJhY3VsYTogICAgICAgICAgeyBiZzogJyMyODJhMzYnLCBmZzogJyNmOGY4ZjInLCBtdXRlZDogJyM2MjcyYTQnLCAnZmctbXV0ZWQnOiAnIzUxNWQ4NScsICdjYXJkLWJhc2UnOiAnIzQ0NDc1YScsICdjYXJkLWJnJzogJyM0NDQ3NWEnLCBib3JkZXI6ICcjNjI3MmE0JywgaG92ZXI6ICcjNGU1MTcwJywgJ2NhcmQtaG92ZXInOiAnIzQ5NGM2MycsIGJhc2U6ICcjMzYzODQ4JywgJ29rLWJnJzogJyMxZTNhMmUnLCAnb2stZmcnOiAnIzUwZmE3YicsICdiYWQtYmcnOiAnIzNkMWExYScsICdiYWQtZmcnOiAnI2ZmNTU1NScsICdkb3Qtb2snOiAnIzUwZmE3YicsICdkb3QtYmFkJzogJyNmZjU1NTUnLCB1cHRpbWU6ICcjNTBmYTdiJywgc3VjY2VzczogJyM1MGZhN2InLCBlcnJvcjogJyNmZjU1NTUnLCB3YXJuaW5nOiAnI2YxZmE4YycsIGFjY2VudDogJyNiZDkzZjknLCAnYWNjZW50LXN0cm9uZyc6ICcjOGJlOWZkJyB9LFxuICAgICdzb2xhcml6ZWQtZGFyayc6IHsgYmc6ICcjMDAyYjM2JywgZmc6ICcjODM5NDk2JywgbXV0ZWQ6ICcjNTg2ZTc1JywgJ2ZnLW11dGVkJzogJyM0YTVmNjUnLCAnY2FyZC1iYXNlJzogJyMwNzM2NDInLCAnY2FyZC1iZyc6ICcjMDczNjQyJywgYm9yZGVyOiAnIzU4NmU3NScsIGhvdmVyOiAnIzBkNDA1MCcsICdjYXJkLWhvdmVyJzogJyMwYTNhNDgnLCBiYXNlOiAnIzA1MzM0MCcsICdvay1iZyc6ICcjMGQzZDJjJywgJ29rLWZnJzogJyM4NTk5MDAnLCAnYmFkLWJnJzogJyMzZDFhMWEnLCAnYmFkLWZnJzogJyNkYzMyMmYnLCAnZG90LW9rJzogJyM4NTk5MDAnLCAnZG90LWJhZCc6ICcjZGMzMjJmJywgdXB0aW1lOiAnI2I1YmQ2OCcsIHN1Y2Nlc3M6ICcjODU5OTAwJywgZXJyb3I6ICcjZGMzMjJmJywgd2FybmluZzogJyNiNTg5MDAnLCBhY2NlbnQ6ICcjMjY4YmQyJywgJ2FjY2VudC1zdHJvbmcnOiAnIzJhYTE5OCcgfSxcbiAgICAnc29sYXJpemVkLWxpZ2h0Jzp7IGJnOiAnI2ZkZjZlMycsIGZnOiAnIzY1N2I4MycsIG11dGVkOiAnIzkzYTFhMScsICdmZy1tdXRlZCc6ICcjYWRiOGI4JywgJ2NhcmQtYmFzZSc6ICcjZWVlOGQ1JywgJ2NhcmQtYmcnOiAnI2VlZThkNScsIGJvcmRlcjogJyM5M2ExYTEnLCBob3ZlcjogJyNlNmRmY2InLCAnY2FyZC1ob3Zlcic6ICcjZWFlM2NmJywgYmFzZTogJyNlOGUxY2QnLCAnb2stYmcnOiAnI2U4ZjVlOCcsICdvay1mZyc6ICcjODU5OTAwJywgJ2JhZC1iZyc6ICcjZmRmMmYyJywgJ2JhZC1mZyc6ICcjZGMzMjJmJywgJ2RvdC1vayc6ICcjODU5OTAwJywgJ2RvdC1iYWQnOiAnI2RjMzIyZicsIHVwdGltZTogJyM4NTk5MDAnLCBzdWNjZXNzOiAnIzg1OTkwMCcsIGVycm9yOiAnI2RjMzIyZicsIHdhcm5pbmc6ICcjYjU4OTAwJywgYWNjZW50OiAnIzI2OGJkMicsICdhY2NlbnQtc3Ryb25nJzogJyMyYWExOTgnLCBsaWdodEJnOiB0cnVlIH0sXG4gICAgdGF4aTogICAgICAgICAgICAgeyBiZzogJyNmM2QzMjEnLCBmZzogJyMwZTBlMDAnLCBtdXRlZDogJyM0YTRhMTAnLCAnZmctbXV0ZWQnOiAnIzZiNmIzMCcsICdjYXJkLWJhc2UnOiAnI2ZmZDcwMCcsICdjYXJkLWJnJzogJyNmZmQ3MDAnLCBib3JkZXI6ICcjYjhhODQwJywgaG92ZXI6ICcjZmZlODRkJywgJ2NhcmQtaG92ZXInOiAnI2ZmZTAzMycsIGJhc2U6ICcjZjBkMDAwJywgJ29rLWJnJzogJyNkNGZmZDknLCAnb2stZmcnOiAnIzBmMmEwZicsICdiYWQtYmcnOiAnI2ZmZDRkNCcsICdiYWQtZmcnOiAnIzJhMGYwZicsICdkb3Qtb2snOiAnIzRjYWY1MCcsICdkb3QtYmFkJzogJyNmZjQ0NDQnLCB1cHRpbWU6ICcjMGUwZTAwJywgc3VjY2VzczogJyMyZTdkMzInLCBlcnJvcjogJyNjNjI4MjgnLCB3YXJuaW5nOiAnI2U2NTEwMCcsIGFjY2VudDogJyM3YTRhMDAnLCAnYWNjZW50LXN0cm9uZyc6ICcjNWMzODAwJywgbGlnaHRCZzogdHJ1ZSB9LFxuICAgIG9jZWFuOiAgICAgICAgICAgIHsgYmc6ICcjMjA2MGIwJywgZmc6ICcjZmFmNWViJywgbXV0ZWQ6ICcjZGNkMmMwJywgJ2ZnLW11dGVkJzogJyNiMGE4OTAnLCAnY2FyZC1iYXNlJzogJyM3YTk0ZWQnLCAnY2FyZC1iZyc6ICcjN2E5NGVkJywgYm9yZGVyOiAnI2RlYjY3YScsIGhvdmVyOiAnIzhhYTBmMCcsICdjYXJkLWhvdmVyJzogJyM4Mjk4ZTgnLCBiYXNlOiAnIzY4ODhlMCcsICdvay1iZyc6ICcjNGY1YmIwJywgJ29rLWZnJzogJyNjN2Q3ZWInLCAnYmFkLWJnJzogJyNmNDFhM2EnLCAnYmFkLWZnJzogJyM2YTE4MTgnLCAnZG90LW9rJzogJyMzMGEwNTAnLCAnZG90LWJhZCc6ICcjZDA0MDQwJywgdXB0aW1lOiAnIzJkMzJmMicsIHN1Y2Nlc3M6ICcjMzBhMDUwJywgZXJyb3I6ICcjZDA0MDQwJywgd2FybmluZzogJyNlNmEwMzAnLCBhY2NlbnQ6ICcjMTg2MGEwJywgJ2FjY2VudC1zdHJvbmcnOiAnIzEwNDA4MCcgfSxcbiAgfTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ29sb3IgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBoZXhUb1JnYihoZXgpIHtcbiAgICBpZiAoIWhleCB8fCB0eXBlb2YgaGV4ICE9PSAnc3RyaW5nJykgcmV0dXJuIHsgcjogMCwgZzogMCwgYjogMCB9O1xuICAgIGhleCA9IGhleC5yZXBsYWNlKCcjJywgJycpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAzKSBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQoaGV4LnN1YnN0cigwLCAyKSwgMTYpIHx8IDAsXG4gICAgICBnOiBwYXJzZUludChoZXguc3Vic3RyKDIsIDIpLCAxNikgfHwgMCxcbiAgICAgIGI6IHBhcnNlSW50KGhleC5zdWJzdHIoNCwgMiksIDE2KSB8fCAwXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJnYlRvSGV4KHIsIGcsIGIpIHtcbiAgICByZXR1cm4gJyMnICsgW3IsIGcsIGJdLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgdmFyIGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoeCkpKS50b1N0cmluZygxNik7XG4gICAgICByZXR1cm4gaC5sZW5ndGggPT09IDEgPyAnMCcgKyBoIDogaDtcbiAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJsZW5kQ29sb3JzKGhleDEsIGhleDIsIHJhdGlvKSB7XG4gICAgdmFyIGMxID0gaGV4VG9SZ2IoaGV4MSk7XG4gICAgdmFyIGMyID0gaGV4VG9SZ2IoaGV4Mik7XG4gICAgcmV0dXJuIHJnYlRvSGV4KFxuICAgICAgYzEuciArIChjMi5yIC0gYzEucikgKiByYXRpbyxcbiAgICAgIGMxLmcgKyAoYzIuZyAtIGMxLmcpICogcmF0aW8sXG4gICAgICBjMS5iICsgKGMyLmIgLSBjMS5iKSAqIHJhdGlvXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhleEx1bWluYW5jZShoZXgpIHtcbiAgICBoZXggPSBoZXgucmVwbGFjZSgnIycsICcnKTtcbiAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMykgaGV4ID0gaGV4WzBdK2hleFswXStoZXhbMV0raGV4WzFdK2hleFsyXStoZXhbMl07XG4gICAgdmFyIHIgPSBwYXJzZUludChoZXguc3Vic3RyKDAsIDIpLCAxNikgLyAyNTU7XG4gICAgdmFyIGcgPSBwYXJzZUludChoZXguc3Vic3RyKDIsIDIpLCAxNikgLyAyNTU7XG4gICAgdmFyIGIgPSBwYXJzZUludChoZXguc3Vic3RyKDQsIDIpLCAxNikgLyAyNTU7XG4gICAgciA9IHIgPD0gMC4wMzkyOCA/IHIgLyAxMi45MiA6IE1hdGgucG93KChyICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgZyA9IGcgPD0gMC4wMzkyOCA/IGcgLyAxMi45MiA6IE1hdGgucG93KChnICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgYiA9IGIgPD0gMC4wMzkyOCA/IGIgLyAxMi45MiA6IE1hdGgucG93KChiICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgcmV0dXJuIDAuMjEyNiAqIHIgKyAwLjcxNTIgKiBnICsgMC4wNzIyICogYjtcbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBdXRvLWRlcml2ZSBleHRlbmRlZCBjb2xvcnMgZnJvbSBiYXNlIHBhbGV0dGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZGVyaXZlRXh0ZW5kZWRDb2xvcnMoY29sb3JzKSB7XG4gICAgdmFyIGJnID0gY29sb3JzLmJnIHx8ICcjMGIwZjFhJztcbiAgICB2YXIgZmcgPSBjb2xvcnMuZmcgfHwgJyNlOGVjZjUnO1xuICAgIHZhciBtdXRlZCA9IGNvbG9ycy5tdXRlZCB8fCAnIzlhYTZiZic7XG4gICAgdmFyIGNhcmRCYXNlID0gY29sb3JzWydjYXJkLWJhc2UnXSB8fCBjb2xvcnMuYmcgfHwgJyMxMjE4MjYnO1xuICAgIHZhciBkb3RPayA9IGNvbG9yc1snZG90LW9rJ10gfHwgJyM0Y2FmNTAnO1xuICAgIHZhciBkb3RCYWQgPSBjb2xvcnNbJ2RvdC1iYWQnXSB8fCAnI2U3NGMzYyc7XG4gICAgdmFyIGlzTGlnaHQgPSBjb2xvcnMubGlnaHRCZyB8fCAoYmcgJiYgaGV4THVtaW5hbmNlKGJnKSA+IDAuNCk7XG5cbiAgICB2YXIgZGVyaXZlZCA9IHt9O1xuXG4gICAgLy8gaG92ZXI6IHN1YnRsZSBzaGlmdCBvZiBjYXJkLWJhc2UgdG93YXJkIGZnIChkYXJrKSBvciB0b3dhcmQgYmcgKGxpZ2h0KVxuICAgIGRlcml2ZWQuaG92ZXIgPSBpc0xpZ2h0XG4gICAgICA/IGJsZW5kQ29sb3JzKGNhcmRCYXNlLCBiZywgMC4zNSlcbiAgICAgIDogYmxlbmRDb2xvcnMoY2FyZEJhc2UsIGZnLCAwLjA4KTtcblxuICAgIC8vIGNhcmQtaG92ZXI6IG1pZHBvaW50IGJldHdlZW4gY2FyZC1iYXNlIGFuZCBob3ZlclxuICAgIGRlcml2ZWRbJ2NhcmQtaG92ZXInXSA9IGJsZW5kQ29sb3JzKGNhcmRCYXNlLCBkZXJpdmVkLmhvdmVyLCAwLjUpO1xuXG4gICAgLy8gYmFzZTogc3ViZHVlZCBiYWNrZ3JvdW5kIGJldHdlZW4gYmcgYW5kIGNhcmQtYmFzZVxuICAgIGRlcml2ZWQuYmFzZSA9IGJsZW5kQ29sb3JzKGJnLCBjYXJkQmFzZSwgMC42KTtcblxuICAgIC8vIGZnLW11dGVkOiBkaW1tZXIgdGhhbiBtdXRlZCwgYmxlbmQgdG93YXJkIGJnXG4gICAgZGVyaXZlZFsnZmctbXV0ZWQnXSA9IGJsZW5kQ29sb3JzKG11dGVkLCBiZywgMC4zNSk7XG5cbiAgICAvLyBzdWNjZXNzOiByZXVzZSBkb3Qtb2sgKHRoZSBncmVlbiBvZiB0aGlzIHRoZW1lKVxuICAgIGRlcml2ZWQuc3VjY2VzcyA9IGRvdE9rO1xuXG4gICAgLy8gZXJyb3I6IHJldXNlIGRvdC1iYWQgKHRoZSByZWQgb2YgdGhpcyB0aGVtZSlcbiAgICBkZXJpdmVkLmVycm9yID0gZG90QmFkO1xuXG4gICAgLy8gd2FybmluZzogd2FybSBhbWJlciwgYWRqdXN0ZWQgZm9yIGNvbnRyYXN0XG4gICAgZGVyaXZlZC53YXJuaW5nID0gaXNMaWdodCA/ICcjZDY4YTAwJyA6ICcjZjM5YzEyJztcblxuICAgIHJldHVybiBkZXJpdmVkO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEdlbmVyYXRlIGJvZHkgYmFja2dyb3VuZCBDU1MgZm9yIHVzZXIgdGhlbWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlQm9keUJhY2tncm91bmRDU1Moc2x1ZywgY29sb3JzKSB7XG4gICAgdmFyIGlzTGlnaHQgPSBjb2xvcnMubGlnaHRCZyB8fCAoY29sb3JzLmJnICYmIGhleEx1bWluYW5jZShjb2xvcnMuYmcpID4gMC40KTtcbiAgICB2YXIgYWNjZW50ID0gY29sb3JzLmFjY2VudCB8fCBjb2xvcnNbJ2FjY2VudC1zdHJvbmcnXSB8fCAnIzg4ODg4OCc7XG4gICAgdmFyIGFjY2VudFJnYiA9IGhleFRvUmdiKGFjY2VudCk7XG5cbiAgICBpZiAoaXNMaWdodCkge1xuICAgICAgcmV0dXJuICc6cm9vdC4nICsgc2x1ZyArICcgYm9keSB7XFxuJyArXG4gICAgICAgICcgIGJhY2tncm91bmQ6XFxuJyArXG4gICAgICAgICcgICAgcmFkaWFsLWdyYWRpZW50KDEyMDBweCA4MDBweCBhdCAxMCUgLTEwJSwgcmdiYSgnICsgYWNjZW50UmdiLnIgKyAnLCcgKyBhY2NlbnRSZ2IuZyArICcsJyArIGFjY2VudFJnYi5iICsgJywgLjA4KSwgdHJhbnNwYXJlbnQgNjAlKSxcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTAwMHB4IDcwMHB4IGF0IDExMCUgMTAlLCByZ2JhKCcgKyBhY2NlbnRSZ2IuciArICcsJyArIGFjY2VudFJnYi5nICsgJywnICsgYWNjZW50UmdiLmIgKyAnLCAuMDUpLCB0cmFuc3BhcmVudCA1NSUpLFxcbicgK1xuICAgICAgICAnICAgIHZhcigtLWJnKTtcXG4nICtcbiAgICAgICAgJ31cXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJzpyb290LicgKyBzbHVnICsgJyBib2R5IHtcXG4nICtcbiAgICAgICAgJyAgYmFja2dyb3VuZDpcXG4nICtcbiAgICAgICAgJyAgICByYWRpYWwtZ3JhZGllbnQoMTIwMHB4IDkwMHB4IGF0IDglIC0xMiUsIHJnYmEoJyArIGFjY2VudFJnYi5yICsgJywnICsgYWNjZW50UmdiLmcgKyAnLCcgKyBhY2NlbnRSZ2IuYiArICcsIC4xMCksIHRyYW5zcGFyZW50IDYwJSksXFxuJyArXG4gICAgICAgICcgICAgcmFkaWFsLWdyYWRpZW50KDEwMDBweCA3MDBweCBhdCAxMTAlIC0xMCUsIHJnYmEoJyArIGFjY2VudFJnYi5yICsgJywnICsgYWNjZW50UmdiLmcgKyAnLCcgKyBhY2NlbnRSZ2IuYiArICcsIC4wNyksIHRyYW5zcGFyZW50IDU1JSksXFxuJyArXG4gICAgICAgICcgICAgdmFyKC0tYmcpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEdlbmVyYXRlIGJ1dHRvbiBob3ZlciBDU1MgZm9yIHVzZXIgdGhlbWVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlQnV0dG9uSG92ZXJDU1Moc2x1ZywgY29sb3JzKSB7XG4gICAgdmFyIGlzTGlnaHQgPSBjb2xvcnMubGlnaHRCZyB8fCAoY29sb3JzLmJnICYmIGhleEx1bWluYW5jZShjb2xvcnMuYmcpID4gMC40KTtcblxuICAgIGlmIChpc0xpZ2h0KSB7XG4gICAgICByZXR1cm4gJzpyb290LicgKyBzbHVnICsgJyBidXR0b246aG92ZXIge1xcbicgK1xuICAgICAgICAnICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50LXN0cm9uZykgMTIlLCB3aGl0ZSA4OCUpO1xcbicgK1xuICAgICAgICAnICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgLjE1KTtcXG4nICtcbiAgICAgICAgJyAgYm94LXNoYWRvdzogMCAxcHggNnB4IHJnYmEoMCwgMCwgMCwgLjA4KSwgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIC44KTtcXG4nICtcbiAgICAgICAgJ31cXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJzpyb290LicgKyBzbHVnICsgJyBidXR0b246aG92ZXIge1xcbicgK1xuICAgICAgICAnICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTtcXG4nICtcbiAgICAgICAgJyAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSAzNSUsIHZhcigtLWJvcmRlcikpO1xcbicgK1xuICAgICAgICAnfVxcbic7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvcmUgdGhlbWUgZnVuY3Rpb25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGZ1bmN0aW9uIGdldFN5c3RlbVRoZW1lKCkge1xuICAgIHJldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCkge1xuICAgIFRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS0nICsgcHJvcCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzbHVnaWZ5KG5hbWUsIGN1cnJlbnRTbHVnKSB7XG4gICAgdmFyIHNsdWcgPSBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgICBpZiAoIXNsdWcpIHNsdWcgPSAnY3VzdG9tJztcbiAgICBpZiAoQlVJTFRJTl9USEVNRVMuaW5kZXhPZihzbHVnKSAhPT0gLTEpIHNsdWcgPSBzbHVnICsgJy1jdXN0b20nO1xuICAgIHZhciBjYWNoZWQgPSBzYWZlR2V0SlNPTihVU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgYmFzZSA9IHNsdWc7XG4gICAgdmFyIGNvdW50ZXIgPSAyO1xuICAgIHdoaWxlIChjYWNoZWRbc2x1Z10gJiYgc2x1ZyAhPT0gY3VycmVudFNsdWcpIHtcbiAgICAgIHNsdWcgPSBiYXNlICsgJy0nICsgY291bnRlcisrO1xuICAgIH1cbiAgICByZXR1cm4gc2x1ZztcbiAgfVxuXG4gIC8vIEluamVjdCB1c2VyIHRoZW1lcyBmcm9tIGEgdGhlbWVzIG9iamVjdCBpbnRvIERPTSArIHJ1bnRpbWVcbiAgZnVuY3Rpb24gaW5qZWN0VXNlclRoZW1lU3R5bGVzKHRoZW1lc0RhdGEpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci10aGVtZS1zdHlsZXMnKTtcbiAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpO1xuXG4gICAgVEhFTUVTLmxlbmd0aCA9IEJVSUxUSU5fVEhFTUVTLmxlbmd0aDtcbiAgICBPYmplY3Qua2V5cyhUSEVNRV9DT0xPUlMpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGlmIChCVUlMVElOX1RIRU1FUy5pbmRleE9mKGspID09PSAtMSkgZGVsZXRlIFRIRU1FX0NPTE9SU1trXTtcbiAgICB9KTtcblxuICAgIC8vIFVzZSBwcm92aWRlZCBkYXRhLCBvciBmYWxsIGJhY2sgdG8gbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgdmFyIHVzZXJUaGVtZXMgPSB0aGVtZXNEYXRhIHx8IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBzbHVncyA9IE9iamVjdC5rZXlzKHVzZXJUaGVtZXMpO1xuXG4gICAgLy8gRmlsdGVyIG91dCBhbnkgdXNlciB0aGVtZXMgdGhhdCBjb2xsaWRlIHdpdGggYnVpbHQtaW4gc2x1Z3NcbiAgICBzbHVncyA9IHNsdWdzLmZpbHRlcihmdW5jdGlvbiAocykgeyByZXR1cm4gQlVJTFRJTl9USEVNRVMuaW5kZXhPZihzKSA9PT0gLTE7IH0pO1xuXG4gICAgaWYgKCFzbHVncy5sZW5ndGgpIHJldHVybjtcblxuICAgIHZhciBjc3MgPSAnJztcbiAgICBzbHVncy5mb3JFYWNoKGZ1bmN0aW9uIChzbHVnKSB7XG4gICAgICB2YXIgdGhlbWUgPSB1c2VyVGhlbWVzW3NsdWddO1xuICAgICAgaWYgKFRIRU1FUy5pbmRleE9mKHNsdWcpID09PSAtMSkgVEhFTUVTLnB1c2goc2x1Zyk7XG5cbiAgICAgIC8vIEJ1aWxkIGNvbG9yIG1hcCBmcm9tIHNhdmVkIGRhdGFcbiAgICAgIHZhciBjb2xvck1hcCA9IHt9O1xuICAgICAgVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyBpZiAodGhlbWVbcF0pIGNvbG9yTWFwW3BdID0gdGhlbWVbcF07IH0pO1xuICAgICAgY29sb3JNYXBbJ2NhcmQtYmcnXSA9IHRoZW1lWydjYXJkLWJhc2UnXSB8fCB0aGVtZS5iZztcbiAgICAgIGlmICh0aGVtZS5saWdodEJnKSBjb2xvck1hcC5saWdodEJnID0gdHJ1ZTtcblxuICAgICAgLy8gQXV0by1kZXJpdmUgYW55IG1pc3NpbmcgZXh0ZW5kZWQgY29sb3JzXG4gICAgICB2YXIgZGVyaXZlZCA9IGRlcml2ZUV4dGVuZGVkQ29sb3JzKGNvbG9yTWFwKTtcbiAgICAgIERFUklWRURfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICBpZiAoIWNvbG9yTWFwW3BdICYmIGRlcml2ZWRbcF0pIGNvbG9yTWFwW3BdID0gZGVyaXZlZFtwXTtcbiAgICAgIH0pO1xuXG4gICAgICBUSEVNRV9DT0xPUlNbc2x1Z10gPSBjb2xvck1hcDtcblxuICAgICAgLy8gRW1pdCBtYWluIHZhcmlhYmxlIGJsb2NrXG4gICAgICBjc3MgKz0gJzpyb290LicgKyBzbHVnICsgJyB7XFxuJztcbiAgICAgIFRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgaWYgKGNvbG9yTWFwW3BdKSBjc3MgKz0gJyAgLS0nICsgcCArICc6ICcgKyBjb2xvck1hcFtwXSArICc7XFxuJztcbiAgICAgIH0pO1xuICAgICAgY3NzICs9ICd9XFxuJztcblxuICAgICAgLy8gRW1pdCBib2R5IGJhY2tncm91bmQgZ3JhZGllbnRcbiAgICAgIGNzcyArPSBnZW5lcmF0ZUJvZHlCYWNrZ3JvdW5kQ1NTKHNsdWcsIGNvbG9yTWFwKTtcblxuICAgICAgLy8gRW1pdCBidXR0b24gaG92ZXIgb3ZlcnJpZGVcbiAgICAgIGNzcyArPSBnZW5lcmF0ZUJ1dHRvbkhvdmVyQ1NTKHNsdWcsIGNvbG9yTWFwKTtcbiAgICB9KTtcblxuICAgIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUuaWQgPSAndXNlci10aGVtZS1zdHlsZXMnO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgLy8gRmV0Y2ggdGhlbWVzIGZyb20gc2VydmVyLCB1cGRhdGUgY2FjaGUsIHJlLWluamVjdCBpZiBjaGFuZ2VkXG4gIGZ1bmN0aW9uIHN5bmNUaGVtZXNGcm9tU2VydmVyKCkge1xuICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcycpLnRoZW4oZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIuanNvbigpOyB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS50aGVtZXMpIHJldHVybjtcbiAgICAgIHZhciBzZXJ2ZXJUaGVtZXMgPSBkYXRhLnRoZW1lcztcbiAgICAgIHZhciBjYWNoZWQgPSBzYWZlR2V0SlNPTihVU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICAgIC8vIE9ubHkgdXBkYXRlIGlmIGRpZmZlcmVudFxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHNlcnZlclRoZW1lcykgIT09IEpTT04uc3RyaW5naWZ5KGNhY2hlZCkpIHtcbiAgICAgICAgc2FmZVNldChVU0VSX1RIRU1FU19LRVksIEpTT04uc3RyaW5naWZ5KHNlcnZlclRoZW1lcykpO1xuICAgICAgICBpbmplY3RVc2VyVGhlbWVTdHlsZXMoc2VydmVyVGhlbWVzKTtcbiAgICAgICAgLy8gUmUtYXBwbHkgY3VycmVudCB0aGVtZSBpbiBjYXNlIGl0IHdhcyBqdXN0IHN5bmNlZFxuICAgICAgICB2YXIgY3VycmVudCA9IHNhZmVHZXQoVEhFTUVfS0VZKTtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgVEhFTUVTLmluZGV4T2YoY3VycmVudCkgIT09IC0xKSB7XG4gICAgICAgICAgYXBwbHlUaGVtZShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgfVxuXG4gIC8vIE1pZ3JhdGUgbGVnYWN5IGN1c3RvbS10aGVtZSB0byBzZXJ2ZXJcbiAgZnVuY3Rpb24gbWlncmF0ZUxlZ2FjeUN1c3RvbVRoZW1lKCkge1xuICAgIHZhciBsZWdhY3kgPSBzYWZlR2V0SlNPTihMRUdBQ1lfQ1VTVE9NX0tFWSk7XG4gICAgaWYgKCFsZWdhY3kpIHJldHVybjtcblxuICAgIHZhciBuYW1lID0gbGVnYWN5Lm5hbWUgfHwgJ0N1c3RvbSc7XG4gICAgdmFyIHNsdWcgPSBzbHVnaWZ5KG5hbWUpO1xuXG4gICAgdmFyIHRoZW1lRGF0YSA9IHsgbmFtZTogbmFtZSB9O1xuICAgIFRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChsZWdhY3lbcF0pIHRoZW1lRGF0YVtwXSA9IGxlZ2FjeVtwXTtcbiAgICB9KTtcblxuICAgIC8vIFNhdmUgdG8gbG9jYWxTdG9yYWdlIGNhY2hlIGltbWVkaWF0ZWx5XG4gICAgdmFyIGNhY2hlZCA9IHNhZmVHZXRKU09OKFVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIGNhY2hlZFtzbHVnXSA9IHRoZW1lRGF0YTtcbiAgICBzYWZlU2V0KFVTRVJfVEhFTUVTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY2FjaGVkKSk7XG5cbiAgICAvLyBVcGRhdGUgYWN0aXZlIHRoZW1lIHJlZmVyZW5jZVxuICAgIGlmIChzYWZlR2V0KFRIRU1FX0tFWSkgPT09ICdjdXN0b20nKSB7XG4gICAgICBzYWZlU2V0KFRIRU1FX0tFWSwgc2x1Zyk7XG4gICAgfVxuXG4gICAgc2FmZVJlbW92ZShMRUdBQ1lfQ1VTVE9NX0tFWSk7XG5cbiAgICAvLyBBbHNvIHB1c2ggdG8gc2VydmVyXG4gICAgdmFyIGNvbG9ycyA9IHt9O1xuICAgIFRIRU1FX1BST1BTLmZvckVhY2goZnVuY3Rpb24gKHApIHsgaWYgKHRoZW1lRGF0YVtwXSkgY29sb3JzW3BdID0gdGhlbWVEYXRhW3BdOyB9KTtcbiAgICBmZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIHNsdWcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IG5hbWUsIGNvbG9yczogY29sb3JzIH0pXG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlUaGVtZShtb2RlKSB7XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZW1lLXRyYW5zaXRpb25pbmcnKTtcblxuICAgIFRIRU1FUy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAodCAhPT0gJ2RhcmsnKSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0KTtcbiAgICB9KTtcblxuICAgIGNsZWFyQ3VzdG9tUHJvcGVydGllcygpO1xuXG4gICAgaWYgKG1vZGUgIT09ICdkYXJrJykge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQobW9kZSk7XG4gICAgfVxuXG4gICAgc2FmZVNldChUSEVNRV9LRVksIG1vZGUpO1xuXG4gICAgdmFyIGNvbG9ycyA9IFRIRU1FX0NPTE9SU1ttb2RlXTtcbiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cInRoZW1lLWNvbG9yXCJdJyk7XG4gICAgaWYgKG1ldGEgJiYgY29sb3JzKSBtZXRhLnNldEF0dHJpYnV0ZSgnY29udGVudCcsIGNvbG9ycy5iZyk7XG5cbiAgICAvLyBUb2dnbGUgbGlnaHQtYmcgY2xhc3M6IGV4cGxpY2l0IGZsYWcgZmlyc3QsIHRoZW4gYXV0by1kZXRlY3QgZnJvbSBsdW1pbmFuY2VcbiAgICB2YXIgaXNMaWdodCA9IGNvbG9ycyAmJiBjb2xvcnMubGlnaHRCZztcbiAgICBpZiAoIWlzTGlnaHQgJiYgY29sb3JzICYmIGNvbG9ycy5iZykgaXNMaWdodCA9IGhleEx1bWluYW5jZShjb2xvcnMuYmcpID4gMC40O1xuICAgIGlmIChpc0xpZ2h0KSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlnaHQtYmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2xpZ2h0LWJnJyk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndGhlbWUtdHJhbnNpdGlvbmluZycpO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICAvLyAtLS0gSW5pdGlhbGl6YXRpb24gLS0tXG4gIG1pZ3JhdGVMZWdhY3lDdXN0b21UaGVtZSgpO1xuICAvLyBJbnN0YW50IGxvYWQgZnJvbSBjYWNoZVxuICBpbmplY3RVc2VyVGhlbWVTdHlsZXMoKTtcblxuICB2YXIgc2F2ZWRUaGVtZSA9IHNhZmVHZXQoVEhFTUVfS0VZKTtcbiAgaWYgKHNhdmVkVGhlbWUgPT09ICdyZWQnKSB7IHNhdmVkVGhlbWUgPSAnYmxhY2snOyBzYWZlU2V0KFRIRU1FX0tFWSwgJ2JsYWNrJyk7IH1cbiAgaWYgKHNhdmVkVGhlbWUgJiYgc2F2ZWRUaGVtZSAhPT0gJ2RhcmsnICYmIFRIRU1FUy5pbmRleE9mKHNhdmVkVGhlbWUpID09PSAtMSkge1xuICAgIHNhdmVkVGhlbWUgPSBudWxsO1xuICB9XG4gIGFwcGx5VGhlbWUoc2F2ZWRUaGVtZSB8fCBnZXRTeXN0ZW1UaGVtZSgpKTtcblxuICAvLyBTeW5jIGZyb20gc2VydmVyIGluIGJhY2tncm91bmQgKHVwZGF0ZXMgY2FjaGUgaWYgc2VydmVyIGhhcyBuZXdlciBkYXRhKVxuICBzeW5jVGhlbWVzRnJvbVNlcnZlcigpO1xuXG4gIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIXNhZmVHZXQoVEhFTUVfS0VZKSkge1xuICAgICAgYXBwbHlUaGVtZShlLm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEV4cG9zZSBBUElcbiAgd2luZG93LlRIRU1FUyA9IFRIRU1FUztcbiAgd2luZG93LkJVSUxUSU5fVEhFTUVTID0gQlVJTFRJTl9USEVNRVM7XG4gIHdpbmRvdy5USEVNRV9DT0xPUlMgPSBUSEVNRV9DT0xPUlM7XG4gIHdpbmRvdy5USEVNRV9QUk9QUyA9IFRIRU1FX1BST1BTO1xuICB3aW5kb3cuQkFTRV9QUk9QUyA9IEJBU0VfUFJPUFM7XG4gIHdpbmRvdy5ERVJJVkVEX1BST1BTID0gREVSSVZFRF9QUk9QUztcbiAgd2luZG93LlVTRVJfVEhFTUVTX0tFWSA9IFVTRVJfVEhFTUVTX0tFWTtcbiAgd2luZG93LmFwcGx5VGhlbWUgPSBhcHBseVRoZW1lO1xuICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzID0gY2xlYXJDdXN0b21Qcm9wZXJ0aWVzO1xuICB3aW5kb3cuaW5qZWN0VXNlclRoZW1lU3R5bGVzID0gaW5qZWN0VXNlclRoZW1lU3R5bGVzO1xuICB3aW5kb3cuc3luY1RoZW1lc0Zyb21TZXJ2ZXIgPSBzeW5jVGhlbWVzRnJvbVNlcnZlcjtcbiAgd2luZG93LnNsdWdpZnlUaGVtZU5hbWUgPSBzbHVnaWZ5O1xuICB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzYWZlR2V0KFRIRU1FX0tFWSkgfHwgZ2V0U3lzdGVtVGhlbWUoKTsgfTtcbiAgd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzID0gZGVyaXZlRXh0ZW5kZWRDb2xvcnM7XG4gIHdpbmRvdy5oZXhUb1JnYiA9IGhleFRvUmdiO1xuICB3aW5kb3cucmdiVG9IZXggPSByZ2JUb0hleDtcbiAgd2luZG93LmJsZW5kQ29sb3JzID0gYmxlbmRDb2xvcnM7XG59KSgpO1xuO1xuLy8gPT09PT0gUExVR0dBQkxFIEFVVEggR0FURSAoREMtMDQ5KSA9PT09PVxuLy9cbi8vIE9uIENhZGR5IHJlZGlyZWN0IHRvID9hdXRoPXJlcXVpcmVkLCB0aGlzIG1vZHVsZSBxdWVyaWVzXG4vLyBHRVQgL2FwaS92MS9hdXRoL2xvZ2luL21ldGhvZHMgdG8gZGlzY292ZXIgd2hpY2ggQXV0aFByb3ZpZGVycyBhcmUgZW5hYmxlZC5cbi8vIElmIG9ubHkgb25lIHByb3ZpZGVyIGlzIGVuYWJsZWQsIGp1bXAgc3RyYWlnaHQgdG8gaXRzIGNoYWxsZW5nZSBVSVxuLy8gKFRPVFAtb25seSBpbnN0YWxsYXRpb25zIHRvZGF5KS4gSWYgbXVsdGlwbGUgcHJvdmlkZXJzIGV4aXN0LCByZW5kZXIgYVxuLy8gc2VsZWN0b3IgZmlyc3Qgc28gdGhlIHVzZXIgcGlja3MgaG93IHRvIHNpZ24gaW4uXG4vL1xuLy8gVG9kYXk6XG4vLyAgIC0gdG90cDogICAgY2hhbGxlbmdlIGlzIDYtZGlnaXQgY29kZSB2aWEgdGhlIGV4aXN0aW5nIFRPVFAgb3ZlcmxheVxuLy8gICAtIGVtYWlsOiAgIGNoYWxsZW5nZSBpcyBlbWFpbCBhZGRyZXNzIFx1MjE5MiBQT1NUIC9hcGkvdjEvYXV0aC9sb2dpbi9lbWFpbC9pbml0aWF0ZVxuLy8gICAgICAgICAgICAgIFx1MjE5MiBzZXJ2ZXIgZW1haWxzIG1hZ2ljIGxpbmsgKG9yIGxvZ3MgaXQgdG8gY29uc29sZSBpbiBkZXYpIFx1MjE5MlxuLy8gICAgICAgICAgICAgIHdhaXRpbmcgZm9yIHZlcmlmaWNhdGlvbiAobm8gYXV0by1wcm9tb3Rpb247IHVzZXIgcmVsb2FkcyB2aWFcbi8vICAgICAgICAgICAgICBlbWFpbCBsaW5rLCB3aGljaCByb3V0ZXMgdGhyb3VnaCAvYXBpL3YxL2F1dGgvbG9naW4vZW1haWwvdmVyaWZ5KVxuLy9cbi8vIFRoaXMgbW9kdWxlIHdpcmVzIGludG8gdGhlIGV4aXN0aW5nIHRvdHAtYXV0aC5qcyBzdWJtaXRUb3RwQ29kZSgpIGZsb3cgc29cbi8vIHRoZSBsZWdhY3kgVE9UUCBoYXBweS1wYXRoIGlzIHVuY2hhbmdlZDogd2hlbiBtZXRob2RzIHJldHVybnMgb25seVxuLy8gYHRvdHBgLCB0aGlzIG1vZHVsZSBqdXN0IHNob3dzIHRoZSBUT1RQIG92ZXJsYXkgYW5kIGV4aXRzLlxuXG4oZnVuY3Rpb24oKSB7XG4gIC8vIC0tLS0gRE9NIHJlZnMgKGNyZWF0ZWQgbGF6aWx5IGJlbG93OyBleGlzdGluZyBUT1RQIG1hcmt1cCBzdXBwbGllcyB0aGVtKSAtLS0tXG4gIGxldCBtZXRob2RzQ2FjaGUgPSBudWxsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoTWV0aG9kcygpIHtcbiAgICBpZiAobWV0aG9kc0NhY2hlKSByZXR1cm4gbWV0aG9kc0NhY2hlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hdXRoL2xvZ2luL21ldGhvZHMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgbWV0aG9kcyBIVFRQICR7cmVzLnN0YXR1c31gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgbWV0aG9kc0NhY2hlID0gQXJyYXkuaXNBcnJheShkYXRhLnByb3ZpZGVycykgPyBkYXRhLnByb3ZpZGVycyA6IFtdO1xuICAgICAgcmV0dXJuIG1ldGhvZHNDYWNoZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBQdWJsaWMgZW5kcG9pbnQgXHUyMDE0IGlmIGl0IGZhaWxzLCBmYWxsIHRocm91Z2ggdG8gbGVnYWN5IFRPVFAgcGF0aC5cbiAgICAgIGNvbnNvbGUud2FybignW2F1dGgtZ2F0ZV0gbWV0aG9kcyBmZXRjaCBmYWlsZWQ7IGZhbGxpbmcgYmFjayB0byBUT1RQLW9ubHknLCBlKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93UHJvdmlkZXJTZWxlY3Rvcihwcm92aWRlcnMpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcblxuICAgIC8vIFNhdmUgdGhlIGV4aXN0aW5nIFRPVFAtY2hhbGxlbmdlIGJvZHkgc28gd2UgY2FuIHJlc3RvcmUgaXQgb24gY2FuY2VsLlxuICAgIGNvbnN0IG9yaWdpbmFsQm9keSA9IGNhcmQuaW5uZXJIVE1MO1xuICAgIGlmICghY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSkgY2FyZC5kYXRhc2V0Lm9yaWdpbmFsQm9keSA9IG9yaWdpbmFsQm9keTtcblxuICAgIGNvbnN0IHByb3ZpZGVyQnV0dG9ucyA9IHByb3ZpZGVycy5tYXAocCA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IChwLmNvbmZpZyAmJiAocC5jb25maWcubGFiZWwgfHwgcC5uYW1lKSkgfHwgcC5uYW1lO1xuICAgICAgY29uc3QgYnRuID0gYDxidXR0b24gY2xhc3M9XCJwcm92aWRlci1idG5cIiBkYXRhLXByb3ZpZGVyPVwiJHtwLm5hbWV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW46IDZweCA0cHg7IHBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgIFNpZ24gaW4gd2l0aCAke2xhYmVsfVxuICAgICAgPC9idXR0b24+YDtcbiAgICAgIHJldHVybiBidG47XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICBjYXJkLmlubmVySFRNTCA9IGBcbiAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWRhcmtcIiBzcmM9XCIvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nXCIgYWx0PVwiRGFzaENhZGR5XCIgb25lcnJvcj1cInRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSdcIj5cbiAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWxpZ2h0XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1saWdodC5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPkNob29zZSBob3cgdG8gc2lnbiBpbjwvcD5cbiAgICAgIDxkaXYgaWQ9XCJhdXRoLWdhdGUtcHJvdmlkZXJzXCIgc3R5bGU9XCJtYXJnaW46IDE0cHggMCAxMHB4O1wiPiR7cHJvdmlkZXJCdXR0b25zfTwvZGl2PlxuICAgICAgPGRpdiBpZD1cImF1dGgtZ2F0ZS1tZXNzYWdlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPjwvZGl2PlxuICAgIGA7XG5cbiAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIFdpcmUgZWFjaCBidXR0b25cbiAgICBjYXJkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm92aWRlci1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBidG4uZGF0YXNldC5wcm92aWRlcjtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBwcm92aWRlcnMuZmluZChwID0+IHAubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIHJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlKHByb3ZpZGVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZU9yaWdpbmFsQm9keSgpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmICghb3ZlcmxheSkgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQgfHwgIWNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHkpIHJldHVybjtcbiAgICBjYXJkLmlubmVySFRNTCA9IGNhcmQuZGF0YXNldC5vcmlnaW5hbEJvZHk7XG4gICAgLy8gUmUtYmluZCB0aGUgb3JpZ2luYWwgZGlnaXQgaW5wdXQgaGFuZGxlcnMgYnkgcmUtcnVubmluZyB0aGUgdG90cC1hdXRoXG4gICAgLy8gYm9vdHN0cmFwLiBUaGUgc2ltcGxlc3QgcGF0aDogcmVsb2FkIHRoZSBwYWdlLCB3aGljaCByZS1ydW5zIGFsbCBJSUZFcy5cbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJQcm92aWRlckNoYWxsZW5nZShwcm92aWRlcikge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47XG4gICAgY29uc3QgY2FyZCA9IG92ZXJsYXkucXVlcnlTZWxlY3RvcignLnRvdHAtY2FyZCcpO1xuICAgIGlmICghY2FyZCkgcmV0dXJuO1xuXG4gICAgaWYgKHByb3ZpZGVyLm5hbWUgPT09ICd0b3RwJykge1xuICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgVE9UUCBtYXJrdXAgXHUyMTkyIGV4aXN0aW5nIHRvdHAtYXV0aC5qcyBzdWJtaXRUb3RwQ29kZVxuICAgICAgLy8gcGF0aCBoYW5kbGVzIHRoZSByZXN0LiAoUmVsb2FkIGlzIHRoZSBjbGVhbmVzdCBwYXRoIGJlY2F1c2VcbiAgICAgIC8vIHRvdHAtYXV0aC5qcyB3aXJlcyBpdHMgaW5wdXQgaGFuZGxlcnMgYXQgdG9wLWxldmVsIElJRkUgdGltZS4pXG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3ZpZGVyLm5hbWUgPT09ICdlbWFpbCcpIHtcbiAgICAgIGNhcmQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aW1nIGNsYXNzPVwidG90cC1sb2dvIHRvdHAtbG9nby1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhc2hDYWRkeVwiIG9uZXJyb3I9XCJ0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnXCI+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJ0b3RwLWxvZ28gdG90cC1sb2dvLWxpZ2h0XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1saWdodC5wbmdcIiBhbHQ9XCJEYXNoQ2FkZHlcIiBvbmVycm9yPVwidGhpcy5zdHlsZS5kaXNwbGF5PSdub25lJ1wiPlxuICAgICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+U2lnbiBpbiB3aXRoIGVtYWlsPC9wPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjogNnB4IDAgMTRweDsgZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgIFdlJ2xsIGVtYWlsIHlvdSBhIG9uZS10aW1lIHNpZ24taW4gbGluay5cbiAgICAgICAgPC9wPlxuICAgICAgICA8aW5wdXQgaWQ9XCJhdXRoLWdhdGUtZW1haWwtaW5wdXRcIiB0eXBlPVwiZW1haWxcIiBpbnB1dG1vZGU9XCJlbWFpbFwiIGF1dG9jb21wbGV0ZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwieW91QGV4YW1wbGUuY29tXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgZm9udC1zaXplOiAxcmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1pbnB1dC1iZyk7IGNvbG9yOiB2YXIoLS10ZXh0KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXV0aC1nYXRlLWVtYWlsLXN1Ym1pdFwiIGNsYXNzPVwicHJvdmlkZXItYnRuXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOTVyZW07IHdpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgIFNlbmQgc2lnbi1pbiBsaW5rXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwiYXV0aC1nYXRlLWVtYWlsLXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZm9udC1zaXplOiAwLjg1cmVtOyBsaW5lLWhlaWdodDogMS40O1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGlkPVwiYXV0aC1nYXRlLWJhY2tcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1MjE5MCBCYWNrPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWVtYWlsLWlucHV0Jyk7XG4gICAgICBjb25zdCBzdWJtaXQgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtc3VibWl0Jyk7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtc3RhdHVzJyk7XG4gICAgICBjb25zdCBiYWNrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcjYXV0aC1nYXRlLWJhY2snKTtcblxuICAgICAgc3VibWl0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbWFpbCA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgICAgc3RhdHVzLnRleHRDb250ZW50ID0gJ0VudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy4nO1xuICAgICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1lcnJvciwgI2QzMyknO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdWJtaXQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAnU2VuZGluZ1x1MjAyNic7XG4gICAgICAgIHN0YXR1cy5zdHlsZS5jb2xvciA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2F1dGgvbG9naW4vZW1haWwvaW5pdGlhdGUnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlbWFpbCB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB2aWEgPSBkYXRhLmRlbGl2ZXJlZFZpYSB8fCAnZW1haWwnO1xuICAgICAgICAgICAgY29uc3QgbWFza2VkID0gZGF0YS5tYXNrZWRFbWFpbCB8fCBlbWFpbDtcbiAgICAgICAgICAgIGlmICh2aWEgPT09ICdkZXYtY29uc29sZScpIHtcbiAgICAgICAgICAgICAgc3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICBDaGVjayB0aGUgc2VydmVyIGxvZ3MgZm9yIHlvdXIgb25lLXRpbWUgbGluay5cbiAgICAgICAgICAgICAgICAoRGV2IG1vZGU6IG5vIFNNVFAgY29uZmlndXJlZC4gSW4gcHJvZHVjdGlvbiB0aGlzIHdvdWxkIGVtYWlsIDxzdHJvbmc+JHttYXNrZWR9PC9zdHJvbmc+LilgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdHVzLmlubmVySFRNTCA9IGBTaWduLWluIGxpbmsgc2VudCB0byA8c3Ryb25nPiR7bWFza2VkfTwvc3Ryb25nPi5cbiAgICAgICAgICAgICAgICBDaGVjayB5b3VyIGluYm94IChhbmQgc3BhbSBmb2xkZXIpLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tc3VjY2VzcywgIzJhNyknO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0dXMudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICdDb3VsZCBub3Qgc2VuZCBsaW5rLic7XG4gICAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tZXJyb3IsICNkMzMpJztcbiAgICAgICAgICAgIHN1Ym1pdC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yLiBUcnkgYWdhaW4uJztcbiAgICAgICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tZXJyb3IsICNkMzMpJztcbiAgICAgICAgICBzdWJtaXQuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBzdWJtaXQuY2xpY2soKTtcbiAgICAgIH0pO1xuXG4gICAgICBiYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2hvd1Byb3ZpZGVyU2VsZWN0b3IocHJvdmlkZXJzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVua25vd24gcHJvdmlkZXIgXHUyMTkyIHJlc3RvcmUgVE9UUCBwYXRoIGFzIGEgbGFzdCByZXNvcnRcbiAgICBjb25zb2xlLndhcm4oJ1thdXRoLWdhdGVdIHVua25vd24gcHJvdmlkZXInLCBwcm92aWRlci5uYW1lKTtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzaG93KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKCFvdmVybGF5KSByZXR1cm47IC8vIFRPVFAtb25seSBidWlsZCB3aXRob3V0IG91ciBvdmVybGF5IGNoYW5nZXNcblxuICAgIGNvbnN0IHByb3ZpZGVycyA9IGF3YWl0IGZldGNoTWV0aG9kcygpO1xuICAgIGlmIChwcm92aWRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBFaXRoZXIgdGhlIGVuZHBvaW50IGlzbid0IHJlYWNoYWJsZSBPUiBubyBwcm92aWRlciByZXBvcnRzIGVuYWJsZWQuXG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGxlZ2FjeSBUT1RQIG92ZXJsYXkgXHUyMDE0IGV4aXN0aW5nIHRvdHAtYXV0aC5qcyBoYW5kbGVzIGl0LlxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykgd2luZG93Ll9zaG93VG90cE92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHByb3ZpZGVycy5sZW5ndGggPT09IDEgJiYgcHJvdmlkZXJzWzBdLm5hbWUgPT09ICd0b3RwJykge1xuICAgICAgLy8gU2luZ2xlIFRPVFAgcHJvdmlkZXIgXHUyMTkyIHNob3cgdGhlIG9yaWdpbmFsIFRPVFAgb3ZlcmxheSB1bmNoYW5nZWQsXG4gICAgICAvLyBidXQgd2l0aCBhbiBcIk9yIHNpZ24gaW4gd2l0aCBlbWFpbFwiIGxpbmsgYmVsb3cgc28gdGhlIGVtYWlsIHBhdGhcbiAgICAgIC8vIGlzIHJlYWNoYWJsZSBhcyB0aGUgcmVjb3ZlcnkgLyBwaG9uZS1mcmllbmRseSBhbHRlcm5hdGl2ZS4gTW9zdFxuICAgICAgLy8gdXNlcnMgc3RpbGwgd2FudCB0aGVpciBwcmltYXJ5IG1ldGhvZCAoVE9UUCkgZnJvbnQtYW5kLWNlbnRlci5cbiAgICAgIHNob3dUb3RwV2l0aEVtYWlsRmFsbGJhY2socHJvdmlkZXJzWzBdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2hvd1Byb3ZpZGVyU2VsZWN0b3IocHJvdmlkZXJzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dUb3RwV2l0aEVtYWlsRmFsbGJhY2sodG90cFByb3ZpZGVyKSB7XG4gICAgY29uc3QgZW1haWxFbmFibGVkID0gbWV0aG9kc0NhY2hlICYmIG1ldGhvZHNDYWNoZS5maW5kKHAgPT4gcC5uYW1lID09PSAnZW1haWwnKTtcbiAgICBpZiAoIWVtYWlsRW5hYmxlZCkge1xuICAgICAgLy8gVHJ1bHkgc2luZ2xlLXByb3ZpZGVyIHBhdGg6IGxlZ2FjeSBUT1RQIG92ZXJsYXksIG5vIGFsdCBsaW5rLlxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSA9PT0gJ2Z1bmN0aW9uJykgd2luZG93Ll9zaG93VG90cE92ZXJsYXkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLW92ZXJsYXknKTtcbiAgICBjb25zdCBjYXJkID0gb3ZlcmxheS5xdWVyeVNlbGVjdG9yKCcudG90cC1jYXJkJyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCBUT1RQIG1hcmt1cCBzbyB3ZSBjYW4gcmVzdG9yZSBvbiBhbHQtbGluayBjbGljayBvZmYuXG4gICAgaWYgKCFjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5KSBjYXJkLmRhdGFzZXQub3JpZ2luYWxCb2R5ID0gY2FyZC5pbm5lckhUTUw7XG5cbiAgICAvLyBBZGQgYSBzbWFsbCBcIm9yXCIgbGluayBhdCB0aGUgYm90dG9tIG9mIHRoZSBleGlzdGluZyBjYXJkIFdJVEhPVVRcbiAgICAvLyB0b3VjaGluZyB0aGUgVE9UUCBpbnB1dCBtYXJrdXAgXHUyMDE0IGtlZXBzIHRvdHAtYXV0aC5qcydzIHN1Ym1pdFRvdHBDb2RlXG4gICAgLy8gYmluZGluZyBpbnRhY3QuXG4gICAgbGV0IGFsdCA9IGNhcmQucXVlcnlTZWxlY3RvcignI2F1dGgtZ2F0ZS1lbWFpbC1hbHQnKTtcbiAgICBpZiAoIWFsdCkge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXYuaWQgPSAnYXV0aC1nYXRlLWVtYWlsLWFsdCc7XG4gICAgICBkaXYuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tdG9wOiAxOHB4OyBwYWRkaW5nLXRvcDogMTRweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44NXJlbTsnO1xuICAgICAgZGl2LmlubmVySFRNTCA9IGA8YSBocmVmPVwiI1wiIGlkPVwiYXV0aC1nYXRlLWVtYWlsLWFsdC1saW5rXCJcbiAgICAgICAgc3R5bGU9XCJjb2xvcjogdmFyKC0tYWNjZW50KTsgdGV4dC1kZWNvcmF0aW9uOiBub25lO1wiPlxuICAgICAgICBPciBzaWduIGluIHdpdGggZW1haWwgaW5zdGVhZCBcdTIxOTJcbiAgICAgIDwvYT5gO1xuICAgICAgY2FyZC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgZGl2LnF1ZXJ5U2VsZWN0b3IoJyNhdXRoLWdhdGUtZW1haWwtYWx0LWxpbmsnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlKGVtYWlsRW5hYmxlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICAvLyAtLS0tIFRyaWdnZXIgcG9pbnRzIC0tLS1cbiAgLy8gMS4gU1NPIHJlZGlyZWN0IGZyb20gQ2FkZHk6ID9hdXRoPXJlcXVpcmVkXG4gIC8vICAgIFdlIGNsYWltIG93bmVyc2hpcCBoZXJlIChzZXQgd2luZG93Ll9fZGNfMDQ5X2hhbmRsZWQgPSB0cnVlKVxuICAvLyAgICBCRUZPUkUgdG90cC1hdXRoLmpzJ3Mgb3duID9hdXRoPXJlcXVpcmVkIGNoZWNrIHJ1bnMsIHNvIHRoZSBsZWdhY3lcbiAgLy8gICAgVE9UUC1vbmx5IG92ZXJsYXkgZG9lc24ndCBmbGlja2VyIGluIGZvciBtdWx0aS1wcm92aWRlciBpbnN0YWxscy5cbiAgLy8gICAgU2luZ2xlLXByb3ZpZGVyIFRPVFAtb25seSBpbnN0YWxscyB3b3JrIGJlY2F1c2Ugd2Ugc3RpbGwgZGVsZWdhdGVcbiAgLy8gICAgYmFjayB0byB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpIGluIGBzaG93KClgIGJlbG93LlxuICB3aW5kb3cuX19kY18wNDlfaGFuZGxlZCA9IHRydWU7XG5cbiAgZnVuY3Rpb24gaXNBbGxvd2VkUmV0dXJuVXJsKHJldHVyblVybCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocGFyc2VkLnByb3RvY29sKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHBhcnNlZC5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gZ2xvYmFscy5qcyBpcyBjb25jYXRlbmF0ZWQgYmVmb3JlIHRoaXMgbW9kdWxlIGluIGNvcmUuanMsIHNvIFNJVEUgaXNcbiAgICAgIC8vIGF2YWlsYWJsZSBoZXJlLiBQZXJtaXQgZXhhY3QgaG9zdHMgYW5kIHN1YmRvbWFpbnMgdW5kZXIgdGhlIGNvbmZpZ3VyZWRcbiAgICAgIC8vIHByaXZhdGUgVExEIChmb3IgZXhhbXBsZSBwbGV4LnNhbWkpLCB3aGlsZSByZWplY3RpbmcgbG9va2FsaWtlcyBzdWNoIGFzXG4gICAgICAvLyBwbGV4LnNhbWkuZXZpbC5leGFtcGxlLlxuICAgICAgY29uc3Qgc3VmZml4ID0gU0lURS50bGQuc3RhcnRzV2l0aCgnLicpID8gU0lURS50bGQgOiBgLiR7U0lURS50bGR9YDtcbiAgICAgIHJldHVybiBwYXJzZWQuaG9zdG5hbWUgPT09IHN1ZmZpeC5zbGljZSgxKSB8fCBwYXJzZWQuaG9zdG5hbWUuZW5kc1dpdGgoc3VmZml4KTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgaWYgKHVybFBhcmFtcy5nZXQoJ2F1dGgnKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgIC8vIFByZXNlcnZlIHRoZSBnYXRlZCBzZXJ2aWNlIGRlc3RpbmF0aW9uIHNvIHN1Ym1pdFRvdHBDb2RlKCkgY2FuIGFwcGVuZFxuICAgIC8vIHRoZSBvbmUtdGltZSBTU08gaGFuZG9mZiB0b2tlbiBhbmQgcmV0dXJuIHRoZSBicm93c2VyIHRvIHRoYXQgaG9zdC5cbiAgICBjb25zdCByZXR1cm5VcmwgPSB1cmxQYXJhbXMuZ2V0KCdyZXR1cm4nKTtcbiAgICBpZiAocmV0dXJuVXJsICYmIGlzQWxsb3dlZFJldHVyblVybChyZXR1cm5VcmwpKSB7XG4gICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd0b3RwX3JlZGlyZWN0JywgcmV0dXJuVXJsKTsgfSBjYXRjaCAoXykge31cbiAgICB9XG4gICAgLy8gQ2xlYW4gVVJMIFx1MjAxNCBoYXBwZW5zIGFmdGVyIHdlJ3ZlIGNhcHR1cmVkIHRoZSByZWRpcmVjdFxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgLy8gU2hvdyBvbiBuZXh0IHRpY2sgc28gdGhlIERPTSAodGhlIC50b3RwLWNhcmQpIGlzIHJlYWR5XG4gICAgc2V0VGltZW91dChzaG93LCAwKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSBmb3IgaG90LXRyaWdnZXIgZnJvbSBvdGhlciBtb2R1bGVzIChlLmcuIGxvZ291dClcbiAgd2luZG93Ll9zaG93QXV0aEdhdGUgPSBzaG93O1xuICB3aW5kb3cuX2F1dGhHYXRlTWV0aG9kcyA9IGZldGNoTWV0aG9kcztcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIEFVVEhFTlRJQ0FUSU9OIEdBVEUgPT09PT1cbihmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gdXBkYXRlVG90cExvZ28oKSB7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWNhcmQnKTtcbiAgICBpZiAoIWNhcmQpIHJldHVybjtcbiAgICBjb25zdCBiZyA9IGdldENvbXB1dGVkU3R5bGUoY2FyZCkuYmFja2dyb3VuZENvbG9yO1xuICAgIGNvbnN0IG0gPSBiZy5tYXRjaCgvXFxkKy9nKTtcbiAgICBpZiAoIW0pIHJldHVybjtcbiAgICBjb25zdCBsdW0gPSAoMC4yOTkgKiArbVswXSArIDAuNTg3ICogK21bMV0gKyAwLjExNCAqICttWzJdKSAvIDI1NTtcbiAgICBjb25zdCBkYXJrID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcudG90cC1sb2dvLWRhcmsnKTtcbiAgICBjb25zdCBsaWdodCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnRvdHAtbG9nby1saWdodCcpO1xuICAgIGlmIChkYXJrKSBkYXJrLnN0eWxlLmRpc3BsYXkgPSBsdW0gPiAwLjUgPyAnbm9uZScgOiAnJztcbiAgICBpZiAobGlnaHQpIGxpZ2h0LnN0eWxlLmRpc3BsYXkgPSBsdW0gPiAwLjUgPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dUb3RwT3ZlcmxheSgpIHtcbiAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgIGlmIChvdmVybGF5KSB7XG4gICAgICBvdmVybGF5LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHNldFRpbWVvdXQodXBkYXRlVG90cExvZ28sIDUwKTtcbiAgICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBvdmVybGF5LnF1ZXJ5U2VsZWN0b3IoJy50b3RwLWRpZ2l0cyBpbnB1dCcpO1xuICAgICAgaWYgKGZpcnN0SW5wdXQpIHNldFRpbWVvdXQoKCkgPT4gZmlyc3RJbnB1dC5mb2N1cygpLCAxMDApO1xuICAgIH1cbiAgICAvLyBSZWZyZXNoIHRoZSBcIkxvc3QgYWNjZXNzP1wiIHJlY292ZXJ5IGxpbmsgdmlzaWJpbGl0eSBiYXNlZCBvbiBzZXJ2ZXIgc3RhdGUuXG4gICAgLy8gSGlkZXMgaXRzZWxmIGlmIFRPVFAgaXMgaGVhbHRoeTsgc2hvd3MgaWYgdW5yZWFkYWJsZS9jb3JydXB0LiBUaGUgdXNlclxuICAgIC8vIGNhbiBzdGlsbCBjbGljayBpdCBldmVuIHdoZW4gaGVhbHRoeSBcdTIwMTQgYnV0IHRoZSBwYW5lbCB3aWxsIGV4cGxhaW4gdGhlcmUnc1xuICAgIC8vIG5vIHJlY292ZXJ5IG5lZWRlZC4gQ2hlYXBlciB0aGFuIGdhdGluZyBpdC5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5fcmVmcmVzaFJlY292ZXJ5TGluayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGlkZVRvdHBPdmVybGF5KCkge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1vdmVybGF5Jyk7XG4gICAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRTc29IYW5kb2ZmVGFyZ2V0KHJlZGlyZWN0LCB0b2tlbikge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwocmVkaXJlY3QsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIGlmIChwYXJzZWQub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luKSByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBzdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6IGAuJHtTSVRFLnRsZH1gO1xuICAgIGNvbnN0IGlzUHJpdmF0ZUhvc3QgPSBwYXJzZWQuaG9zdG5hbWUgPT09IHN1ZmZpeC5zbGljZSgxKSB8fCBwYXJzZWQuaG9zdG5hbWUuZW5kc1dpdGgoc3VmZml4KTtcbiAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAnaHR0cHM6JyB8fCAhaXNQcml2YXRlSG9zdCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xuXG4gICAgY29uc3QgcmV0dXJuUGF0aCA9IGAke3BhcnNlZC5wYXRobmFtZX0ke3BhcnNlZC5zZWFyY2h9JHtwYXJzZWQuaGFzaH1gO1xuICAgIHBhcnNlZC5wYXRobmFtZSA9ICcvZGFzaGNhZGR5LXNzbyc7XG4gICAgcGFyc2VkLnNlYXJjaCA9ICcnO1xuICAgIHBhcnNlZC5oYXNoID0gJyc7XG4gICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoJ3Rva2VuJywgdG9rZW4pO1xuICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KCdyZXR1cm4nLCByZXR1cm5QYXRoKTtcbiAgICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvLyBTZXR1cCBkaWdpdCBpbnB1dCBVWFxuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kaWdpdHMnKTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGlucHV0cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGUudGFyZ2V0LnZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgIGUudGFyZ2V0LnZhbHVlID0gdmFsLnNsaWNlKDAsIDEpO1xuICAgICAgICBpZiAodmFsICYmIGlkeCA8IGlucHV0cy5sZW5ndGggLSAxKSBpbnB1dHNbaWR4ICsgMV0uZm9jdXMoKTtcbiAgICAgICAgY29uc3QgY29kZSA9IEFycmF5LmZyb20oaW5wdXRzKS5tYXAoaSA9PiBpLnZhbHVlKS5qb2luKCcnKTtcbiAgICAgICAgaWYgKGNvZGUubGVuZ3RoID09PSA2KSBzdWJtaXRUb3RwQ29kZShjb2RlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgaWYgKGUua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhZS50YXJnZXQudmFsdWUgJiYgaWR4ID4gMCkge1xuICAgICAgICAgIGlucHV0c1tpZHggLSAxXS5mb2N1cygpO1xuICAgICAgICAgIGlucHV0c1tpZHggLSAxXS52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHBhc3RlZCA9IChlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpIHx8ICcnKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICBpZiAocGFzdGVkLmxlbmd0aCA+PSA2KSB7XG4gICAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucCwgaSkgPT4geyBpbnAudmFsdWUgPSBwYXN0ZWRbaV0gfHwgJyc7IH0pO1xuICAgICAgICAgIGlucHV0c1s1XS5mb2N1cygpO1xuICAgICAgICAgIHN1Ym1pdFRvdHBDb2RlKHBhc3RlZC5zbGljZSgwLCA2KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3VibWl0VG90cENvZGUoY29kZSkge1xuICAgIGNvbnN0IGVycm9yRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnVmVyaWZ5aW5nLi4uJztcbiAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yIHZlcmlmeWluZyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC92ZXJpZnknLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgLy8gVXBkYXRlIGNhY2hlZCBDU1JGIHRva2VuIGZyb20gVE9UUCByZXNwb25zZSAoc2VydmVyIHJvdGF0ZXMgaXQgb24gbG9naW4pXG4gICAgICAgIGlmIChkYXRhLmNzcmZUb2tlbikge1xuICAgICAgICAgIGNzcmZUb2tlbiA9IGRhdGEuY3NyZlRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGhpZGVUb3RwT3ZlcmxheSgpO1xuICAgICAgICAvLyBDaGVjayBpZiByZWRpcmVjdGVkIGhlcmUgZnJvbSBhbm90aGVyIHNlcnZpY2VcbiAgICAgICAgY29uc3QgcmVkaXJlY3QgPSBzYWZlU2Vzc2lvbkdldCgndG90cF9yZWRpcmVjdCcpO1xuICAgICAgICBpZiAocmVkaXJlY3QpIHtcbiAgICAgICAgICB0cnkgeyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd0b3RwX3JlZGlyZWN0Jyk7IH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgICAgLy8gLnNhbWkgaXMgYW4gdW5yZWdpc3RlcmVkIFRMRCwgc28gYnJvd3NlcnMgc2lsZW50bHkgZHJvcCB0aGVcbiAgICAgICAgICAvLyBEb21haW49LnNhbWkgc2Vzc2lvbiBjb29raWUgb24gYW55IE9USEVSICouc2FtaSBzdWJkb21haW4gKHRoZXlcbiAgICAgICAgICAvLyB0cmVhdCBcInNhbWlcIiBhcyB0aGUgZWZmZWN0aXZlIHB1YmxpYyBzdWZmaXgsIHNhbWUgcHJvdGVjdGlvblxuICAgICAgICAgIC8vIHRoYXQgYmxvY2tzIGEgRG9tYWluPS5jb20gc3VwZXJjb29raWUpLiBUaGUgdGFyZ2V0IHNlcnZpY2UgY2FuJ3RcbiAgICAgICAgICAvLyBzZWUgb3VyIHNlc3Npb24gY29va2llIG5vIG1hdHRlciBob3cgaXQncyBidWlsdCwgc28gaW5zdGVhZCB3ZVxuICAgICAgICAgIC8vIGhhbmQgaXQgYSBvbmUtdGltZSB0b2tlbiBpbiB0aGUgVVJMOyBpdHMgbG9naW4gcGFnZSBleGNoYW5nZXNcbiAgICAgICAgICAvLyB0aGF0IGZvciBpdHMgb3duIGhvc3Qtb25seSBjb29raWUgdmlhIC9hdXRoL3Nzby1leGNoYW5nZS5cbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBidWlsZFNzb0hhbmRvZmZUYXJnZXQocmVkaXJlY3QsIGRhdGEuc3NvVG9rZW4pO1xuICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0YXJnZXQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluaXRpYWxpemUgZGFzaGJvYXJkXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmluaXRpYWxpemVEYXNoYm9hcmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCAnSW52YWxpZCBjb2RlJztcbiAgICAgICAgZXJyb3JFbC5jbGFzc05hbWUgPSAndG90cC1lcnJvcic7XG4gICAgICAgIGNvbnN0IGlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN0b3RwLWRpZ2l0cyBpbnB1dCcpO1xuICAgICAgICBpbnB1dHMuZm9yRWFjaChpID0+IHsgaS52YWx1ZSA9ICcnOyB9KTtcbiAgICAgICAgaW5wdXRzWzBdPy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnQ29ubmVjdGlvbiBlcnJvcic7XG4gICAgICBlcnJvckVsLmNsYXNzTmFtZSA9ICd0b3RwLWVycm9yJztcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgP2F1dGg9cmVxdWlyZWQgcmVkaXJlY3QgZnJvbSBDYWRkeSBTU08uXG4gIC8vIERDLTA0OTogaWYgdGhlIGF1dGgtZ2F0ZSBtb2R1bGUgd2lsbCBoYW5kbGUgdGhpcyAobXVsdGktcHJvdmlkZXJcbiAgLy8gaW5zdGFsbHMpLCBza2lwIG91ciBUT1RQLW9ubHkgYnJhbmNoIGVudGlyZWx5LiBTaW5nbGUtcHJvdmlkZXJcbiAgLy8gVE9UUC1vbmx5IGluc3RhbGxzIGNvbnRpbnVlIHRvIHVzZSB0aGlzIHBhdGggYmVjYXVzZSBhdXRoLWdhdGUuanNcbiAgLy8gZGVsZWdhdGVzIGJhY2sgdG8gd2luZG93Ll9zaG93VG90cE92ZXJsYXkoKS5cbiAgY29uc3QgX19kY18wNDlfc2tpcCA9ICEhKHdpbmRvdy5fX2RjXzA0OV9oYW5kbGVkKTtcbiAgaWYgKCFfX2RjXzA0OV9za2lwICYmIHVybFBhcmFtcy5nZXQoJ2F1dGgnKSA9PT0gJ3JlcXVpcmVkJykge1xuICAgIGNvbnN0IHJldHVyblVybCA9IHVybFBhcmFtcy5nZXQoJ3JldHVybicpO1xuICAgIGlmIChyZXR1cm5VcmwpIHtcbiAgICAgIC8vIFZhbGlkYXRlIHJlZGlyZWN0IFVSTDogbXVzdCBiZSBzYW1lLW9yaWdpbiBvciBob3N0bmFtZSBtdXN0IGVuZCB3aXRoIG91ciBUTERcbiAgICAgIC8vIChwcmV2ZW50cyBvcGVuIHJlZGlyZWN0IHZpYSBpbmNsdWRlcygpIGJ5cGFzcyBsaWtlIGV2aWwuY29tP3E9LnNhbWkpXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHJldHVyblVybCwgd2luZG93LmxvY2F0aW9uLm9yaWdpbik7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lO1xuICAgICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBwYXJzZWQub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgICBjb25zdCB0bGRTdWZmaXggPSBTSVRFLnRsZC5zdGFydHNXaXRoKCcuJykgPyBTSVRFLnRsZCA6ICcuJyArIFNJVEUudGxkO1xuICAgICAgICBjb25zdCBpc091clRsZCA9IGhvc3RuYW1lLmVuZHNXaXRoKHRsZFN1ZmZpeCkgfHwgaG9zdG5hbWUgPT09IHRsZFN1ZmZpeC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIGlmIChpc1NhbWVPcmlnaW4gfHwgaXNPdXJUbGQpIHtcbiAgICAgICAgICBzYWZlU2Vzc2lvblNldCgndG90cF9yZWRpcmVjdCcsIHJldHVyblVybCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgLy8gSW52YWxpZCBVUkwgXHUyMDE0IHJlamVjdCByZWRpcmVjdFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhbiBVUkxcbiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICB9XG5cbiAgd2luZG93Ll9zaG93VG90cE92ZXJsYXkgPSBzaG93VG90cE92ZXJsYXk7XG59KSgpO1xuO1xuLy8gPT09PT0gVE9UUCBSRUNPVkVSWSBGTE9XID09PT09XG4vLyBQdWJsaWMsIHVuYXV0aGVudGljYXRlZCByZWNvdmVyeSBwYXRoIGZvciB1c2VycyB3aG8gY2FuJ3QgbG9nIGluLlxuLy8gRGVzaWduZWQgZm9yIHRoZSBcImVuY3J5cHRpb24ga2V5IHJvdGF0ZWQgYW5kIGxvc3QgbXkgYXV0aGVudGljYXRvclwiIGNhc2UuXG4vLyBUaGUgZmxvdyBpczpcbi8vXG4vLyAgMS4gT24gVE9UUCBvdmVybGF5IHNob3csIGNhbGwgL2FwaS92MS90b3RwL3JlY292ZXJ5LWluZm8gKHB1YmxpYykuXG4vLyAgICAgSWYgc3RhdHVzID09PSAndW5yZWFkYWJsZScsIHNob3cgdGhlIFwiTG9zdCBhY2Nlc3M/XCIgbGluayBvbiB0aGUgb3ZlcmxheS5cbi8vICAyLiBVc2VyIGNsaWNrcyBsaW5rIFx1MjE5MiBvcGVucyByZWNvdmVyeSBwYW5lbC5cbi8vICAzLiBVc2VyIHBhc3RlcyBCYXNlMzIgc2VjcmV0IFx1MjE5MiBQT1NUIC9hcGkvdjEvdG90cC9zZXR1cCB3aXRoIHtzZWNyZXQ6IC4uLn0uXG4vLyAgICAgQmFja2VuZCBzdG9yZXMgYXMgdG90cC5wZW5kaW5nX3NlY3JldCAoZW5jcnlwdGVkIHdpdGggY3VycmVudCBrZXkpLlxuLy8gIDQuIFBhbmVsIHN3aXRjaGVzIHRvIFwidmVyaWZ5XCIgbW9kZS4gVXNlciBlbnRlcnMgYSBjb2RlIGZyb20gdGhlXG4vLyAgICAgbmV3bHktYWRkZWQgYXV0aGVudGljYXRvciBlbnRyeS4gUE9TVCAvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwXG4vLyAgICAgcHJvbW90ZXMgcGVuZGluZyBcdTIxOTIgYWN0aXZlIGFuZCBzdGFydHMgYSBzZXNzaW9uLlxuLy8gIDUuIGhpZGVUb3RwT3ZlcmxheSgpIGFuZCBpbml0aWFsaXplRGFzaGJvYXJkKCkgXHUyMDE0IHNhbWUgYXMgbm9ybWFsIGxvZ2luLlxuLy9cbi8vIFRoZSByZWNvdmVyeSBmbG93IG5ldmVyIHJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGxvZ2dlZCBpbi4gSXQgZG9lcyByZXF1aXJlXG4vLyB0aGVtIHRvIGhhdmUgdGhlaXIgQmFzZTMyIHNlY3JldCBzYXZlZCAoZS5nLiBwYXNzd29yZCBtYW5hZ2VyLCBzY3JlZW5zaG90LFxuLy8gdGhlIFwiRG93bmxvYWQgYmFja3VwIGZpbGVcIiB3ZSBvZmZlciBhdCBzZXR1cCB0aW1lIFx1MjAxNCBzZWUgdG90cC1zZXR0aW5ncy5qcykuXG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFx1MjUwMFx1MjUwMCBIZWxwZXJzIFx1MjUwMFx1MjUwMFxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFJlY292ZXJ5SW5mbygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvcmVjb3ZlcnktaW5mbycsIHsgY2FjaGU6ICduby1zdG9yZScgfSk7XG4gICAgICByZXR1cm4gYXdhaXQgci5qc29uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIHN0YXR1czogJ3Vua25vd24nLCBoaW50OiAnQ291bGQgbm90IGNvbnRhY3Qgc2VydmVyJyB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dSZWNvdmVyeUxpbmsoc2hvdykge1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1saW5rJyk7XG4gICAgaWYgKGxpbmspIGxpbmsuc3R5bGUuZGlzcGxheSA9IHNob3cgPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5SZWNvdmVyeVBhbmVsKCkge1xuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktcGFuZWwnKTtcbiAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXN0YXR1cycpO1xuICAgIGNvbnN0IGltcG9ydEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktaW1wb3J0Jyk7XG4gICAgY29uc3QgdmVyaWZ5RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS12ZXJpZnknKTtcbiAgICBpZiAoaW1wb3J0RWwpIGltcG9ydEVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAodmVyaWZ5RWwpIHZlcmlmeUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgLy8gUmVzZXQgc3RhdGVcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29uZmlybS1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3Zlcnktc2VjcmV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jb2RlJykudmFsdWUgPSAnJztcbiAgICAvLyBTaG93IGN1cnJlbnQgc3RhdHVzXG4gICAgZmV0Y2hSZWNvdmVyeUluZm8oKS50aGVuKGluZm8gPT4ge1xuICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSBpbmZvLmhpbnQgfHwgJyc7XG4gICAgICAvLyBDb2xvci1jb2RlIHRoZSBzdGF0dXMgYmFubmVyXG4gICAgICBpZiAoaW5mby5zdGF0dXMgPT09ICdoZWFsdGh5Jykge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1vay1mZywgIzdlZjJmZiknO1xuICAgICAgfSBlbHNlIGlmIChpbmZvLnN0YXR1cyA9PT0gJ3VucmVhZGFibGUnKSB7XG4gICAgICAgIHN0YXR1c0VsLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLWJhZC1mZywgI2ZmOWFhMyknO1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDYlLCB0cmFuc3BhcmVudCknO1xuICAgICAgfSBlbHNlIGlmIChpbmZvLnN0YXR1cyA9PT0gJ25vdF9jb25maWd1cmVkJykge1xuICAgICAgICBzdGF0dXNFbC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzRWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tYm9yZGVyKSc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKT8uZm9jdXMoKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VSZWNvdmVyeVBhbmVsKCkge1xuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktcGFuZWwnKTtcbiAgICBpZiAocGFuZWwpIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRSZWNvdmVyeVNlY3JldCgpIHtcbiAgICBjb25zdCBzZWNyZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1zZWNyZXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWVycm9yJyk7XG4gICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKCFzZWNyZXQpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnUGFzdGUgeW91ciBCYXNlMzIga2V5IGZpcnN0JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEvXltBLVphLXoyLTdcXHNdKz0qJC8udGVzdChzZWNyZXQpKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0ludmFsaWQgQmFzZTMyIGZvcm1hdCBcdTIwMTQgc2hvdWxkIGJlIGxldHRlcnMgQS1aIGFuZCBkaWdpdHMgMi03IG9ubHknO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBPU1QgL2FwaS92MS90b3RwL3NldHVwIHdpdGgge3NlY3JldH0gXHUyMDE0IGJhY2tlbmQgc3RvcmVzIGFzIHBlbmRpbmdcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZWNyZXQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKCFyLm9rIHx8ICFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgZGF0YS5tZXNzYWdlIHx8ICdSZXN0b3JlIGZhaWxlZCc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFN3aXRjaCBwYW5lbCB0byB2ZXJpZnkgbW9kZVxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktaW1wb3J0Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXZlcmlmeScpLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpPy5mb2N1cygpLCAxMDApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnTmV0d29yayBlcnJvciBcdTIwMTQgdHJ5IGFnYWluJztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdWJtaXRSZWNvdmVyeUNvZGUoKSB7XG4gICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvbmZpcm0tZXJyb3InKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICBpZiAoIS9eXFxkezZ9JC8udGVzdChjb2RlKSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdFbnRlciBhIDYtZGlnaXQgY29kZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUE9TVCAvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwIFx1MjAxNCBwcm9tb3RlcyBwZW5kaW5nIFx1MjE5MiBhY3RpdmUgKyBzdGFydHMgc2Vzc2lvblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC92ZXJpZnktc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2RlIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIGlmICghci5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8IGRhdGEubWVzc2FnZSB8fCAnSW52YWxpZCBjb2RlJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29kZScpLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKT8uZm9jdXMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3VjY2VzcyBcdTIwMTQgaGlkZSBldmVyeXRoaW5nIGFuZCBpbml0aWFsaXplIGRhc2hib2FyZFxuICAgICAgY2xvc2VSZWNvdmVyeVBhbmVsKCk7XG4gICAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtb3ZlcmxheScpO1xuICAgICAgaWYgKG92ZXJsYXkpIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnTmV0d29yayBlcnJvciBcdTIwMTQgdHJ5IGFnYWluJztcbiAgICB9XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgV2lyZSB1cCBoYW5kbGVycyBcdTI1MDBcdTI1MDBcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2hvdy1yZWNvdmVyeScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIG9wZW5SZWNvdmVyeVBhbmVsKCk7XG4gIH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1yZWNvdmVyeS1jbG9zZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlUmVjb3ZlcnlQYW5lbCk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXN1Ym1pdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1Ym1pdFJlY292ZXJ5U2VjcmV0KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcmVjb3ZlcnktY29uZmlybScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1Ym1pdFJlY292ZXJ5Q29kZSk7XG5cbiAgLy8gRW50ZXIga2V5IHN1Ym1pdHMgaW4gc2VjcmV0IGZpZWxkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LXNlY3JldCcpPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBzdWJtaXRSZWNvdmVyeVNlY3JldCgpOyB9XG4gIH0pO1xuICAvLyBFbnRlciBrZXkgc3VibWl0cyBpbiBjb2RlIGZpZWxkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXJlY292ZXJ5LWNvZGUnKT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7IGUucHJldmVudERlZmF1bHQoKTsgc3VibWl0UmVjb3ZlcnlDb2RlKCk7IH1cbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIFB1YmxpYyBBUEkgXHUyNTAwXHUyNTAwXG4gIC8vIENhbGxlZCBieSB0b3RwLWF1dGguanMgYWZ0ZXIgc2hvd2luZyB0aGUgb3ZlcmxheSwgc28gd2UgY2FuIGRlY2lkZSB3aGV0aGVyXG4gIC8vIHRvIHNob3cgdGhlIHJlY292ZXJ5IGxpbmsuIFdlIGRvIHRoaXMgd2l0aCBhIHB1YmxpYyBlbmRwb2ludCB0aGF0IGRvZXNuJ3RcbiAgLy8gcmVxdWlyZSBhdXRoIFx1MjAxNCBwZXJmZWN0IGZvciB0aGUgbG9ja2VkLW91dCBzdGF0ZS5cbiAgd2luZG93Ll9yZWZyZXNoUmVjb3ZlcnlMaW5rID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IGZldGNoUmVjb3ZlcnlJbmZvKCk7XG4gICAgLy8gU2hvdyB0aGUgbGluayBpbiBhbnkgbm9uLWhlYWx0aHkgc3RhdGUgKHVucmVhZGFibGUgLyBjb3JydXB0IC8gdW5rbm93bikuXG4gICAgLy8gVGhlIGhpbnQgaW5zaWRlIHRoZSBwYW5lbCB0ZWxscyB0aGUgdXNlciB3aGF0IHRoZSBhY3R1YWwgaXNzdWUgaXMuXG4gICAgaWYgKGluZm8gJiYgaW5mby5zdWNjZXNzICYmIGluZm8uc3RhdHVzICYmIGluZm8uc3RhdHVzICE9PSAnaGVhbHRoeScpIHtcbiAgICAgIHNob3dSZWNvdmVyeUxpbmsodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dSZWNvdmVyeUxpbmsoZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PSBTRVJWSUNFIENSRURFTlRJQUxTID09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgaW5qZWN0TW9kYWwoJ2ZvbGRlci1icm93c2VyLW1vZGFsJywgYDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTAwcHg7IG1heC13aWR0aDogNzAwcHg7IG1heC1oZWlnaHQ6IDgwdmg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0MyIEJyb3dzZSBmb3IgTWVkaWEgRm9sZGVyczwvaDM+XG5cbiAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1wYXRoXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuOXJlbTsgd29yZC1icmVhazogYnJlYWstYWxsO1wiPlxuICAgICAgICAvXG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImZvbGRlci1icm93c2VyLWxpc3RcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4OyBvdmVyZmxvdy15OiBhdXRvOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJmb2xkZXItYnJvd3Nlci1zZWxlY3RlZFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDEwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5TZWxlY3RlZCBmb2xkZXJzOjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWQtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZm9sZGVyLWJyb3dzZXItc2VsZWN0LWN1cnJlbnRcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5cbiAgICAgICAgICArIEFkZCBDdXJyZW50IEZvbGRlclxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJmb2xkZXItYnJvd3Nlci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZm9sZGVyLWJyb3dzZXItZG9uZVwiIHN0eWxlPVwiYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7XCI+RG9uZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnc2VydmljZS1jcmVkcy1tb2RhbCcsIGA8ZGl2IGlkPVwic2VydmljZS1jcmVkcy1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNyZWRzLWNvbnRlbnRcIj5cbiAgICAgIDxoMyBpZD1cInN2Yy1jcmVkcy10aXRsZVwiIHN0eWxlPVwibWFyZ2luOiAwIDAgNHB4OyBmb250LXNpemU6IDEuMDVyZW07XCI+U2VydmljZSBDcmVkZW50aWFsczwvaDM+XG4gICAgICA8cCBpZD1cInN2Yy1jcmVkcy1kZXNjXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDE0cHg7XCI+Q3JlZGVudGlhbHMgYXJlIGluamVjdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NpbmcgdGhpcyBzZXJ2aWNlLjwvcD5cblxuICAgICAgPCEtLSBTdGF0dXMgaW5kaWNhdG9yIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8c3BhbiBpZD1cInN2Yy1jcmVkcy1kb3RcIiBjbGFzcz1cInN0YXR1cy1kb3RcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGlkPVwic3ZjLWNyZWRzLXN0YXR1c1wiIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPk5vIGNyZWRlbnRpYWxzIHN0b3JlZDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlZWRob3N0IGNyZWRlbnRpYWxzIChzaG93biBmb3IgZXh0ZXJuYWwgc2VydmljZXMpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1zZWVkaG9zdFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPlNlZWRob3N0IExvZ2luPC9sYWJlbD5cbiAgICAgICAgPHAgY2xhc3M9XCJoaW50LW1pY3JvXCI+VXNlcm5hbWUgc2hhcmVkIGFjcm9zcyBhbGwgc2VydmljZXMuIFBhc3N3b3JkIGlzIHBlci1zZXJ2aWNlLjwvcD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzdmMtc2VlZGhvc3QtdXNlclwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWUgKHNoYXJlZClcIiBhdXRvY29tcGxldGU9XCJ1c2VybmFtZVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTBweDsgbWFyZ2luLWJvdHRvbTogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94O1wiIC8+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cInN2Yy1zZWVkaG9zdC1wYXNzXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cImN1cnJlbnQtcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1jcmVkc1wiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBBUEkgS2V5IChzaG93biBmb3IgYXJyIHNlcnZpY2VzIG9yIHNlcnZpY2VzIHdpdGggQVBJIGtleSBzdXBwb3J0KSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtYXBpa2V5XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1ib2xkXCI+QVBJIEtleTwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwiaGludC1taWNyb1wiPkJ5cGFzc2VzIHRoZSBhcHAncyBvd24gbG9naW4gc2NyZWVuPC9wPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInN2Yy1hcGlrZXktaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkFQSSBrZXlcIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFF1YWxpdHkgUHJvZmlsZSAoc2hvd24gZm9yIHJhZGFyci9zb25hcnIgb25seSkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3ZjLWNyZWRzLXF1YWxpdHlcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLWJvbGRcIj5RdWFsaXR5IFByb2ZpbGU8L2xhYmVsPlxuICAgICAgICA8cCBjbGFzcz1cImhpbnQtbWljcm9cIj5Vc2VkIHdoZW4gcmVxdWVzdGluZyB2aWEgU2VlcnI8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic3ZjLXF1YWxpdHktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRW50ZXIgQVBJIGtleSBmaXJzdCAtLTwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJzdmMtcXVhbGl0eS1mZXRjaFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjdXJzb3I6IHBvaW50ZXI7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICBGZXRjaFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInN2Yy1xdWFsaXR5LXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBtYXJnaW4tdG9wOiA0cHg7IG1pbi1oZWlnaHQ6IDFlbTtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBlci1zZXJ2aWNlIEJhc2ljIEF1dGggKHNob3duIGZvciBub24tZXh0ZXJuYWwgc2VydmljZXMpIC0tPlxuICAgICAgPGRpdiBpZD1cInN2Yy1jcmVkcy1iYXNpY1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTRweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtYm9sZFwiPlNlcnZpY2UgTG9naW48L2xhYmVsPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInN2Yy1iYXNpYy11c2VyXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZVwiIGF1dG9jb21wbGV0ZT1cInVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW4tdG9wOiA2cHg7IG1hcmdpbi1ib3R0b206IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzdmMtYmFzaWMtcGFzc1wiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJjdXJyZW50LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtY3JlZHNcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRXJyb3IgbWVzc2FnZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdmMtY3JlZHMtZXJyb3JcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZXJyb3IsICNjNjI4MjgpIDEyJSwgdHJhbnNwYXJlbnQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1lcnJvciwgI2M2MjgyOCk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+PC9kaXY+XG5cbiAgICAgIDwhLS0gQnV0dG9ucyAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogMTRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN2Yy1jcmVkcy1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA5cHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICBTYXZlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLWNyZWRzLWNsZWFyXCIgc3R5bGU9XCJwYWRkaW5nOiA5cHggMTRweDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtOyBkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIENsZWFyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3ZjLWNyZWRzLWNsb3NlXCIgc3R5bGU9XCJwYWRkaW5nOiA5cHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1jcmVkcy1tb2RhbCcpO1xuICBsZXQgY3VycmVudFNlcnZpY2UgPSBudWxsO1xuICBjb25zdCBhcnJTZXJ2aWNlcyA9IFsnc29uYXJyJywgJ3JhZGFycicsICdwcm93bGFycicsICdvdmVyc2VlcnInXTtcbiAgY29uc3QgcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcyA9IFsnc29uYXJyJywgJ3JhZGFyciddO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZpY2VVcmwoc2VydmljZSkge1xuICAgIHJldHVybiBzZXJ2aWNlLmV4dGVybmFsVXJsIHx8IHNlcnZpY2UudXJsIHx8ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZykge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1lcnJvcicpO1xuICAgIGVsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGVFcnJvcigpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtZXJyb3InKTtcbiAgICBlbC50ZXh0Q29udGVudCA9ICcnO1xuICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICB3aW5kb3cub3BlblNlcnZpY2VDcmVkc01vZGFsID0gYXN5bmMgZnVuY3Rpb24oc2VydmljZSkge1xuICAgIGN1cnJlbnRTZXJ2aWNlID0gc2VydmljZTtcbiAgICBoaWRlRXJyb3IoKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtdGl0bGUnKTtcbiAgICBjb25zdCBkZXNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1kZXNjJyk7XG4gICAgY29uc3Qgc2VlZGhvc3RTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1zZWVkaG9zdCcpO1xuICAgIGNvbnN0IGFwaWtleVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWFwaWtleScpO1xuICAgIGNvbnN0IGJhc2ljU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtYmFzaWMnKTtcbiAgICBjb25zdCBxdWFsaXR5U2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtcXVhbGl0eScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBzZXJ2aWNlLm5hbWUgKyAnIENyZWRlbnRpYWxzJztcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc2VjdGlvbnMgdG8gc2hvd1xuICAgIGNvbnN0IGlzRXh0ID0gISFzZXJ2aWNlLmlzRXh0ZXJuYWw7XG4gICAgY29uc3QgaXNBcnIgPSBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmlkKSB8fCBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmFwcFRlbXBsYXRlKTtcbiAgICBjb25zdCBoYXNRdWFsaXR5ID0gcXVhbGl0eVByb2ZpbGVTZXJ2aWNlcy5pbmNsdWRlcyhzZXJ2aWNlLmlkKSB8fCBxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHNlcnZpY2UuYXBwVGVtcGxhdGUpO1xuXG4gICAgc2VlZGhvc3RTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBpc0V4dCA/ICcnIDogJ25vbmUnO1xuICAgIGFwaWtleVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGlzQXJyID8gJycgOiAnbm9uZSc7XG4gICAgcXVhbGl0eVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9IGhhc1F1YWxpdHkgPyAnJyA6ICdub25lJztcbiAgICBiYXNpY1NlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICFpc0V4dCA/ICcnIDogJ25vbmUnO1xuXG4gICAgLy8gUmVzZXQgcXVhbGl0eSBkcm9wZG93blxuICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVudGVyIEFQSSBrZXkgZmlyc3QgLS08L29wdGlvbj4nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zdGF0dXMnKS50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKGlzRXh0KSB7XG4gICAgICBkZXNjLnRleHRDb250ZW50ID0gJ1NlZWRob3N0IGNyZWRlbnRpYWxzIGF1dG8tbG9naW4gcGFzdCB0aGUgSFRUUCBwcm9tcHQuIEFQSSBrZXkgYnlwYXNzZXMgdGhlIGFwcCBsb2dpbi4nO1xuICAgICAgLy8gVXBkYXRlIHBhc3N3b3JkIHBsYWNlaG9sZGVyIHdpdGggc2VydmljZSBuYW1lXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXNlZWRob3N0LXBhc3MnKS5wbGFjZWhvbGRlciA9IGBQYXNzd29yZCBmb3IgJHtzZXJ2aWNlLm5hbWV9YDtcbiAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICBkZXNjLnRleHRDb250ZW50ID0gJ0FQSSBrZXkgYnlwYXNzZXMgdGhlIGFwcCBsb2dpbiBzY3JlZW4gYXV0b21hdGljYWxseS4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXNjLnRleHRDb250ZW50ID0gJ0NyZWRlbnRpYWxzIGFyZSBpbmplY3RlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzaW5nIHRoaXMgc2VydmljZS4nO1xuICAgIH1cblxuICAgIC8vIExvYWQgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAgICBhd2FpdCBsb2FkU2VydmljZUNyZWRzKHNlcnZpY2UpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU2VydmljZUNyZWRzKHNlcnZpY2UpIHtcbiAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWRvdCcpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtc3RhdHVzJyk7XG4gICAgY29uc3QgY2xlYXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLWNsZWFyJyk7XG4gICAgbGV0IGhhc0NyZWRzID0gZmFsc2U7XG5cbiAgICAvLyBMb2FkIHNlZWRob3N0IGNyZWRzIChzaGFyZWQgdXNlcm5hbWUgKyBwZXItc2VydmljZSBwYXNzd29yZClcbiAgICBpZiAoc2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWVkaG9zdC1jcmVkcz9zZXJ2aWNlSWQ9JHtzZXJ2aWNlLmlkfWApO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtdXNlcicpLnZhbHVlID0gZGF0YS51c2VybmFtZSB8fCAnJztcbiAgICAgICAgICBpZiAoZGF0YS5oYXNDcmVkZW50aWFscykgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtdXNlcicpLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtc2VlZGhvc3QtcGFzcycpLnZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBwZXItc2VydmljZSBjcmVkc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke3NlcnZpY2UuaWR9L2NyZWRlbnRpYWxzYCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgaWYgKGRhdGEuaGFzQXBpS2V5KSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKS52YWx1ZSA9ICdcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjInO1xuICAgICAgICAgIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWFwaWtleS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuaGFzQmFzaWNBdXRoICYmICFzZXJ2aWNlLmlzRXh0ZXJuYWwpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXVzZXInKS52YWx1ZSA9IGRhdGEudXNlcm5hbWUgfHwgJyc7XG4gICAgICAgICAgaGFzQ3JlZHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtdXNlcicpLnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYmFzaWMtcGFzcycpKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWJhc2ljLXBhc3MnKS52YWx1ZSA9ICcnO1xuXG4gICAgLy8gTG9hZCBxdWFsaXR5IHByb2ZpbGUgZm9yIGFyciBzZXJ2aWNlc1xuICAgIGNvbnN0IHN2Y0lkID0gc2VydmljZS5pZCB8fCBzZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgIGlmIChxdWFsaXR5UHJvZmlsZVNlcnZpY2VzLmluY2x1ZGVzKHN2Y0lkKSkge1xuICAgICAgYXdhaXQgbG9hZFF1YWxpdHlQcm9maWxlcyhzZXJ2aWNlKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzQ3JlZHMpIHtcbiAgICAgIGRvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW9rLWZnLCAjNzRkZmM0KSc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcsICM3NGRmYzQpJztcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdDcmVkZW50aWFscyBzdG9yZWQnO1xuICAgICAgY2xlYXJCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgLy8gVXBkYXRlIHRoZSBjYXJkIGJ1dHRvblxuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNyZWRzLWJ0bi0ke3NlcnZpY2UuaWR9YCk7XG4gICAgICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LmFkZCgnaGFzLWNyZWRzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvdC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICBzdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICdObyBjcmVkZW50aWFscyBzdG9yZWQnO1xuICAgICAgY2xlYXJCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICAvLyBGZXRjaCBhbmQgcG9wdWxhdGUgcXVhbGl0eSBwcm9maWxlcyBkcm9wZG93blxuICBhc3luYyBmdW5jdGlvbiBsb2FkUXVhbGl0eVByb2ZpbGVzKHNlcnZpY2UpIHtcbiAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgIGNvbnN0IHF1YWxTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc3RhdHVzJyk7XG4gICAgY29uc3Qgc3ZjSWQgPSBzZXJ2aWNlLmlkIHx8IHNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgY29uc3Qgc3ZjVXJsID0gZ2V0U2VydmljZVVybChzZXJ2aWNlKTtcblxuICAgIGlmICghc3ZjVXJsKSB7XG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gc2VydmljZSBVUkwgLS08L29wdGlvbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nLi4uPC9vcHRpb24+JztcbiAgICBxdWFsU3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHNlcnZpY2U6IHN2Y0lkLCB1cmw6IHN2Y1VybCB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2Fyci9xdWFsaXR5LXByb2ZpbGVzPyR7cGFyYW1zfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnByb2ZpbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIE5vIHByb2ZpbGVzIGZvdW5kIChlbnRlciBBUEkga2V5IGFuZCBjbGljayBGZXRjaCkgLS08L29wdGlvbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgZGF0YS5wcm9maWxlcykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gcC5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gcC5uYW1lO1xuICAgICAgICBxdWFsU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZS1zZWxlY3Qgc3RvcmVkIHByb2ZpbGUgb3IgYmVzdCBtYXRjaCBmb3IgXCI3MjBcIlxuICAgICAgaWYgKGRhdGEuc3RvcmVkUHJvZmlsZUlkKSB7XG4gICAgICAgIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcoZGF0YS5zdG9yZWRQcm9maWxlSWQpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWFsU2VsZWN0LnZhbHVlKSB7XG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgNzIwcC1pc2ggcHJvZmlsZVxuICAgICAgICBjb25zdCBtYXRjaDcyMCA9IGRhdGEucHJvZmlsZXMuZmluZChwID0+IC83MjAvaS50ZXN0KHAubmFtZSkpO1xuICAgICAgICBpZiAobWF0Y2g3MjApIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcobWF0Y2g3MjAuaWQpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWFsU2VsZWN0LnZhbHVlICYmIGRhdGEucHJvZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHF1YWxTZWxlY3QudmFsdWUgPSBTdHJpbmcoZGF0YS5wcm9maWxlc1swXS5pZCk7XG4gICAgICB9XG5cbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW9rLWZnKTtcIj4ke2RhdGEucHJvZmlsZXMubGVuZ3RofSBwcm9maWxlcyBsb2FkZWQ8L3NwYW4+YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gRmFpbGVkIHRvIGxvYWQgLS08L29wdGlvbj4nO1xuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPkVycm9yOiAke2UubWVzc2FnZX08L3NwYW4+YDtcbiAgICB9XG4gIH1cblxuICAvLyBGZXRjaCBidXR0b24gZm9yIHF1YWxpdHkgcHJvZmlsZXNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LWZldGNoJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY3VycmVudFNlcnZpY2UpIHJldHVybjtcbiAgICBjb25zdCBzdmNJZCA9IGN1cnJlbnRTZXJ2aWNlLmlkIHx8IGN1cnJlbnRTZXJ2aWNlLmFwcFRlbXBsYXRlO1xuICAgIGNvbnN0IHN2Y1VybCA9IGdldFNlcnZpY2VVcmwoY3VycmVudFNlcnZpY2UpO1xuICAgIGNvbnN0IGFwaUtleUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1hcGlrZXktaW5wdXQnKTtcbiAgICBjb25zdCBhcGlLZXkgPSBhcGlLZXlJbnB1dD8udmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHF1YWxTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLXF1YWxpdHktc2VsZWN0Jyk7XG4gICAgY29uc3QgcXVhbFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtcXVhbGl0eS1zdGF0dXMnKTtcblxuICAgIGlmICghc3ZjVXJsKSB7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+Tm8gc2VydmljZSBVUkwgYXZhaWxhYmxlPC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghYXBpS2V5IHx8IGFwaUtleSA9PT0gJ1x1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMlx1MjAyMicpIHtcbiAgICAgIHF1YWxTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWVycm9yLCAjYzYyODI4KTtcIj5FbnRlciBhbiBBUEkga2V5IGZpcnN0PC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkZldGNoaW5nLi4uPC9vcHRpb24+JztcbiAgICBxdWFsU3RhdHVzLnRleHRDb250ZW50ID0gJyc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHNlcnZpY2U6IHN2Y0lkLCB1cmw6IHN2Y1VybCwgYXBpS2V5IH0pO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYXJyL3F1YWxpdHktcHJvZmlsZXM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgcXVhbFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPi0tIEVycm9yIC0tPC9vcHRpb24+JztcbiAgICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tZXJyb3IsICNjNjI4MjgpO1wiPiR7ZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGZldGNoIHByb2ZpbGVzJ308L3NwYW4+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRhdGEucHJvZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgICBxdWFsU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+LS0gTm8gcHJvZmlsZXMgZm91bmQgLS08L29wdGlvbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgZGF0YS5wcm9maWxlcykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gcC5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gcC5uYW1lO1xuICAgICAgICBxdWFsU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByZS1zZWxlY3QgNzIwcCBtYXRjaFxuICAgICAgY29uc3QgbWF0Y2g3MjAgPSBkYXRhLnByb2ZpbGVzLmZpbmQocCA9PiAvNzIwL2kudGVzdChwLm5hbWUpKTtcbiAgICAgIGlmIChtYXRjaDcyMCkgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhtYXRjaDcyMC5pZCk7XG4gICAgICBlbHNlIGlmIChkYXRhLnByb2ZpbGVzLmxlbmd0aCkgcXVhbFNlbGVjdC52YWx1ZSA9IFN0cmluZyhkYXRhLnByb2ZpbGVzWzBdLmlkKTtcblxuICAgICAgcXVhbFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiR7ZGF0YS5wcm9maWxlcy5sZW5ndGh9IHByb2ZpbGVzIGxvYWRlZDwvc3Bhbj5gO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHF1YWxTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBFcnJvciAtLTwvb3B0aW9uPic7XG4gICAgICBxdWFsU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1lcnJvciwgI2M2MjgyOCk7XCI+JHtlLm1lc3NhZ2V9PC9zcGFuPmA7XG4gICAgfVxuICB9KTtcblxuICAvLyBTYXZlIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ZjLWNyZWRzLXNhdmUnKTtcbiAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgaGlkZUVycm9yKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaXNBcnIgPSBhcnJTZXJ2aWNlcy5pbmNsdWRlcyhjdXJyZW50U2VydmljZS5pZCkgfHwgYXJyU2VydmljZXMuaW5jbHVkZXMoY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGUpO1xuICAgICAgY29uc3Qgc3ZjSWQgPSBjdXJyZW50U2VydmljZS5pZCB8fCBjdXJyZW50U2VydmljZS5hcHBUZW1wbGF0ZTtcblxuICAgICAgLy8gU2F2ZSBzZWVkaG9zdCBjcmVkcyAoc2hhcmVkIHVzZXJuYW1lICsgcGVyLXNlcnZpY2UgcGFzc3dvcmQpXG4gICAgICBpZiAoY3VycmVudFNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICBjb25zdCB1c2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC11c2VyJykudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBwYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1zZWVkaG9zdC1wYXNzJykudmFsdWU7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VlZGhvc3QtY3JlZHMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1c2VybmFtZTogdXNlciwgcGFzc3dvcmQ6IHBhc3MgfHwgdW5kZWZpbmVkLCBzZXJ2aWNlSWQ6IGN1cnJlbnRTZXJ2aWNlLmlkIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBBUEkga2V5IFx1MjAxNCBmb3IgYXJyIHNlcnZpY2VzLCB1c2UgdGhlIGFyciBjcmVkZW50aWFscyBlbmRwb2ludCAoY29ycmVjdCBuYW1lc3BhY2UpXG4gICAgICBjb25zdCBhcGlLZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtYXBpa2V5LWlucHV0Jyk7XG4gICAgICBjb25zdCBhcGlLZXkgPSBhcGlLZXlJbnB1dD8udmFsdWUudHJpbSgpO1xuICAgICAgaWYgKGFwaUtleSAmJiBhcGlLZXkgIT09ICdcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjJcdTIwMjInKSB7XG4gICAgICAgIGlmIChpc0Fycikge1xuICAgICAgICAgIC8vIFVzZSBhcnIgY3JlZGVudGlhbHMgZW5kcG9pbnQgXHUyMDE0IHZhbGlkYXRlcyBrZXksIHRlc3RzIGNvbm5lY3Rpb24sIHN0b3JlcyBpbiBhcnIuKiBuYW1lc3BhY2VcbiAgICAgICAgICBjb25zdCBzdmNVcmwgPSBnZXRTZXJ2aWNlVXJsKGN1cnJlbnRTZXJ2aWNlKTtcbiAgICAgICAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlSWQgPSBxdWFsU2VsZWN0Py52YWx1ZSA/IHBhcnNlSW50KHF1YWxTZWxlY3QudmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHF1YWxpdHlQcm9maWxlTmFtZSA9IHF1YWxTZWxlY3Q/LnNlbGVjdGVkT3B0aW9ucz8uWzBdPy50ZXh0Q29udGVudCB8fCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvY3JlZGVudGlhbHMnLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBzZXJ2aWNlOiBzdmNJZCxcbiAgICAgICAgICAgICAgYXBpS2V5LFxuICAgICAgICAgICAgICB1cmw6IHN2Y1VybCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHF1YWxpdHlQcm9maWxlSWQ6IHF1YWxpdHlQcm9maWxlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBxdWFsaXR5UHJvZmlsZU5hbWU6IHF1YWxpdHlQcm9maWxlTmFtZSB8fCB1bmRlZmluZWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNob3dFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBBUEkga2V5Jyk7XG4gICAgICAgICAgICBzYXZlQnRuLnRleHRDb250ZW50ID0gJ1NhdmUnO1xuICAgICAgICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5jb25uZWN0aW9uVGVzdCAmJiAhZGF0YS5jb25uZWN0aW9uVGVzdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICBzaG93RXJyb3IoYEFQSSBrZXkgc2F2ZWQgYnV0IGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6ICR7ZGF0YS5jb25uZWN0aW9uVGVzdC5lcnJvcn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm9uLWFyciBzZXJ2aWNlcyB1c2UgdGhlIGdlbmVyaWMgZW5kcG9pbnRcbiAgICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2N1cnJlbnRTZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2AsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFwaUtleSB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyICYmIHF1YWxpdHlQcm9maWxlU2VydmljZXMuaW5jbHVkZXMoc3ZjSWQpKSB7XG4gICAgICAgIC8vIEFQSSBrZXkgdW5jaGFuZ2VkIGJ1dCB1c2VyIG1heSBoYXZlIGNoYW5nZWQgcXVhbGl0eSBwcm9maWxlIFx1MjAxNCBzYXZlIHByb2ZpbGUgb25seVxuICAgICAgICBjb25zdCBxdWFsU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1xdWFsaXR5LXNlbGVjdCcpO1xuICAgICAgICBjb25zdCBxdWFsaXR5UHJvZmlsZUlkID0gcXVhbFNlbGVjdD8udmFsdWUgPyBwYXJzZUludChxdWFsU2VsZWN0LnZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcXVhbGl0eVByb2ZpbGVOYW1lID0gcXVhbFNlbGVjdD8uc2VsZWN0ZWRPcHRpb25zPy5bMF0/LnRleHRDb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHF1YWxpdHlQcm9maWxlSWQpIHtcbiAgICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvcXVhbGl0eS1wcm9maWxlcycsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2U6IHN2Y0lkLCBxdWFsaXR5UHJvZmlsZUlkLCBxdWFsaXR5UHJvZmlsZU5hbWUgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTYXZlIHBlci1zZXJ2aWNlIGJhc2ljIGF1dGhcbiAgICAgIGlmICghY3VycmVudFNlcnZpY2UuaXNFeHRlcm5hbCkge1xuICAgICAgICBjb25zdCB1c2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy11c2VyJykudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBwYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1iYXNpYy1wYXNzJykudmFsdWU7XG4gICAgICAgIGlmICh1c2VyICYmIHBhc3MpIHtcbiAgICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9zZXJ2aWNlcy8ke2N1cnJlbnRTZXJ2aWNlLmlkfS9jcmVkZW50aWFsc2AsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJuYW1lOiB1c2VyLCBwYXNzd29yZDogcGFzcyB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGxvYWRTZXJ2aWNlQ3JlZHMoY3VycmVudFNlcnZpY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1NlcnZpY2VDcmVkZW50aWFsc10gU2F2ZScsIGUsIHsgZnVuY3Rpb246ICdzYXZlQ3JlZGVudGlhbHMnIH0pO1xuICAgICAgc2hvd0Vycm9yKCdGYWlsZWQgdG8gc2F2ZTogJyArIChlLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InKSk7XG4gICAgfVxuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2ZSc7XG4gICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9KTtcblxuICAvLyBDbGVhciBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N2Yy1jcmVkcy1jbGVhcicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgaWYgKCFjb25maXJtKGBSZW1vdmUgc3RvcmVkIGNyZWRlbnRpYWxzIGZvciAke2N1cnJlbnRTZXJ2aWNlLm5hbWV9P2ApKSByZXR1cm47XG4gICAgaGlkZUVycm9yKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN2Y0lkID0gY3VycmVudFNlcnZpY2UuaWQgfHwgY3VycmVudFNlcnZpY2UuYXBwVGVtcGxhdGU7XG4gICAgICBjb25zdCBpc0FyciA9IGFyclNlcnZpY2VzLmluY2x1ZGVzKHN2Y0lkKTtcbiAgICAgIGlmIChjdXJyZW50U2VydmljZS5pc0V4dGVybmFsKSB7XG4gICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlZWRob3N0LWNyZWRzP3NlcnZpY2VJZD0ke2N1cnJlbnRTZXJ2aWNlLmlkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGV0ZSBmcm9tIGJvdGggbmFtZXNwYWNlc1xuICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvc2VydmljZXMvJHtjdXJyZW50U2VydmljZS5pZH0vY3JlZGVudGlhbHNgLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvYXJyL2NyZWRlbnRpYWxzLyR7c3ZjSWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGNyZWRzLWJ0bi0ke2N1cnJlbnRTZXJ2aWNlLmlkfWApO1xuICAgICAgaWYgKGJ0bikgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1jcmVkcycpO1xuICAgICAgYXdhaXQgbG9hZFNlcnZpY2VDcmVkcyhjdXJyZW50U2VydmljZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2VydmljZUNyZWRlbnRpYWxzXSBDbGVhcicsIGUsIHsgZnVuY3Rpb246ICdjbGVhckNyZWRlbnRpYWxzJyB9KTtcbiAgICAgIHNob3dFcnJvcignRmFpbGVkIHRvIGNsZWFyOiAnICsgKGUubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicpKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsb3NlIGJ1dHRvbiAvIGJhY2tkcm9wXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdmMtY3JlZHMtY2xvc2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGN1cnJlbnRTZXJ2aWNlID0gbnVsbDtcbiAgfSk7XG4gIG1vZGFsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgY3VycmVudFNlcnZpY2UgPSBudWxsO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ2hlY2sgY3JlZGVudGlhbCBzdGF0dXMgZm9yIGFsbCBzZXJ2aWNlcyBvbiBwYWdlIGxvYWQgKHVwZGF0ZSBrZXkgYnV0dG9uIGhpZ2hsaWdodHMpXG4gIHdpbmRvdy5yZWZyZXNoQ3JlZHNCdXR0b25zID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgYXBwIG9mICh3aW5kb3cuQVBQUyB8fCBbXSkpIHtcbiAgICAgICAgaWYgKCFhcHAuaXNFeHRlcm5hbCAmJiAhYXBwLmFwcFRlbXBsYXRlICYmICFhcHAudXJsKSBjb250aW51ZTtcbiAgICAgICAgbGV0IGhhc0NyZWRzID0gZmFsc2U7XG4gICAgICAgIGlmIChhcHAuaXNFeHRlcm5hbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzZWVkUmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2VlZGhvc3QtY3JlZHM/c2VydmljZUlkPSR7YXBwLmlkfWApO1xuICAgICAgICAgICAgY29uc3Qgc2VlZERhdGEgPSBhd2FpdCBzZWVkUmVzLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChzZWVkRGF0YS5zdWNjZXNzICYmIHNlZWREYXRhLmhhc0NyZWRlbnRpYWxzKSBoYXNDcmVkcyA9IHRydWU7XG4gICAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7YXBwLmlkfS9jcmVkZW50aWFsc2ApO1xuICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICBpZiAoZC5zdWNjZXNzICYmIChkLmhhc0FwaUtleSB8fCBkLmhhc0Jhc2ljQXV0aCkpIGhhc0NyZWRzID0gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY3JlZHMtYnRuLSR7YXBwLmlkfWApO1xuICAgICAgICBpZiAoYnRuKSBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnaGFzLWNyZWRzJywgaGFzQ3JlZHMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PSBUT1RQIFNFVFRJTkdTID09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgaW5qZWN0TW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnLCBgPGRpdiBpZD1cInRvdHAtc2V0dGluZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQyMHB4OyBtYXgtd2lkdGg6IDUyMHB4O1wiPlxuICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTZweDsgZm9udC1zaXplOiAxLjFyZW07XCI+QXV0aGVudGljYXRpb24gU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8IS0tIFN0YXR1cyBCYW5uZXIgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1zdGF0dXMtYmFubmVyXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwidG90cC1zdGF0dXMtZG90XCIgY2xhc3M9XCJzdGF0dXMtZG90XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBpZD1cInRvdHAtc3RhdHVzLXRleHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45cmVtO1wiPlRPVFAgaXMgbm90IGNvbmZpZ3VyZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZXR1cCBCdXR0b24gKG5vdCBjb25maWd1cmVkIHN0YXRlKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ0b3RwLXNldHVwLXNlY3Rpb25cIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtc2V0dXAtYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTJweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgIEdlbmVyYXRlIE5ldyBTZWNyZXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgbWFyZ2luOiAxMHB4IDAgMDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlci1saW5lXCI+PC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRpbnktbXV0ZWRcIj5vcjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlci1saW5lXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5JbXBvcnQgYW4gZXhpc3Rpbmcgc2VjcmV0IGtleTo8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogNnB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0b3RwLWltcG9ydC1rZXlcIiBwbGFjZWhvbGRlcj1cIlBhc3RlIHlvdXIgQmFzZTMyIGtleVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjlyZW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAxcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWltcG9ydC1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgSW1wb3J0XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwidG90cC1pbXBvcnQtZXJyb3JcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBmb250LXNpemU6IDAuOHJlbTsgbWluLWhlaWdodDogMS4yZW07IG1hcmdpbi10b3A6IDZweDtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWNyZXQgRGlzcGxheSAoc2V0dXAgZmxvdykgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1xci1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8IS0tIE1hbnVhbCBLZXkgKHByaW1hcnkgLSBmb3IgV2luQXV0aC9kZXNrdG9wIGF1dGhlbnRpY2F0b3JzKSAtLT5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDhweDtcIj5Db3B5IHRoaXMga2V5IGludG8geW91ciBhdXRoZW50aWNhdG9yIGFwcDo8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgIDxjb2RlIGlkPVwidG90cC1tYW51YWwta2V5XCIgc3R5bGU9XCJmbGV4OiAxOyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmcsICMwYjBmMWEpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMXJlbTsgZm9udC1mYW1pbHk6ICdTYW1pIEdyb3Rlc2snLCBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAycHg7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgdXNlci1zZWxlY3Q6IGFsbDsgY29sb3I6IHZhcigtLWZnKTtcIj48L2NvZGU+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtY29weS1rZXlcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgY29sb3I6IHZhcigtLWZnKTtcIiB0aXRsZT1cIkNvcHkgdG8gY2xpcGJvYXJkXCI+XHVEODNEXHVEQ0NCPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRG93bmxvYWQgYmFja3VwIGZpbGUgKHJlY292ZXJ5IGFpZCkgLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLCAjMGIwZjFhKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZsZXg6IDE7XCI+XG4gICAgICAgICAgICAgIDxzdHJvbmcgc3R5bGU9XCJjb2xvcjogdmFyKC0tZmcpO1wiPlNhdmUgYSBiYWNrdXAgZmlsZTwvc3Ryb25nPiBcdTIwMTQgaWYgeW91IGV2ZXIgbG9zZSB5b3VyIGF1dGhlbnRpY2F0b3IsXG4gICAgICAgICAgICAgIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgd2l0aG91dCBTU0ggYWNjZXNzIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwidG90cC1kb3dubG9hZC1iYWNrdXBcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cbiAgICAgICAgICAgICAgXHUyQjA3IERvd25sb2FkXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBRUiBDb2RlIChzZWNvbmRhcnkgLSBmb3IgbW9iaWxlIGFwcHMpIC0tPlxuICAgICAgICA8ZGV0YWlscyBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgICAgPHN1bW1hcnkgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlNob3cgUVIgY29kZSAoZm9yIG1vYmlsZSBhdXRoZW50aWNhdG9yIGFwcHMpPC9zdW1tYXJ5PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICAgIDxpbWcgaWQ9XCJ0b3RwLXFyLWltYWdlXCIgc3R5bGU9XCJ3aWR0aDogMTgwcHg7IGhlaWdodDogMTgwcHg7IGJvcmRlci1yYWRpdXM6IDhweDtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2RldGFpbHM+XG5cbiAgICAgICAgPCEtLSBWZXJpZnkgRmlyc3QgQ29kZSAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cImJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBwYWRkaW5nLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb250LWJvbGQtc21cIj5FbnRlciBjb2RlIHRvIGNvbmZpcm0gc2V0dXA6PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwidG90cC1zZXR1cC1jb2RlXCIgbWF4bGVuZ3RoPVwiNlwiIGlucHV0bW9kZT1cIm51bWVyaWNcIiBwYXR0ZXJuPVwiWzAtOV17Nn1cIiBwbGFjZWhvbGRlcj1cIjAwMDAwMFwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMS4zcmVtOyBwYWRkaW5nOiAxMHB4OyBmb250LWZhbWlseTogJ1NhbWkgR3JvdGVzaycsIG1vbm9zcGFjZTsgbGV0dGVyLXNwYWNpbmc6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA4cHg7IG91dGxpbmU6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJ0b3RwLWNvbmZpcm0tc2V0dXBcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDYwMDtcIj5cbiAgICAgICAgICAgICAgQ29uZmlybVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInRvdHAtc2V0dXAtZXJyb3JcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNmZjlhYTMpOyBmb250LXNpemU6IDAuOHJlbTsgbWluLWhlaWdodDogMS4yZW07IG1hcmdpbi10b3A6IDZweDtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZXNzaW9uIER1cmF0aW9uIChhY3RpdmUgc3RhdGUpIC0tPlxuICAgICAgPGRpdiBpZD1cInRvdHAtZHVyYXRpb24tc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9udC1ib2xkLXNtXCI+U2Vzc2lvbiBEdXJhdGlvbjo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwidG90cC1kdXJhdGlvbi1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW4tdG9wOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLCAjMGIwZjFhKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuOXJlbTsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxNW1cIj4xNSBtaW51dGVzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjMwbVwiPjMwIG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMWhcIj4xIGhvdXI8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMmhcIj4yIGhvdXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjRoXCI+NCBob3Vyczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI4aFwiPjggaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMTJoXCI+MTIgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjRoXCI+MjQgaG91cnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmV2ZXJcIj5OZXZlciAoZGlzYWJsZSBUT1RQKTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogNHB4IDAgMDtcIj5Ib3cgbG9uZyBiZWZvcmUgeW91IG5lZWQgdG8gcmUtZW50ZXIgeW91ciBjb2RlPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRGlzYWJsZSBCdXR0b24gKGFjdGl2ZSBzdGF0ZSkgLS0+XG4gICAgICA8ZGl2IGlkPVwidG90cC1kaXNhYmxlLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmctdG9wOiAxNnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtZGlzYWJsZS1idG5cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJhZC1mZywgI2ZmOWFhMyk7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOXJlbTtcIj5cbiAgICAgICAgICBEaXNhYmxlIFRPVFBcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSAtLT5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRvdHAtbW9kYWwtY2xvc2VcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICBDbG9zZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkVG90cFNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NvbmZpZycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IGVuYWJsZWQsIHNlc3Npb25EdXJhdGlvbiwgaXNTZXRVcCB9ID0gZGF0YS5jb25maWc7XG4gICAgICBjb25zdCBzdGF0dXNEb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zdGF0dXMtZG90Jyk7XG4gICAgICBjb25zdCBzdGF0dXNUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc3RhdHVzLXRleHQnKTtcbiAgICAgIGNvbnN0IHN0YXR1c0Jhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXN0YXR1cy1iYW5uZXInKTtcbiAgICAgIGNvbnN0IHNldHVwU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLXNlY3Rpb24nKTtcbiAgICAgIGNvbnN0IHFyU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLXNlY3Rpb24nKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWR1cmF0aW9uLXNlY3Rpb24nKTtcbiAgICAgIGNvbnN0IGRpc2FibGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtZGlzYWJsZS1zZWN0aW9uJyk7XG5cbiAgICAgIGlmIChlbmFibGVkICYmIGlzU2V0VXApIHtcbiAgICAgICAgc3RhdHVzRG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tb2stZmcsICM3ZWYyZmYpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICAgIHN0YXR1c0Jhbm5lci5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1vay1mZykgOCUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSAnVE9UUCBpcyBhY3RpdmUnO1xuICAgICAgICBzdGF0dXNUZXh0LnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnLCAjN2VmMmZmKSc7XG4gICAgICAgIC8vIEtlZXAgdGhlIHNldHVwIHNlY3Rpb24gdmlzaWJsZSAoY29sbGFwc2VkKSBzbyB0aGUgXCJJbXBvcnQgZXhpc3RpbmdcbiAgICAgICAgLy8gc2VjcmV0XCIgb3B0aW9uIGlzIGFsd2F5cyByZWFjaGFibGUgXHUyMDE0IHVzZXJzIG1heSBuZWVkIHRvIHJlLWVucm9sbFxuICAgICAgICAvLyB0aGVpciBhdXRoZW50aWNhdG9yIHdpdGggdGhlIHNhbWUgc2VjcmV0IGZyb20gYSBiYWNrdXAgZmlsZS5cbiAgICAgICAgc2V0dXBTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBjb25zdCBzZXR1cEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWJ0bicpO1xuICAgICAgICBpZiAoc2V0dXBCdG4pIHNldHVwQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlIE5ldyBTZWNyZXQnO1xuICAgICAgICAvLyBIaWRlIHRoZSBRUiBzZWN0aW9uIGJ5IGRlZmF1bHQgaW4gdGhlIGFjdGl2ZSBzdGF0ZSBcdTIwMTQgc2V0dXBCdG4gY2xpY2sgc2hvd3MgaXRcbiAgICAgICAgcXJTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGR1cmF0aW9uU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZGlzYWJsZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWR1cmF0aW9uLXNlbGVjdCcpLnZhbHVlID0gc2Vzc2lvbkR1cmF0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzRG90LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgICAgc3RhdHVzQmFubmVyLnN0eWxlLmJvcmRlckNvbG9yID0gJ3ZhcigtLWJvcmRlciknO1xuICAgICAgICBzdGF0dXNCYW5uZXIuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSAnVE9UUCBpcyBub3QgY29uZmlndXJlZCc7XG4gICAgICAgIHN0YXR1c1RleHQuc3R5bGUuY29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICAgICAgc2V0dXBTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBxclNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgZHVyYXRpb25TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRpc2FibGVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgQXV0aCBjYXJkIGluIHRoZSB0b3Agcm93XG4gICAgICB1cGRhdGVBdXRoQ2FyZChlbmFibGVkICYmIGlzU2V0VXAsIHNlc3Npb25EdXJhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBUT1RQIHNldHRpbmdzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIER1cmF0aW9uIGxhYmVsIGhlbHBlclxuICBjb25zdCBEVVJBVElPTl9MQUJFTFMgPSB7XG4gICAgJzE1bSc6ICcxNSBtaW4nLCAnMzBtJzogJzMwIG1pbicsICcxaCc6ICcxIGhvdXInLCAnMmgnOiAnMiBob3VycycsXG4gICAgJzRoJzogJzQgaG91cnMnLCAnOGgnOiAnOCBob3VycycsICcxMmgnOiAnMTIgaG91cnMnLCAnMjRoJzogJzI0IGhvdXJzJywgJ25ldmVyJzogJ0Rpc2FibGVkJ1xuICB9O1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZUF1dGhDYXJkKGFjdGl2ZSwgZHVyYXRpb24pIHtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtY2FyZCcpO1xuICAgIGNvbnN0IHBpbGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1waWxsJyk7XG4gICAgY29uc3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtZG90Jyk7XG4gICAgY29uc3Qgc3RhdHVzVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXN0YXR1cy10ZXh0Jyk7XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCAnb24nKTtcbiAgICAgIHBpbGwuY2xhc3NOYW1lID0gJ2JhZGdlIG9uJztcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSAnWUVTJztcbiAgICAgIGRvdC5jbGFzc05hbWUgPSAnZG90IG9rIGF0LWJsJztcbiAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSAnU2Vzc2lvbjogJyArIChEVVJBVElPTl9MQUJFTFNbZHVyYXRpb25dIHx8IGR1cmF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpO1xuICAgICAgcGlsbC5jbGFzc05hbWUgPSAnYmFkZ2Ugb2ZmJztcbiAgICAgIHBpbGwudGV4dENvbnRlbnQgPSAnTk8nO1xuICAgICAgZG90LmNsYXNzTmFtZSA9ICdkb3QgYmFkIGF0LWJsJztcbiAgICAgIHN0YXR1c1RleHQudGV4dENvbnRlbnQgPSAnTm90IGNvbmZpZ3VyZWQnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHVwIGJ1dHRvbiAoZ2VuZXJhdGUgbmV3IHNlY3JldClcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS90b3RwL3NldHVwJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1pbWFnZScpLnNyYyA9IGRhdGEucXJDb2RlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQgPSBkYXRhLm1hbnVhbEtleTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtc2VjdGlvbicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXFyLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLnZhbHVlID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWVycm9yJykudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtY29kZScpLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gU2V0dXAgRmFpbGVkJywgZSwgeyBmdW5jdGlvbjogJ3NldHVwVE9UUCcgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBJbXBvcnQgZXhpc3Rpbmcgc2VjcmV0IGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1pbXBvcnQtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNlY3JldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWltcG9ydC1rZXknKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgZXJyb3JFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWltcG9ydC1lcnJvcicpO1xuICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdQYXN0ZSBhIEJhc2UzMiBzZWNyZXQga2V5IGZpcnN0JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvc2V0dXAnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZWNyZXQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtcXItaW1hZ2UnKS5zcmMgPSBkYXRhLnFyQ29kZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbWFudWFsLWtleScpLnRleHRDb250ZW50ID0gZGF0YS5tYW51YWxLZXk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLXNlY3Rpb24nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1xci1zZWN0aW9uJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR1cC1lcnJvcicpLnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgZGF0YS5tZXNzYWdlIHx8ICdJbXBvcnQgZmFpbGVkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ0Nvbm5lY3Rpb24gZXJyb3IgXHUyMDE0IHRyeSByZWZyZXNoaW5nIHRoZSBwYWdlJztcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENvcHkga2V5IGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb3B5LWtleScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQ7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoa2V5KS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvcHkta2V5Jyk7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1JztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0NCJzsgfSwgMjAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIERvd25sb2FkIGJhY2t1cCBmaWxlIFx1MjAxNCBwbGFpbiBKU09OIHNvIGl0IHJvdW5kLXRyaXBzIHRocm91Z2ggYW55IHBhc3N3b3JkXG4gIC8vIG1hbmFnZXIsIGNsb3VkIGJhY2t1cCwgb3IgcHJpbnRlZCBwYXBlci4gVGhlIHNlY3JldCBJUyByZWNvdmVyYWJsZSBwbGFpbnRleHRcbiAgLy8gKHRoYXQncyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIGJhY2t1cCksIHNvIHdhcm4gdGhlIHVzZXIgYW5kIHJlbHkgb25cbiAgLy8gdGhlbSB0byBrZWVwIGl0IHNhZmUuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRvd25sb2FkLWJhY2t1cCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBzZWNyZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1tYW51YWwta2V5JykudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIGlmICghc2VjcmV0KSByZXR1cm47XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNlcnZpY2U6ICdEYXNoQ2FkZHknLFxuICAgICAgdHlwZTogJ3RvdHAtc2VjcmV0JyxcbiAgICAgIHNlY3JldDogc2VjcmV0LFxuICAgICAgaXNzdWVyOiAnRGFzaENhZGR5JyxcbiAgICAgIGFsZ29yaXRobTogJ1NIQTEnLFxuICAgICAgZGlnaXRzOiA2LFxuICAgICAgcGVyaW9kOiAzMCxcbiAgICAgIGlzc3VlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLy8gUmVjb3ZlcnkgaW5zdHJ1Y3Rpb25zIGJha2VkIGludG8gdGhlIGZpbGUgc28gYSB5ZWFyIGZyb20gbm93IHRoZVxuICAgICAgLy8gdXNlciAob3IgdGhlaXIgZnV0dXJlIHNlbGYpIGtub3dzIHdoYXQgdGhpcyBmaWxlIGlzIGFuZCBob3cgdG8gdXNlIGl0LlxuICAgICAgcmVjb3ZlcnlfdXJsOiBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufS8gIChsb2dpbiBzY3JlZW4gXHUyMTkyIFwiTG9zdCBhY2Nlc3M/XCIpYCxcbiAgICAgIG5vdGU6ICdLZWVwIHRoaXMgZmlsZSBzb21ld2hlcmUgc2FmZS4gQW55b25lIHdpdGggdGhpcyBzZWNyZXQgY2FuIGdlbmVyYXRlIHlvdXIgbG9naW4gY29kZXMuIFVzZSBpdCBPTkxZIHRvIHJlY292ZXIgVE9UUCBhY2Nlc3MgdmlhIHRoZSBcIkxvc3QgYWNjZXNzP1wiIGxpbmsgb24gdGhlIERhc2hDYWRkeSBsb2dpbiBzY3JlZW4uJ1xuICAgIH07XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShwYXlsb2FkLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGBkYXNoY2FkZHktdG90cC1iYWNrdXAtJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApfS5qc29uYDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kb3dubG9hZC1iYWNrdXAnKTtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IFNhdmVkJztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1x1MkIwNyBEb3dubG9hZCc7IH0sIDIwMDApO1xuICB9KTtcblxuICAvLyBDb25maXJtIHNldHVwXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWNvbmZpcm0tc2V0dXAnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKS52YWx1ZTtcbiAgICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtc2V0dXAtZXJyb3InKTtcbiAgICBpZiAoIS9eXFxkezZ9JC8udGVzdChjb2RlKSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdFbnRlciBhIDYtZGlnaXQgY29kZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvdmVyaWZ5LXNldHVwJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29kZSB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBsb2FkVG90cFNldHRpbmdzKCk7IC8vIFVwZGF0ZXMgYm90aCBtb2RhbCBhbmQgY2FyZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9IGRhdGEuZXJyb3IgfHwgJ0ludmFsaWQgY29kZSc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW9uIGVycm9yJztcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFsbG93IEVudGVyIGtleSBvbiBzZXR1cCBjb2RlIGlucHV0XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLXNldHVwLWNvZGUnKT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1jb25maXJtLXNldHVwJyk/LmNsaWNrKCk7XG4gIH0pO1xuXG4gIC8vIER1cmF0aW9uIGNoYW5nZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1kdXJhdGlvbi1zZWxlY3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXNzaW9uRHVyYXRpb246IGUudGFyZ2V0LnZhbHVlIH0pXG4gICAgICB9KTtcbiAgICAgIGxvYWRUb3RwU2V0dGluZ3MoKTsgLy8gUmVmcmVzaCBtb2RhbCArIGNhcmQgKGhhbmRsZXMgXCJuZXZlclwiIGRpc2FibGluZyBUT1RQKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbVE9UUF0gVXBkYXRlIFNlc3Npb24gRHVyYXRpb24nLCBlcnIsIHsgZnVuY3Rpb246ICd1cGRhdGVTZXNzaW9uRHVyYXRpb24nIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRGlzYWJsZSBUT1RQXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3RwLWRpc2FibGUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlybSgnRGlzYWJsZSBUT1RQIGF1dGhlbnRpY2F0aW9uPyBBbGwgc2VydmljZXMgd2lsbCBiZSBhY2Nlc3NpYmxlIHdpdGhvdXQgYSBjb2RlLicpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3RvdHAvZGlzYWJsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiAne30nXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcykgbG9hZFRvdHBTZXR0aW5ncygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIERpc2FibGUgRmFpbGVkJywgZSwgeyBmdW5jdGlvbjogJ2Rpc2FibGVUT1RQJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE9wZW4gc2V0dGluZ3MgbW9kYWwgZnJvbSBBdXRoIGNhcmRcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtc2V0dGluZ3MtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRUb3RwU2V0dGluZ3MoKTtcbiAgICBvcGVuTW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2Ugc2V0dGluZ3MgbW9kYWxcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdHAtbW9kYWwtY2xvc2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2xvc2VNb2RhbCgndG90cC1zZXR0aW5ncy1tb2RhbCcpO1xuICB9KTtcblxuICAvLyBCYWNrZHJvcCBjbGljayB0byBjbG9zZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG90cC1zZXR0aW5ncy1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAndG90cC1zZXR0aW5ncy1tb2RhbCcpIHtcbiAgICAgIGNsb3NlTW9kYWwoJ3RvdHAtc2V0dGluZ3MtbW9kYWwnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSBhdXRoIGNhcmQgb24gcGFnZSBsb2FkXG4gIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQgPSB1cGRhdGVBdXRoQ2FyZDtcbiAgKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBhY3RpdmUgPSBkYXRhLmNvbmZpZy5lbmFibGVkICYmIGRhdGEuY29uZmlnLmlzU2V0VXA7XG4gICAgICAgIHVwZGF0ZUF1dGhDYXJkKGFjdGl2ZSwgZGF0YS5jb25maWcuc2Vzc2lvbkR1cmF0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IGVycm9ySGFuZGxlci5sb2dFcnJvcignW1RPVFBdIEF1dGhDYXJkIFVwZGF0ZScsIGUsIHsgZnVuY3Rpb246ICdhdXRoQ2FyZFVwZGF0ZScgfSk7IH1cbiAgfSkoKTtcblxufSkoKTtcbjtcbi8qKlxuICogQWRtaW4gcGFuZWwgXHUyMDE0IERDLTA0OC5cbiAqXG4gKiBNaW5pbWFsIGFkbWluIFVJIGZvciBtYW5hZ2luZyB1c2VycyArIGludml0ZXMuIFJlbmRlcmVkIGFzIGEgbW9kYWwgb3ZlcmxheVxuICogdHJpZ2dlcmVkIGJ5IGFuIFwiQWRtaW5cIiBidXR0b24gaW4gdGhlIHRvcCBiYXIgdGhhdCBvbmx5IGFwcGVhcnMgd2hlblxuICogL2FwaS92MS9hdXRoL21lIHJldHVybnMgaXNBZG1pbj10cnVlLiBUaGUgcGFuZWwgcmVuZGVycyB0aHJlZSBzZWN0aW9uczpcbiAqXG4gKiAgIDEuIFVzZXJzIFx1MjAxNCBsaXN0IG9mIGF1dGhvcml6ZWQgdXNlcnMgd2l0aCByb2xlIGJhZGdlcywgcm9sZS1lZGl0LFxuICogICAgICBkZWxldGUgYWN0aW9ucy5cbiAqICAgMi4gSW52aXRlIGEgdXNlciBcdTIwMTQgZm9ybSB0byBpc3N1ZSBhIHNpbmdsZS11c2UgaW52aXRlIChlbWFpbCwgcm9sZSxcbiAqICAgICAgVFRMKS4gVGhlIGFjY2VwdC1saW5rIGlzIHNob3duIHBvc3QtaXNzdWUgc28gdGhlIGFkbWluIGNhbiBjb3B5IGl0LlxuICogICAzLiBPdXRzdGFuZGluZyBpbnZpdGVzIFx1MjAxNCBsaXN0IG9mIGlzc3VlZC1ub3QteWV0LWFjY2VwdGVkIGludml0ZXNcbiAqICAgICAgd2l0aCBhIHJldm9rZSBidXR0b24uXG4gKlxuICogVGhlIHBhbmVsIGRvZXMgTk9UIGFkZCBhIHRhYiB0byB0aGUgZGFzaGJvYXJkIG5hdiBcdTIwMTQgaXQgbGl2ZXMgYXMgYSBtb2RhbFxuICogdG8ga2VlcCBEQy0wNDggc3VyZ2ljYWwuIEZ1dHVyZSBEQy0wNDkgd29yayBjYW4gcHJvbW90ZSBpdCB0byBhIHRhYi5cbiAqXG4gKiBCZWhhdmlvdXI6XG4gKiAgIC0gT24gbG9hZDogR0VUIC9tZTsgaWYgIWlzQWRtaW4gXHUyMTkyIHNob3cgXCJhZG1pbiBvbmx5XCIgcGxhY2Vob2xkZXJcbiAqICAgLSBUaGVuIEdFVCAvYWRtaW4vdXNlcnMgKyAvYWRtaW4vaW52aXRlcyBpbiBwYXJhbGxlbFxuICogICAtIEZvcm1zIFBPU1QgdG8gdGhlIGFkbWluIGVuZHBvaW50cywgcmVmcmVzaCBsaXN0cyBvbiBzdWNjZXNzXG4gKiAgIC0gXCJDb3B5IGxpbmtcIiBidXR0b24gd3JpdGVzIHRoZSBhY2NlcHRVcmwgdG8gdGhlIGNsaXBib2FyZFxuICpcbiAqIFdpcmVzIGludG8gdGhlIGdsb2JhbCBlcnJvci1oYW5kbGVyICh3aW5kb3cuZXJyb3JIYW5kbGVyKSBmb3IgZmFpbHVyZVxuICogc3VyZmFjZXMuIFVzZXMgd2luZG93LlNJVEUgZm9yIGFueSBVSSBjb25zdGFudHMgKG5vbmUgY3VycmVudGx5KS5cbiAqL1xuXG4oZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgQVBJID0ge1xuICAgIG1lOiAnL2FwaS92MS9hdXRoL21lJyxcbiAgICB1c2VyczogJy9hcGkvdjEvYXV0aC9hZG1pbi91c2VycycsXG4gICAgYWxsb3dsaXN0OiAnL2FwaS92MS9hdXRoL2FkbWluL2FsbG93bGlzdCcsXG4gICAgaW52aXRlczogJy9hcGkvdjEvYXV0aC9hZG1pbi9pbnZpdGVzJyxcbiAgfTtcblxuICBmdW5jdGlvbiBfZWwodGFnLCBhdHRycywgLi4uY2hpbGRyZW4pIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICAgIGlmIChhdHRycykge1xuICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGF0dHJzKSkge1xuICAgICAgICBjb25zdCB2ID0gYXR0cnNba107XG4gICAgICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBmYWxzZSkgY29udGludWU7XG4gICAgICAgIGlmIChrID09PSAnY2xhc3MnKSBub2RlLmNsYXNzTmFtZSA9IHY7XG4gICAgICAgIGVsc2UgaWYgKGsgPT09ICd0ZXh0Jykgbm9kZS50ZXh0Q29udGVudCA9IHY7XG4gICAgICAgIGVsc2UgaWYgKGsgPT09ICdodG1sJykgbm9kZS5pbm5lckhUTUwgPSB2O1xuICAgICAgICBlbHNlIGlmIChrLnN0YXJ0c1dpdGgoJ29uJykgJiYgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihrLnNsaWNlKDIpLnRvTG93ZXJDYXNlKCksIHYpO1xuICAgICAgICBlbHNlIG5vZGUuc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGMgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjID09PSBudWxsIHx8IGMgPT09IHVuZGVmaW5lZCB8fCBjID09PSBmYWxzZSkgY29udGludWU7XG4gICAgICBpZiAodHlwZW9mIGMgPT09ICdzdHJpbmcnKSBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGMpKTtcbiAgICAgIGVsc2Ugbm9kZS5hcHBlbmRDaGlsZChjKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBfZmV0Y2hKU09OKHVybCwgb3B0cykge1xuICAgIGNvbnN0IGNzcmYgPSAod2luZG93LlNJVEUgJiYgd2luZG93LlNJVEUuY3NyZlRva2VuKSB8fCAnJztcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBvcHRzLmhlYWRlcnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBvcHRzLmhlYWRlcnMgfHwge30sXG4gICAgICBjc3JmID8geyAnWC1DU1JGLVRva2VuJzogY3NyZiB9IDoge31cbiAgICApO1xuICAgIGlmIChvcHRzLmJvZHkgJiYgdHlwZW9mIG9wdHMuYm9keSAhPT0gJ3N0cmluZycpIG9wdHMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdHMuYm9keSk7XG4gICAgY29uc3QgciA9IGF3YWl0IGZldGNoKHVybCwgb3B0cyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgIGlmICghci5vaykge1xuICAgICAgY29uc3QgbXNnID0gKGRhdGEgJiYgKGRhdGEubWVzc2FnZSB8fCBkYXRhLmVycm9yKSkgfHwgKCdIVFRQICcgKyByLnN0YXR1cyk7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobXNnKTtcbiAgICAgIGVyci5zdGF0dXMgPSByLnN0YXR1cztcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVyQmFkZ2Uocm9sZSkge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgIGFkbWluOiAnYmFja2dyb3VuZDojN2MzYWVkO2NvbG9yOiNmZmYnLFxuICAgICAgb3BlcmF0b3I6ICdiYWNrZ3JvdW5kOiMyNTYzZWI7Y29sb3I6I2ZmZicsXG4gICAgICB2aWV3ZXI6ICdiYWNrZ3JvdW5kOiM2YjcyODA7Y29sb3I6I2ZmZicsXG4gICAgfTtcbiAgICByZXR1cm4gX2VsKCdzcGFuJywge1xuICAgICAgY2xhc3M6ICdyb2xlLWJhZGdlJyxcbiAgICAgIHN0eWxlOiAnZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggOHB4O2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZTowLjc1cmVtO2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7JyArXG4gICAgICAgIChjb2xvcnNbcm9sZV0gfHwgY29sb3JzLnZpZXdlciksXG4gICAgICB0ZXh0OiByb2xlLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlclVzZXJzTGlzdChjb250YWluZXIsIHVzZXJzLCBvbkNoYW5nZSkge1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBpZiAoIXVzZXJzIHx8IHVzZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHsgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiAnTm8gdXNlcnMgeWV0LicgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IF9lbCgndGFibGUnLCB7XG4gICAgICBzdHlsZTogJ3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2ZvbnQtc2l6ZTowLjlyZW0nLFxuICAgIH0pO1xuICAgIHRhYmxlLmFwcGVuZENoaWxkKF9lbCgndGhlYWQnLCBudWxsLFxuICAgICAgX2VsKCd0cicsIHsgc3R5bGU6ICdib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpJyB9LFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdFbWFpbCcgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ1JvbGUnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdDcmVhdGVkJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnTGFzdCBsb2dpbicgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nOjhweCcsIHRleHQ6ICdBY3Rpb25zJyB9KSxcbiAgICAgICksXG4gICAgKSk7XG4gICAgY29uc3QgdGJvZHkgPSBfZWwoJ3Rib2R5Jyk7XG4gICAgZm9yIChjb25zdCB1IG9mIHVzZXJzKSB7XG4gICAgICBjb25zdCByb3cgPSBfZWwoJ3RyJywgeyBzdHlsZTogJ2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlciknIH0pO1xuXG4gICAgICBjb25zdCBlbWFpbENlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4JyB9KTtcbiAgICAgIGVtYWlsQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ3NwYW4nLCB7IHRleHQ6IHUuZW1haWwgfHwgJyhubyBlbWFpbCknIH0pKTtcbiAgICAgIGlmICh1LmRpc3BsYXlOYW1lICYmIHUuZGlzcGxheU5hbWUgIT09ICh1LmVtYWlsIHx8ICcnKS5zcGxpdCgnQCcpWzBdKSB7XG4gICAgICAgIGVtYWlsQ2VsbC5hcHBlbmRDaGlsZChfZWwoJ2JyJykpO1xuICAgICAgICBlbWFpbENlbGwuYXBwZW5kQ2hpbGQoX2VsKCdzbWFsbCcsIHtcbiAgICAgICAgICBzdHlsZTogJ2NvbG9yOnZhcigtLW11dGVkKScsIHRleHQ6IHUuZGlzcGxheU5hbWUsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbWFpbENlbGwpO1xuXG4gICAgICBjb25zdCByb2xlQ2VsbCA9IF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHgnIH0pO1xuICAgICAgcm9sZUNlbGwuYXBwZW5kQ2hpbGQoX3JlbmRlckJhZGdlKHUucm9sZSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKHJvbGVDZWxsKTtcblxuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7XG4gICAgICAgIHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICAgICAgdGV4dDogdS5jcmVhdGVkQXQgPyBuZXcgRGF0ZSh1LmNyZWF0ZWRBdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOiAnXHUyMDE0JyxcbiAgICAgIH0pKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChfZWwoJ3RkJywge1xuICAgICAgICBzdHlsZTogJ3BhZGRpbmc6OHB4O2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MC44NXJlbScsXG4gICAgICAgIHRleHQ6IHUubGFzdExvZ2luQXQgPyBuZXcgRGF0ZSh1Lmxhc3RMb2dpbkF0KS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCcsXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IGFjdGlvbnNDZWxsID0gX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweDt0ZXh0LWFsaWduOnJpZ2h0JyB9KTtcbiAgICAgIGNvbnN0IHJvbGVTZWxlY3QgPSBfZWwoJ3NlbGVjdCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjJweCA2cHg7bWFyZ2luLXJpZ2h0OjZweCcsXG4gICAgICAgIG9uY2hhbmdlOiBhc3luYyAoZXYpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkudXNlcnMgKyAnLycgKyBlbmNvZGVVUklDb21wb25lbnQodS5pZCksIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLCBib2R5OiB7IHJvbGU6IGV2LnRhcmdldC52YWx1ZSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdSb2xlIHVwZGF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgZXYudGFyZ2V0LnZhbHVlID0gdS5yb2xlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCByIG9mIFsnYWRtaW4nLCAnb3BlcmF0b3InLCAndmlld2VyJ10pIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gX2VsKCdvcHRpb24nLCB7IHZhbHVlOiByLCB0ZXh0OiByIH0pO1xuICAgICAgICBpZiAociA9PT0gdS5yb2xlKSBvcHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICByb2xlU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25zQ2VsbC5hcHBlbmRDaGlsZChyb2xlU2VsZWN0KTtcblxuICAgICAgY29uc3QgZGVsQnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjJweCA4cHgnLFxuICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcbiAgICAgICAgb25jbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybSgnRGVsZXRlIHVzZXIgJyArICh1LmVtYWlsIHx8IHUuaWQpICsgJz8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicpKSByZXR1cm47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IF9mZXRjaEpTT04oQVBJLnVzZXJzICsgJy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHUuaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdEZWxldGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGFjdGlvbnNDZWxsLmFwcGVuZENoaWxkKGRlbEJ0bik7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoYWN0aW9uc0NlbGwpO1xuXG4gICAgICB0Ym9keS5hcHBlbmRDaGlsZChyb3cpO1xuICAgIH1cbiAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJJbnZpdGVGb3JtKGNvbnRhaW5lciwgb25Jc3N1ZWQpIHtcbiAgICBjb25zdCBmb3JtID0gX2VsKCdmb3JtJywge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczplbmQnLFxuICAgICAgb25zdWJtaXQ6IGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YShldi50YXJnZXQpO1xuICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgIGVtYWlsOiBmZC5nZXQoJ2VtYWlsJyksXG4gICAgICAgICAgcm9sZTogZmQuZ2V0KCdyb2xlJyksXG4gICAgICAgICAgdHRsSG91cnM6IHBhcnNlSW50KGZkLmdldCgndHRsSG91cnMnKSwgMTApIHx8IDI0LFxuICAgICAgICAgIHNlbmRFbWFpbDogZmQuZ2V0KCdzZW5kRW1haWwnKSA9PT0gJ29uJyxcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgX2ZldGNoSlNPTihBUEkuaW52aXRlcywgeyBtZXRob2Q6ICdQT1NUJywgYm9keSB9KTtcbiAgICAgICAgICBldi50YXJnZXQucmVzZXQoKTtcbiAgICAgICAgICBvbklzc3VlZCAmJiBvbklzc3VlZChyKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdJbnZpdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnRW1haWwnIH0pLFxuICAgICAgX2VsKCdpbnB1dCcsIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgcmVxdWlyZWQ6IHRydWUsIHBsYWNlaG9sZGVyOiAndXNlckBleGFtcGxlLmNvbScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pLFxuICAgICkpO1xuICAgIGNvbnN0IHJvbGVTZWwgPSBfZWwoJ3NlbGVjdCcsIHsgbmFtZTogJ3JvbGUnLCBzdHlsZTogJ3BhZGRpbmc6NnB4JyB9KTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgWydvcGVyYXRvcicsICd2aWV3ZXInLCAnYWRtaW4nXSkge1xuICAgICAgcm9sZVNlbC5hcHBlbmRDaGlsZChfZWwoJ29wdGlvbicsIHsgdmFsdWU6IHIsIHRleHQ6IHIgfSkpO1xuICAgIH1cbiAgICBmb3JtLmFwcGVuZENoaWxkKF9lbCgnbGFiZWwnLCB7IHN0eWxlOiAnZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MnB4O2ZvbnQtc2l6ZTowLjg1cmVtJyB9LFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnUm9sZScgfSksIHJvbGVTZWwsXG4gICAgKSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjJweDtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnc3BhbicsIHsgdGV4dDogJ1RUTCAoaG91cnMpJyB9KSxcbiAgICAgIF9lbCgnaW5wdXQnLCB7IG5hbWU6ICd0dGxIb3VycycsIHR5cGU6ICdudW1iZXInLCBtaW46ICcxJywgbWF4OiAnMTY4JywgdmFsdWU6ICcyNCcsIHN0eWxlOiAncGFkZGluZzo2cHg7d2lkdGg6ODBweCcgfSksXG4gICAgKSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2xhYmVsJywgeyBzdHlsZTogJ2Rpc3BsYXk6ZmxleDtnYXA6NHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MC44NXJlbScgfSxcbiAgICAgIF9lbCgnaW5wdXQnLCB7IG5hbWU6ICdzZW5kRW1haWwnLCB0eXBlOiAnY2hlY2tib3gnLCBjaGVja2VkOiB0cnVlIH0pLFxuICAgICAgX2VsKCdzcGFuJywgeyB0ZXh0OiAnU2VuZCBlbWFpbCcgfSksXG4gICAgKSk7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHsgdHlwZTogJ3N1Ym1pdCcsIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4JywgdGV4dDogJ0lzc3VlIGludml0ZScgfSkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmb3JtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9yZW5kZXJJbnZpdGVzTGlzdChjb250YWluZXIsIGludml0ZXMsIG9uQ2hhbmdlKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGlmICghaW52aXRlcyB8fCBpbnZpdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHsgc3R5bGU6ICdjb2xvcjp2YXIoLS1tdXRlZCknLCB0ZXh0OiAnTm8gb3V0c3RhbmRpbmcgaW52aXRlcy4nIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSBfZWwoJ3RhYmxlJywge1xuICAgICAgc3R5bGU6ICd3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6MC45cmVtJyxcbiAgICB9KTtcbiAgICB0YWJsZS5hcHBlbmRDaGlsZChfZWwoJ3RoZWFkJywgbnVsbCxcbiAgICAgIF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnRW1haWwnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjhweCcsIHRleHQ6ICdSb2xlJyB9KSxcbiAgICAgICAgX2VsKCd0aCcsIHsgc3R5bGU6ICd0ZXh0LWFsaWduOmxlZnQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnSW52aXRlZCBieScgfSksXG4gICAgICAgIF9lbCgndGgnLCB7IHN0eWxlOiAndGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6OHB4JywgdGV4dDogJ0V4cGlyZXMnIH0pLFxuICAgICAgICBfZWwoJ3RoJywgeyBzdHlsZTogJ3RleHQtYWxpZ246cmlnaHQ7cGFkZGluZzo4cHgnLCB0ZXh0OiAnQWN0aW9ucycgfSksXG4gICAgICApLFxuICAgICkpO1xuICAgIGNvbnN0IHRib2R5ID0gX2VsKCd0Ym9keScpO1xuICAgIGZvciAoY29uc3QgaW52IG9mIGludml0ZXMpIHtcbiAgICAgIGNvbnN0IHJvdyA9IF9lbCgndHInLCB7IHN0eWxlOiAnYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKScgfSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcsIHRleHQ6IGludi5lbWFpbCB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHsgc3R5bGU6ICdwYWRkaW5nOjhweCcgfSwgX3JlbmRlckJhZGdlKGludi5yb2xlKSkpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKF9lbCgndGQnLCB7IHN0eWxlOiAncGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tbXV0ZWQpJywgdGV4dDogaW52Lmludml0ZWRCeSB8fCAnXHUyMDE0JyB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoX2VsKCd0ZCcsIHtcbiAgICAgICAgc3R5bGU6ICdwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuODVyZW0nLFxuICAgICAgICB0ZXh0OiBpbnYuZXhwaXJlc0F0ID8gbmV3IERhdGUoaW52LmV4cGlyZXNBdCkudG9Mb2NhbGVTdHJpbmcoKSA6ICdcdTIwMTQnLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgYWN0aW9uc0NlbGwgPSBfZWwoJ3RkJywgeyBzdHlsZTogJ3BhZGRpbmc6OHB4O3RleHQtYWxpZ246cmlnaHQnIH0pO1xuICAgICAgYWN0aW9uc0NlbGwuYXBwZW5kQ2hpbGQoX2VsKCdidXR0b24nLCB7XG4gICAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjJweCA4cHgnLFxuICAgICAgICB0ZXh0OiAnUmV2b2tlJyxcbiAgICAgICAgb25jbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybSgnUmV2b2tlIGludml0ZSBmb3IgJyArIGludi5lbWFpbCArICc/JykpIHJldHVybjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgX2ZldGNoSlNPTihBUEkuaW52aXRlcyArICcvJyArIGVuY29kZVVSSUNvbXBvbmVudChpbnYuaWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lcnJvckhhbmRsZXIgJiYgd2luZG93LmVycm9ySGFuZGxlci5zaG93KCdSZXZva2UgZmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQoYWN0aW9uc0NlbGwpO1xuICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcbiAgICB9XG4gICAgdGFibGUuYXBwZW5kQ2hpbGQodGJvZHkpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBfcmVuZGVySXNzdWVkSW52aXRlQmFubmVyKGludml0ZSwgcGFyZW50KSB7XG4gICAgY29uc3QgYmFubmVyID0gX2VsKCdkaXYnLCB7XG4gICAgICBzdHlsZTogJ21hcmdpbi10b3A6MTJweDtwYWRkaW5nOjEycHg7Ym9yZGVyOjFweCBzb2xpZCAjMTZhMzRhO2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6IzA1MmUxYTtjb2xvcjojYmJmN2QwO2ZvbnQtc2l6ZTowLjg1cmVtJyxcbiAgICB9KTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdzdHJvbmcnLCB7IHRleHQ6ICdJbnZpdGUgaXNzdWVkIFx1MjAxNCBjb3B5IHRoZSBsaW5rIGJlbG93LiAnICtcbiAgICAgICdJdCB3aWxsIG5vdCBiZSBzaG93biBhZ2Fpbi4nIH0pKTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdicicpKTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoX2VsKCdjb2RlJywge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6OHB4O3BhZGRpbmc6OHB4O2JhY2tncm91bmQ6IzAwMDtib3JkZXItcmFkaXVzOjRweDt3b3JkLWJyZWFrOmJyZWFrLWFsbDtjb2xvcjojZDFmYWU1JyxcbiAgICAgIHRleHQ6IGludml0ZS5hY2NlcHRVcmwsXG4gICAgfSkpO1xuICAgIGNvbnN0IGNvcHlCdG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdtYXJnaW4tdG9wOjhweDtwYWRkaW5nOjRweCAxMHB4JyxcbiAgICAgIHRleHQ6ICdDb3B5IGxpbmsnLFxuICAgICAgb25jbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGludml0ZS5hY2NlcHRVcmwpO1xuICAgICAgICAgIGNvcHlCdG4udGV4dENvbnRlbnQgPSAnQ29waWVkISc7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGNvcHlCdG4udGV4dENvbnRlbnQgPSAnQ29weSBsaW5rJzsgfSwgMjAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnQ2xpcGJvYXJkIGJsb2NrZWQ6IHNlbGVjdCB0aGUgbGluayBtYW51YWxseS4nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICBiYW5uZXIuYXBwZW5kQ2hpbGQoY29weUJ0bik7XG4gICAgaWYgKGludml0ZS5kZWxpdmVyZWRWaWEgPT09ICdkZXYtY29uc29sZScpIHtcbiAgICAgIGJhbm5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnbWFyZ2luLXRvcDo4cHg7Y29sb3I6I2ZiYmYyNDtmb250LXNpemU6MC44cmVtJyxcbiAgICAgICAgdGV4dDogJ1NNVFAgbm90IGNvbmZpZ3VyZWQgXHUyMDE0IHRoZSBpbnZpdGUgd2FzIGxvZ2dlZCB0byB0aGUgc2VydmVyIGNvbnNvbGUgKHNlYXJjaCBmb3IgW0RDLTA0OC1ERVYtSU5WSVRFLUxJTktdKS4nLFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSBpZiAoaW52aXRlLmRlbGl2ZXJlZFZpYSA9PT0gJ2VtYWlsJykge1xuICAgICAgYmFubmVyLmFwcGVuZENoaWxkKF9lbCgncCcsIHtcbiAgICAgICAgc3R5bGU6ICdtYXJnaW4tdG9wOjhweDtjb2xvcjojODZlZmFjO2ZvbnQtc2l6ZTowLjhyZW0nLFxuICAgICAgICB0ZXh0OiAnRW1haWwgc2VudCB0byAnICsgaW52aXRlLmVtYWlsICsgJy4nLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoYmFubmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCB0aGUgYWRtaW4gcGFuZWwuIENhbGxlZCBieSB0aGUgb3BlbiB0cmlnZ2VyOyBzYWZlIHRvIGNhbGwgbXVsdGlwbGVcbiAgICogdGltZXMgKHJlLXJlbmRlcnMgaW50byB0aGUgc2FtZSBjb250YWluZXIpLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gbW91bnQoY29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ2gyJywgeyBzdHlsZTogJ21hcmdpbjowIDAgMTZweCcsIHRleHQ6ICdBZG1pbiBcdTAwQjcgVXNlcnMgJiBJbnZpdGVzJyB9KSk7XG5cbiAgICBjb25zdCBtZURhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5tZSkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgaWYgKCFtZURhdGEgfHwgIW1lRGF0YS51c2VyIHx8IG1lRGF0YS51c2VyLnJvbGUgIT09ICdhZG1pbicpIHtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChfZWwoJ3AnLCB7XG4gICAgICAgIHN0eWxlOiAnY29sb3I6dmFyKC0tbXV0ZWQpJyxcbiAgICAgICAgdGV4dDogJ0FkbWluIHJvbGUgcmVxdWlyZWQgdG8gdmlldyB0aGlzIHBhbmVsLiBJZiBtdWx0aS11c2VyIG1vZGUgaXMgZW5hYmxlZCBhbmQgeW91IHNob3VsZCBoYXZlIGFjY2VzcywgY2hlY2sgL2FwaS92MS9hdXRoL21lLicsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCBidXR0b25cbiAgICBjb25zdCByZWZyZXNoQnRuID0gX2VsKCdidXR0b24nLCB7XG4gICAgICBjbGFzczogJ2J0bi1zbScsIHN0eWxlOiAnZmxvYXQ6cmlnaHQ7cGFkZGluZzo0cHggMTBweCcsXG4gICAgICB0ZXh0OiAnUmVmcmVzaCcsXG4gICAgICBvbmNsaWNrOiAoKSA9PiBtb3VudChjb250YWluZXIpLFxuICAgIH0pO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyZWZyZXNoQnRuKTtcblxuICAgIC8vIFx1MjUwMFx1MjUwMCBVc2VycyBzZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIGNvbnN0IHVzZXJzSGVhZGVyID0gX2VsKCdoMycsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweDtjbGVhcjpib3RoJywgdGV4dDogJ1VzZXJzJyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodXNlcnNIZWFkZXIpO1xuXG4gICAgY29uc3QgdXNlcnNMaXN0ID0gX2VsKCdkaXYnLCB7IGlkOiAnYWRtaW4tdXNlcnMtbGlzdCcgfSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHVzZXJzTGlzdCk7XG5cbiAgICBjb25zdCB1c2Vyc0RhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycykuY2F0Y2goKCkgPT4gKHsgdXNlcnM6IFtdIH0pKTtcbiAgICBfcmVuZGVyVXNlcnNMaXN0KHVzZXJzTGlzdCwgdXNlcnNEYXRhLnVzZXJzLCAoKSA9PiBtb3VudChjb250YWluZXIpKTtcblxuICAgIC8vIEFkZCB1c2VyIGZvcm0gKHByZS1hdXRob3JpemUgYW4gZW1haWwgd2l0aG91dCBpc3N1aW5nIGFuIGludml0ZSkuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKF9lbCgnaDQnLCB7IHN0eWxlOiAnbWFyZ2luOjI0cHggMCA4cHg7Zm9udC1zaXplOjAuOTVyZW0nLCB0ZXh0OiAnUHJlLWF1dGhvcml6ZSBlbWFpbCcgfSkpO1xuICAgIGNvbnN0IGFkZFVzZXJGb3JtID0gX2VsKCdmb3JtJywge1xuICAgICAgc3R5bGU6ICdkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczplbmQnLFxuICAgICAgb25zdWJtaXQ6IGFzeW5jIChldikgPT4ge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBlbWFpbCA9IGV2LnRhcmdldC5lbWFpbC52YWx1ZS50cmltKCk7XG4gICAgICAgIGlmICghZW1haWwpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBfZmV0Y2hKU09OKEFQSS51c2VycywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogeyBlbWFpbCB9IH0pO1xuICAgICAgICAgIGV2LnRhcmdldC5yZXNldCgpO1xuICAgICAgICAgIG1vdW50KGNvbnRhaW5lcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB3aW5kb3cuZXJyb3JIYW5kbGVyICYmIHdpbmRvdy5lcnJvckhhbmRsZXIuc2hvdygnQWRkIGZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYWRkVXNlckZvcm0uYXBwZW5kQ2hpbGQoX2VsKCdpbnB1dCcsIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ2VtYWlsJywgcmVxdWlyZWQ6IHRydWUsIHBsYWNlaG9sZGVyOiAndXNlckBleGFtcGxlLmNvbScsIHN0eWxlOiAncGFkZGluZzo2cHgnIH0pKTtcbiAgICBhZGRVc2VyRm9ybS5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHsgdHlwZTogJ3N1Ym1pdCcsIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwYWRkaW5nOjZweCAxMnB4JywgdGV4dDogJ0FkZCB0byBhbGxvd2xpc3QnIH0pKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYWRkVXNlckZvcm0pO1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwIEludml0ZXMgc2VjdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoX2VsKCdoMycsIHsgc3R5bGU6ICdtYXJnaW46MjRweCAwIDhweCcsIHRleHQ6ICdJc3N1ZSBpbnZpdGUnIH0pKTtcbiAgICBjb25zdCBpbnZpdGVGb3JtQ29udGFpbmVyID0gX2VsKCdkaXYnKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW52aXRlRm9ybUNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBpbnZpdGVzTGlzdCA9IF9lbCgnZGl2JywgeyBpZDogJ2FkbWluLWludml0ZXMtbGlzdCcsIHN0eWxlOiAnbWFyZ2luLXRvcDoxNnB4JyB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaW52aXRlc0xpc3QpO1xuXG4gICAgY29uc3QgaW52aXRlc0RhdGEgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5pbnZpdGVzKS5jYXRjaCgoKSA9PiAoeyBpbnZpdGVzOiBbXSB9KSk7XG4gICAgX3JlbmRlckludml0ZXNMaXN0KGludml0ZXNMaXN0LCBpbnZpdGVzRGF0YS5pbnZpdGVzLCAoKSA9PiBtb3VudChjb250YWluZXIpKTtcblxuICAgIF9yZW5kZXJJbnZpdGVGb3JtKGludml0ZUZvcm1Db250YWluZXIsIChpc3N1ZWQpID0+IHtcbiAgICAgIF9yZW5kZXJJc3N1ZWRJbnZpdGVCYW5uZXIoaXNzdWVkLCBpbnZpdGVGb3JtQ29udGFpbmVyKTtcbiAgICAgIG1vdW50KGNvbnRhaW5lcik7XG4gICAgfSk7XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgUHVibGljIEFQSSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICAvKipcbiAgICogT3BlbiB0aGUgYWRtaW4gcGFuZWwgYXMgYSBtb2RhbCBvdmVybGF5LiBDbG9zZXMgb24gYmFja2Ryb3AgY2xpY2sgb3JcbiAgICogdGhlIGNsb3NlIGJ1dHRvbi4gUmVuZGVycyBpbnRvIGRvY3VtZW50LmJvZHkgc28gaXQgZmxvYXRzIGFib3ZlIHRoZVxuICAgKiBkYXNoYm9hcmQgY2hyb21lLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gb3BlbigpIHtcbiAgICAvLyBJZiBhbHJlYWR5IG9wZW4sIGp1c3QgZm9jdXMuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRtaW4tcGFuZWwtcm9vdCcpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFja2Ryb3AgPSBfZWwoJ2RpdicsIHtcbiAgICAgIGlkOiAnYWRtaW4tcGFuZWwtcm9vdCcsXG4gICAgICBzdHlsZTogJ3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjsnLFxuICAgICAgb25jbGljazogKGV2KSA9PiB7XG4gICAgICAgIGlmIChldi50YXJnZXQgPT09IGJhY2tkcm9wKSBjbG9zZSgpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhcmQgPSBfZWwoJ2RpdicsIHtcbiAgICAgIHN0eWxlOiAnYmFja2dyb3VuZDp2YXIoLS1jYXJkLWJhc2UsIzFmMjkzNyk7Y29sb3I6dmFyKC0tdGV4dCwjZjNmNGY2KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjI0cHg7bWF4LXdpZHRoOjkwMHB4O3dpZHRoOjkwJTttYXgtaGVpZ2h0Ojg1dmg7b3ZlcmZsb3c6YXV0bztwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2hhZG93OjAgMTBweCAzMHB4IHJnYmEoMCwwLDAsMC4zKScsXG4gICAgfSk7XG4gICAgY2FyZC5hcHBlbmRDaGlsZChfZWwoJ2J1dHRvbicsIHtcbiAgICAgIGNsYXNzOiAnYnRuLXNtJywgc3R5bGU6ICdwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTJweDtyaWdodDoxMnB4O3BhZGRpbmc6NHB4IDEwcHgnLFxuICAgICAgdGV4dDogJ0Nsb3NlJywgb25jbGljazogY2xvc2UsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgYm9keSA9IF9lbCgnZGl2JywgeyBpZDogJ2FkbWluLXBhbmVsLWJvZHknIH0pO1xuICAgIGNhcmQuYXBwZW5kQ2hpbGQoYm9keSk7XG4gICAgYmFja2Ryb3AuYXBwZW5kQ2hpbGQoY2FyZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiYWNrZHJvcCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW91bnQoYm9keSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYm9keS5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjojZjg3MTcxXCI+RmFpbGVkIHRvIGxvYWQgYWRtaW4gcGFuZWw6ICcgKyAoZS5tZXNzYWdlIHx8IGUpICsgJzwvcD4nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkbWluLXBhbmVsLXJvb3QnKTtcbiAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdCBhbiBcIkFkbWluXCIgYnV0dG9uIGludG8gdGhlIHRvcCBiYXIuIE9ubHkgcmVuZGVycyB3aGVuIHRoZVxuICAgKiBjdXJyZW50IC9tZSByZXNwb25zZSBzYXlzIGlzQWRtaW49dHJ1ZS4gUmUtY2hlY2tzIHBlcmlvZGljYWxseVxuICAgKiAoZXZlcnkgNjBzKSBzbyBhIHBlcm1pc3Npb24gZG93bmdyYWRlIHRha2VzIGVmZmVjdCB3aXRob3V0IGEgcmVsb2FkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gYXR0YWNoVHJpZ2dlcihiYXJDb250YWluZXIpIHtcbiAgICBhc3luYyBmdW5jdGlvbiBfbWF5YmVTaG93KCkge1xuICAgICAgY29uc3QgbWUgPSBhd2FpdCBfZmV0Y2hKU09OKEFQSS5tZSkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZG1pbi10cmlnZ2VyLWJ0bicpO1xuICAgICAgaWYgKG1lICYmIG1lLnVzZXIgJiYgbWUudXNlci5yb2xlID09PSAnYWRtaW4nKSB7XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuO1xuICAgICAgICBjb25zdCBidG4gPSBfZWwoJ2J1dHRvbicsIHtcbiAgICAgICAgICBpZDogJ2FkbWluLXRyaWdnZXItYnRuJyxcbiAgICAgICAgICBjbGFzczogJ2J0bi1zbScsXG4gICAgICAgICAgc3R5bGU6ICdtYXJnaW4tbGVmdDo4cHg7cGFkZGluZzo2cHggMTJweCcsXG4gICAgICAgICAgdGV4dDogJ0FkbWluJyxcbiAgICAgICAgICBvbmNsaWNrOiBvcGVuLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGJhckNvbnRhaW5lcikgYmFyQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYnRuKTtcbiAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgZXhpc3RpbmcucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IF9tYXliZVNob3coKTtcbiAgICBzZXRJbnRlcnZhbChfbWF5YmVTaG93LCA2MF8wMDApO1xuICB9XG5cbiAgd2luZG93LkFkbWluUGFuZWwgPSB7IG9wZW4sIGNsb3NlLCBhdHRhY2hUcmlnZ2VyIH07XG59KSgpOztcbi8vID09PT09PT09PT0gQ1JFREVOVElBTCBNQU5BR0VNRU5UID09PT09PT09PT1cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gSW5qZWN0IHNrZWxldG9uIG1vZGFsIFx1MjAxNCBjcmVkZW50aWFsIHNlY3Rpb25zIGFyZSBidWlsdCBkeW5hbWljYWxseSB3aGVuIG9wZW5lZFxuICBpbmplY3RNb2RhbCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cInRva2VuLW1hbmFnZW1lbnQtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDUwMHB4OyBtYXgtd2lkdGg6IDYwMHB4O1wiPlxuICAgICAgPGgzPlxcdXsxRjUxMX0gRE5TIENyZWRlbnRpYWxzPC9oMz5cblxuICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDE2cHg7XCI+XG4gICAgICAgIEVudGVyIFRlY2huaXRpdW0gRE5TIGxvZ2luIGNyZWRlbnRpYWxzLiBSZWFkLW9ubHkgYWNjb3VudHMgYXJlIHVzZWQgZm9yIGxvZ3M7IGFkbWluIGFjY291bnRzIGZvciByZXN0YXJ0cywgcmVjb3JkcywgYW5kIHVwZGF0ZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJkbnMtY3JlZC1zZWN0aW9uc1wiPjwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRva2VuLWNsZWFyLWFsbFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiBhdXRvOyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5DbGVhciBBbGw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInRva2VuLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwidG9rZW4tc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgYCk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwIEhlbHBlcnMgXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0RG5zSWRzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMgfHwge30pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RG5zRGlzcGxheU5hbWUoZG5zSWQpIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSAoU0lURS5kbnNTZXJ2ZXJzIHx8IHt9KVtkbnNJZF07XG4gICAgcmV0dXJuIHNlcnZlcj8ubmFtZSB8fCBkbnNJZC50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHBlci1zZXJ2ZXIgY3JlZGVudGlhbCBmb3JtIHNlY3Rpb25zIGZyb20gU0lURS5kbnNTZXJ2ZXJzICovXG4gIGZ1bmN0aW9uIGJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtY3JlZC1zZWN0aW9ucycpO1xuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgY29uc3QgZG5zSWRzID0gZ2V0RG5zSWRzKCk7XG4gICAgaWYgKGRuc0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPHAgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gRE5TIHNlcnZlcnMgY29uZmlndXJlZC48L3A+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGlkIG9mIGRuc0lkcykge1xuICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgYFxuICAgICAgPGRpdiBjbGFzcz1cInRva2VuLXNlY3Rpb25cIj5cbiAgICAgICAgPGg0IGNsYXNzPVwidG9rZW4tc2VjdGlvbi10aXRsZVwiPiR7Z2V0RG5zRGlzcGxheU5hbWUoaWQpfTwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1ncmlkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiJHtpZH0tcmVhZG9ubHktdXNlcm5hbWVcIj5cXHV7MUY0RDZ9IFJlYWQtT25seSAoTG9ncyk6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiJHtpZH0tcmVhZG9ubHktdXNlcm5hbWVcIiBwbGFjZWhvbGRlcj1cIlVzZXJuYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA0cHg7XCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2tlbi1pbnB1dC1yb3dcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiJHtpZH0tcmVhZG9ubHktdG9rZW5cIiBwbGFjZWhvbGRlcj1cIlBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0b2tlbi10b2dnbGVcIiBkYXRhLXRhcmdldD1cIiR7aWR9LXJlYWRvbmx5LXRva2VuXCI+XFx1ezFGNDQxfTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLWZpZWxkXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiJHtpZH0tYWRtaW4tdXNlcm5hbWVcIj5cXHV7MUY1Mjd9IEFkbWluOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiR7aWR9LWFkbWluLXVzZXJuYW1lXCIgcGxhY2Vob2xkZXI9XCJVc2VybmFtZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNHB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9rZW4taW5wdXQtcm93XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cIiR7aWR9LWFkbWluLXRva2VuXCIgcGxhY2Vob2xkZXI9XCJQYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidG9rZW4tdG9nZ2xlXCIgZGF0YS10YXJnZXQ9XCIke2lkfS1hZG1pbi10b2tlblwiPlxcdXsxRjQ0MX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRva2VuLXN0YXR1c1wiIGlkPVwiJHtpZH0tdG9rZW4tc3RhdHVzXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIGApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFx1MjUwMFx1MjUwMCBDcmVkZW50aWFsIGVuY3J5cHRpb24gXHUyNTAwXHUyNTAwXG5cbiAgZnVuY3Rpb24gZ2V0RW5jcnlwdGlvbktleSgpIHtcbiAgICBsZXQga2V5ID0gc2FmZVNlc3Npb25HZXQoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScpO1xuICAgIGlmIChrZXkpIHJldHVybiBrZXk7XG5cbiAgICBjb25zdCBvbGRLZXkgPSBzYWZlR2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknKTtcbiAgICBpZiAob2xkS2V5KSB7XG4gICAgICBzYWZlU2Vzc2lvblNldCgnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5Jywgb2xkS2V5KTtcbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1lbmNyeXB0aW9uLWtleScpO1xuICAgICAgcmV0dXJuIG9sZEtleTtcbiAgICB9XG5cbiAgICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICBrZXkgPSBBcnJheS5mcm9tKGFycmF5LCBiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHNhZmVTZXNzaW9uU2V0KCdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknLCBrZXkpO1xuICAgIHJldHVybiBrZXk7XG4gIH1cbiAgY29uc3QgRU5DUllQVElPTl9LRVkgPSBnZXRFbmNyeXB0aW9uS2V5KCk7XG5cbiAgZnVuY3Rpb24gY3JlZGVudGlhbEVuY3J5cHQodGV4dCwga2V5KSB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDgpKTtcbiAgICBjb25zdCBpdkhleCA9IEFycmF5LmZyb20oaXYsIGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgY29uc3Qga2V5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5ICsgaXZIZXgpO1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXJDb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpXG4gICAgICAgIF4ga2V5Qnl0ZXNbaSAlIGtleUJ5dGVzLmxlbmd0aF1cbiAgICAgICAgXiBpdltpICUgaXYubGVuZ3RoXVxuICAgICAgICBeICgoaSAqIDMxICsgMTcpICYgMHhGRik7XG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgfVxuICAgIHJldHVybiBpdkhleCArICc6JyArIGJ0b2EocmVzdWx0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWRlbnRpYWxEZWNyeXB0KGVuY3J5cHRlZFRleHQsIGtleSkge1xuICAgIGlmICghZW5jcnlwdGVkVGV4dCkgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb2xvbklkeCA9IGVuY3J5cHRlZFRleHQuaW5kZXhPZignOicpO1xuICAgICAgaWYgKGNvbG9uSWR4ID09PSAxNikge1xuICAgICAgICBjb25zdCBpdkhleCA9IGVuY3J5cHRlZFRleHQuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICAgICAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheShpdkhleC5tYXRjaCgvLnsyfS9nKS5tYXAoaCA9PiBwYXJzZUludChoLCAxNikpKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGF0b2IoZW5jcnlwdGVkVGV4dC5zdWJzdHJpbmcoMTcpKTtcbiAgICAgICAgY29uc3Qga2V5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5ICsgaXZIZXgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gZGVjb2RlZC5jaGFyQ29kZUF0KGkpXG4gICAgICAgICAgICBeIGtleUJ5dGVzW2kgJSBrZXlCeXRlcy5sZW5ndGhdXG4gICAgICAgICAgICBeIGl2W2kgJSBpdi5sZW5ndGhdXG4gICAgICAgICAgICBeICgoaSAqIDMxICsgMTcpICYgMHhGRik7XG4gICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNvZGVkID0gYXRvYihlbmNyeXB0ZWRUZXh0KTtcbiAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGRlY29kZWQuY2hhckNvZGVBdChpKSBeIGtleS5jaGFyQ29kZUF0KGkgJSBrZXkubGVuZ3RoKTtcbiAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwIENyZWRlbnRpYWwgc3RvcmFnZSBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsIGNyZWRUeXBlKSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gc2FmZUdldChgJHtkbnNJZH0tJHt0b2tlblR5cGV9LSR7Y3JlZFR5cGV9LWVuY2ApO1xuICAgIHJldHVybiBjcmVkZW50aWFsRGVjcnlwdChlbmNyeXB0ZWQsIEVOQ1JZUFRJT05fS0VZKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldENyZWRlbnRpYWwoZG5zSWQsIHRva2VuVHlwZSwgY3JlZFR5cGUsIHZhbHVlKSB7XG4gICAgY29uc3Qga2V5ID0gYCR7ZG5zSWR9LSR7dG9rZW5UeXBlfS0ke2NyZWRUeXBlfS1lbmNgO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc2FmZVNldChrZXksIGNyZWRlbnRpYWxFbmNyeXB0KHZhbHVlLCBFTkNSWVBUSU9OX0tFWSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzYWZlUmVtb3ZlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VG9rZW4oZG5zSWQsIHRva2VuVHlwZSkge1xuICAgIHJldHVybiBnZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd0b2tlbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VXNlcm5hbWUoZG5zSWQsIHRva2VuVHlwZSkge1xuICAgIHJldHVybiBnZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd1c2VybmFtZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VG9rZW4oZG5zSWQsIHRva2VuVHlwZSwgdG9rZW4pIHtcbiAgICBzZXRDcmVkZW50aWFsKGRuc0lkLCB0b2tlblR5cGUsICd0b2tlbicsIHRva2VuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFVzZXJuYW1lKGRuc0lkLCB0b2tlblR5cGUsIHVzZXJuYW1lKSB7XG4gICAgc2V0Q3JlZGVudGlhbChkbnNJZCwgdG9rZW5UeXBlLCAndXNlcm5hbWUnLCB1c2VybmFtZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRBbGxDcmVkZW50aWFscygpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGRuc0lkIG9mIGdldERuc0lkcygpKSB7XG4gICAgICByZXN1bHRbZG5zSWRdID0ge1xuICAgICAgICByZWFkb25seTogeyB1c2VybmFtZTogZ2V0VXNlcm5hbWUoZG5zSWQsICdyZWFkb25seScpLCB0b2tlbjogZ2V0VG9rZW4oZG5zSWQsICdyZWFkb25seScpIH0sXG4gICAgICAgIGFkbWluOiB7IHVzZXJuYW1lOiBnZXRVc2VybmFtZShkbnNJZCwgJ2FkbWluJyksIHRva2VuOiBnZXRUb2tlbihkbnNJZCwgJ2FkbWluJykgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQWxsQ3JlZGVudGlhbHMoKSB7XG4gICAgZ2V0RG5zSWRzKCkuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICBbJ3JlYWRvbmx5JywgJ2FkbWluJ10uZm9yRWFjaCh0b2tlblR5cGUgPT4ge1xuICAgICAgICBbJ3Rva2VuJywgJ3VzZXJuYW1lJ10uZm9yRWFjaChjcmVkVHlwZSA9PiB7XG4gICAgICAgICAgc2FmZVJlbW92ZShgJHtkbnNJZH0tJHt0b2tlblR5cGV9LSR7Y3JlZFR5cGV9LWVuY2ApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgc2FmZVJlbW92ZShgJHtkbnNJZH0tdG9rZW4tZW5jYCk7XG4gICAgICBzYWZlUmVtb3ZlKGAke2Ruc0lkfS11c2VybmFtZS1lbmNgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFN0b3JlZENyZWRlbnRpYWxzKGRuc0lkKSB7XG4gICAgY29uc3QgcmVhZG9ubHlUb2tlbiA9IGdldFRva2VuKGRuc0lkLCAncmVhZG9ubHknKTtcbiAgICBjb25zdCByZWFkb25seVVzZXJuYW1lID0gZ2V0VXNlcm5hbWUoZG5zSWQsICdyZWFkb25seScpO1xuICAgIGNvbnN0IGFkbWluVG9rZW4gPSBnZXRUb2tlbihkbnNJZCwgJ2FkbWluJyk7XG4gICAgY29uc3QgYWRtaW5Vc2VybmFtZSA9IGdldFVzZXJuYW1lKGRuc0lkLCAnYWRtaW4nKTtcbiAgICBjb25zdCBvbGRUb2tlbiA9IGNyZWRlbnRpYWxEZWNyeXB0KHNhZmVHZXQoYCR7ZG5zSWR9LXRva2VuLWVuY2ApLCBFTkNSWVBUSU9OX0tFWSk7XG4gICAgY29uc3Qgb2xkVXNlcm5hbWUgPSBjcmVkZW50aWFsRGVjcnlwdChzYWZlR2V0KGAke2Ruc0lkfS11c2VybmFtZS1lbmNgKSwgRU5DUllQVElPTl9LRVkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJuYW1lOiBhZG1pblVzZXJuYW1lIHx8IHJlYWRvbmx5VXNlcm5hbWUgfHwgb2xkVXNlcm5hbWUsXG4gICAgICB0b2tlbjogYWRtaW5Ub2tlbiB8fCByZWFkb25seVRva2VuIHx8IG9sZFRva2VuLFxuICAgICAgcmVhZG9ubHlUb2tlbjogcmVhZG9ubHlUb2tlbiB8fCBvbGRUb2tlbixcbiAgICAgIHJlYWRvbmx5VXNlcm5hbWU6IHJlYWRvbmx5VXNlcm5hbWUgfHwgb2xkVXNlcm5hbWUsXG4gICAgICBhZG1pblRva2VuOiBhZG1pblRva2VuIHx8IG9sZFRva2VuLFxuICAgICAgYWRtaW5Vc2VybmFtZTogYWRtaW5Vc2VybmFtZSB8fCBvbGRVc2VybmFtZVxuICAgIH07XG4gIH1cblxuICAvLyBcdTI1MDBcdTI1MDAgTW9kYWwgaGFuZGxlcnMgXHUyNTAwXHUyNTAwXG5cbiAgLy8gT3BlbiBtb2RhbCBcdTIwMTQgYnVpbGQgc2VjdGlvbnMgZHluYW1pY2FsbHksIHBvcHVsYXRlIGZyb20gc3RvcmVkIGNyZWRzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2UtdG9rZW5zJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zKCk7XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpO1xuICAgIGNvbnN0IGNyZWRzID0gZ2V0QWxsQ3JlZGVudGlhbHMoKTtcblxuICAgIGdldERuc0lkcygpLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgY29uc3QgYyA9IGNyZWRzW2Ruc0lkXTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS11c2VybmFtZWApLnZhbHVlID0gYy5yZWFkb25seS51c2VybmFtZTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlID0gYy5yZWFkb25seS50b2tlbjtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi11c2VybmFtZWApLnZhbHVlID0gYy5hZG1pbi51c2VybmFtZTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1hZG1pbi10b2tlbmApLnZhbHVlID0gYy5hZG1pbi50b2tlbjtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS10b2tlbi1zdGF0dXNgKS50ZXh0Q29udGVudCA9ICcnO1xuICAgIH0pO1xuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICAvLyBUb2dnbGUgcGFzc3dvcmQgdmlzaWJpbGl0eSArIGJhY2tkcm9wIGNsb3NlIChldmVudCBkZWxlZ2F0aW9uIGZvciBkeW5hbWljIGVsZW1lbnRzKVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tbWFuYWdlbWVudC1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3QgYnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnRva2VuLXRvZ2dsZScpO1xuICAgIGlmIChidG4pIHtcbiAgICAgIGNvbnN0IHRhcmdldElkID0gYnRuLmRhdGFzZXQudGFyZ2V0O1xuICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXRJZCk7XG4gICAgICBpZiAoaW5wdXQudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICBpbnB1dC50eXBlID0gJ3RleHQnO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXFx1ezFGNjQ4fSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dC50eXBlID0gJ3Bhc3N3b3JkJztcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1xcdXsxRjQ0MX0nO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJykge1xuICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2F2ZSBjcmVkZW50aWFsc1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW4tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkbnNJZHMgPSBnZXREbnNJZHMoKTtcblxuICAgIC8vIFNhdmUgYWxsIHRvIGxvY2FsU3RvcmFnZVxuICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgIHNldFVzZXJuYW1lKGRuc0lkLCAncmVhZG9ubHknLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdXNlcm5hbWVgKS52YWx1ZS50cmltKCkpO1xuICAgICAgc2V0VG9rZW4oZG5zSWQsICdyZWFkb25seScsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS1yZWFkb25seS10b2tlbmApLnZhbHVlLnRyaW0oKSk7XG4gICAgICBzZXRVc2VybmFtZShkbnNJZCwgJ2FkbWluJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXVzZXJuYW1lYCkudmFsdWUudHJpbSgpKTtcbiAgICAgIHNldFRva2VuKGRuc0lkLCAnYWRtaW4nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdG9rZW5gKS52YWx1ZS50cmltKCkpO1xuICAgIH0pO1xuXG4gICAgLy8gQnVpbGQgcGVyLXNlcnZlciBjcmVkZW50aWFscyBwYXlsb2FkIGZvciBiYWNrZW5kIHN5bmNcbiAgICBjb25zdCBzZXJ2ZXJzID0ge307XG4gICAgbGV0IGhhc0FueUNyZWRzID0gZmFsc2U7XG5cbiAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IHt9O1xuICAgICAgY29uc3Qgcm9Vc2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXVzZXJuYW1lYCkudmFsdWUudHJpbSgpO1xuICAgICAgY29uc3Qgcm9QYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXJlYWRvbmx5LXRva2VuYCkudmFsdWUudHJpbSgpO1xuICAgICAgY29uc3QgYWRtaW5Vc2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXVzZXJuYW1lYCkudmFsdWUudHJpbSgpO1xuICAgICAgY29uc3QgYWRtaW5QYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LWFkbWluLXRva2VuYCkudmFsdWUudHJpbSgpO1xuXG4gICAgICBpZiAocm9Vc2VyICYmIHJvUGFzcykge1xuICAgICAgICBlbnRyeS5yZWFkb25seSA9IHsgdXNlcm5hbWU6IHJvVXNlciwgcGFzc3dvcmQ6IHJvUGFzcyB9O1xuICAgICAgICBoYXNBbnlDcmVkcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoYWRtaW5Vc2VyICYmIGFkbWluUGFzcykge1xuICAgICAgICBlbnRyeS5hZG1pbiA9IHsgdXNlcm5hbWU6IGFkbWluVXNlciwgcGFzc3dvcmQ6IGFkbWluUGFzcyB9O1xuICAgICAgICBoYXNBbnlDcmVkcyA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2VydmVyc1tkbnNJZF0gPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChoYXNBbnlDcmVkcykge1xuICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICBpZiAoc2VydmVyc1tkbnNJZF0pIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnVmVyaWZ5aW5nLi4uJztcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kbnMvY3JlZGVudGlhbHMnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2ZXJzIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBpZiAoZGF0YS5yZXN1bHRzKSB7XG4gICAgICAgICAgZG5zSWRzLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCk7XG4gICAgICAgICAgICBpZiAoIXNlcnZlcnNbZG5zSWRdKSB7IHN0YXR1c0VsLnRleHRDb250ZW50ID0gJyc7IHJldHVybjsgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGF0YS5yZXN1bHRzW2Ruc0lkXTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQ/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXFx1MjcxMyBWZXJpZmllZCAmIHNhdmVkJztcbiAgICAgICAgICAgICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBzdWNjZXNzJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0Py5wYXJ0aWFsKSB7XG4gICAgICAgICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgJyArIHJlc3VsdC5wYXJ0aWFsO1xuICAgICAgICAgICAgICBzdGF0dXNFbC5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIHN1Y2Nlc3MnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnXFx1MjcxNyAnICsgKHJlc3VsdD8uZXJyb3IgfHwgJ0xvZ2luIGZhaWxlZCcpO1xuICAgICAgICAgICAgICBzdGF0dXNFbC5jbGFzc05hbWUgPSAndG9rZW4tc3RhdHVzIGVycm9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgICAgICBpZiAoc2VydmVyc1tkbnNJZF0pIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1xcdTI3MTMgU2F2ZWQnO1xuICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkuY2xhc3NOYW1lID0gJ3Rva2VuLXN0YXR1cyBzdWNjZXNzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgICAgICBpZiAoc2VydmVyc1tkbnNJZF0pIHtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJ1xcdTI3MTcgJyArIChkYXRhLmVycm9yIHx8ICdGYWlsZWQnKTtcbiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgZXJyb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzeW5jIEROUyBjcmVkZW50aWFscyB0byBiYWNrZW5kOicsIGUpO1xuICAgICAgICBkbnNJZHMuZm9yRWFjaChkbnNJZCA9PiB7XG4gICAgICAgICAgaWYgKHNlcnZlcnNbZG5zSWRdKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnXFx1MjcxMyBTYXZlZCBsb2NhbGx5IChzeW5jIGZhaWxlZCknO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRuc0lkcy5mb3JFYWNoKGRuc0lkID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLnRleHRDb250ZW50ID0gJyc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdXRvLWNsb3NlIGFmdGVyIGRlbGF5IGlmIGFsbCBzdWNjZWVkZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFsbEdvb2QgPSBkbnNJZHMuZXZlcnkoZG5zSWQgPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCk/LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gIXN0YXR1cyB8fCBzdGF0dXMuaW5jbHVkZXMoJ1xcdTI3MTMnKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGFsbEdvb2QpIGNsb3NlTW9kYWwoJ3Rva2VuLW1hbmFnZW1lbnQtbW9kYWwnKTtcbiAgICB9LCAxNTAwKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbG9zZU1vZGFsKCd0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbi1jbGVhci1hbGwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpcm0oJ0NsZWFyIGFsbCBzdG9yZWQgRE5TIGNyZWRlbnRpYWxzPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJykpIHtcbiAgICAgIGNsZWFyQWxsQ3JlZGVudGlhbHMoKTtcbiAgICAgIGdldERuc0lkcygpLmZvckVhY2goZG5zSWQgPT4ge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdXNlcm5hbWVgKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tcmVhZG9ubHktdG9rZW5gKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdXNlcm5hbWVgKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tYWRtaW4tdG9rZW5gKS52YWx1ZSA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtkbnNJZH0tdG9rZW4tc3RhdHVzYCkudGV4dENvbnRlbnQgPSAnXFx1MjcxMyBDbGVhcmVkJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7ZG5zSWR9LXRva2VuLXN0YXR1c2ApLmNsYXNzTmFtZSA9ICd0b2tlbi1zdGF0dXMgc3VjY2Vzcyc7XG4gICAgICB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Rucy9jcmVkZW50aWFscycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDAgV2luZG93IGV4cG9ydHMgXHUyNTAwXHUyNTAwXG4gIHdpbmRvdy5nZXRUb2tlbiA9IGdldFRva2VuO1xuICB3aW5kb3cuZ2V0VXNlcm5hbWUgPSBnZXRVc2VybmFtZTtcbiAgd2luZG93LnNldFRva2VuID0gc2V0VG9rZW47XG4gIHdpbmRvdy5zZXRVc2VybmFtZSA9IHNldFVzZXJuYW1lO1xuICB3aW5kb3cuZ2V0QWxsQ3JlZGVudGlhbHMgPSBnZXRBbGxDcmVkZW50aWFscztcbiAgd2luZG93LmdldENyZWRlbnRpYWwgPSBnZXRDcmVkZW50aWFsO1xuICB3aW5kb3cuc2V0Q3JlZGVudGlhbCA9IHNldENyZWRlbnRpYWw7XG4gIHdpbmRvdy5nZXRFbmNyeXB0aW9uS2V5ID0gZ2V0RW5jcnlwdGlvbktleTtcbiAgd2luZG93LmdldERuc0lkcyA9IGdldERuc0lkcztcbiAgd2luZG93LmdldERuc0Rpc3BsYXlOYW1lID0gZ2V0RG5zRGlzcGxheU5hbWU7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEdSSUQgJiBTVEFUVVMgSEVMUEVSUyA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuXG4gIC8qIEVuaGFuY2VkIHN0YXR1cyBoZWxwZXJzIHdpdGggcmVzcG9uc2UgdGltZSB0cmFja2luZyAqL1xuICBmdW5jdGlvbiBzZXRRdWljayhpZCwgdXAsIHJlc3BvbnNlVGltZSA9IG51bGwpIHtcbiAgICBjb25zdCBkb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICctZG90Jyk7XG4gICAgY29uc3QgcGlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkICsgJy1waWxsJyk7XG4gICAgY29uc3QgdGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnLXRpbWUnKTtcbiAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtpZH1cIl1gKTtcblxuICAgIGlmIChkb3QpIHtcbiAgICAgIGRvdC5jbGFzc0xpc3QudG9nZ2xlKCdvaycsIHVwKTtcbiAgICAgIGRvdC5jbGFzc0xpc3QudG9nZ2xlKCdiYWQnLCAhdXApO1xuICAgIH1cblxuICAgIGlmIChwaWxsKSB7XG4gICAgICBwaWxsLnRleHRDb250ZW50ID0gdXAgPyAnT04nIDogJ09GRic7XG4gICAgICBwaWxsLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgdXApO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvZmYnLCAhdXApO1xuICAgIH1cblxuICAgIGlmICh0aW1lRWwgJiYgcmVzcG9uc2VUaW1lICE9PSBudWxsKSB7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSB1cCA/IGAke3Jlc3BvbnNlVGltZX1tc2AgOiAndGltZW91dCc7XG4gICAgICB0aW1lRWwuY2xhc3NOYW1lID0gYHJlc3BvbnNlLXRpbWUgJHtnZXRSZXNwb25zZVRpbWVDbGFzcyhyZXNwb25zZVRpbWUsIHVwKX1gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjYXJkIHN0YXR1cyBmb3IgaWNvbiBjb2xvcmluZ1xuICAgIGlmIChjYXJkKSB7XG4gICAgICBjYXJkLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCB1cCA/ICdvbicgOiAnb2ZmJyk7XG4gICAgfVxuXG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZXNwb25zZVRpbWVDbGFzcyh0aW1lLCBpc1VwKSB7XG4gICAgaWYgKCFpc1VwKSByZXR1cm4gJ3RpbWVvdXQnO1xuICAgIGlmICh0aW1lIDwgMjAwKSByZXR1cm4gJ2V4Y2VsbGVudCc7XG4gICAgaWYgKHRpbWUgPCA1MDApIHJldHVybiAnZ29vZCc7XG4gICAgaWYgKHRpbWUgPCAxMDAwKSByZXR1cm4gJ2ZhaXInO1xuICAgIHJldHVybiAnc2xvdyc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZpY2VXaXRoVGltaW5nKGlkKSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBmZXRjaCgnL3Byb2JlLycgKyBpZCwgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVGltZSA9IE1hdGgucm91bmQoZW5kVGltZSAtIHN0YXJ0VGltZSk7XG4gICAgICBjb25zdCBpc1VwID0gKHIuc3RhdHVzID49IDIwMCAmJiByLnN0YXR1cyA8IDQwMCkgfHwgci5zdGF0dXMgPT09IDQwMSB8fCByLnN0YXR1cyA9PT0gNDAzO1xuICAgICAgcmV0dXJuIHsgaXNVcCwgcmVzcG9uc2VUaW1lIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zdCBlbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBjb25zdCByZXNwb25zZVRpbWUgPSBNYXRoLnJvdW5kKGVuZFRpbWUgLSBzdGFydFRpbWUpO1xuICAgICAgcmV0dXJuIHsgaXNVcDogZmFsc2UsIHJlc3BvbnNlVGltZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qIEFwcCBncmlkIC0gbG9hZGVkIGZyb20gQVBJICovXG4gIHdpbmRvdy5BUFBTID0gW107IC8vIFVzZSB3aW5kb3cuQVBQUyBhcyB0aGUgbWFpbiBhcnJheVxuICBsZXQgcmVmcmVzaEluRmxpZ2h0ID0gbnVsbDtcbiAgbGV0IHJlZnJlc2hRdWV1ZWQgPSBmYWxzZTtcblxuICAvLyBMb2FkIHNlcnZpY2VzIGZyb20gQVBJXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXJ2aWNlcygpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHdpbmRvdy5Ta2VsZXRvbkxvYWRlcikgd2luZG93LlNrZWxldG9uTG9hZGVyLnNob3coNik7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIFN0YW5kYXJkIGVudmVsb3BlOiB7IHN1Y2Nlc3M6IHRydWUsIHNlcnZpY2VzOiBbLi4uXSwgcGFnaW5hdGlvbj86IHsuLi59IH1cbiAgICAgICAgd2luZG93LkFQUFMgPSByZXN1bHQuc2VydmljZXMgfHwgW107XG4gICAgICAgIGlmICh3aW5kb3cuU2tlbGV0b25Mb2FkZXIpIHdpbmRvdy5Ta2VsZXRvbkxvYWRlci5oaWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2aWNlczonLCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuaGlkZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2aWNlczonLCBlcnJvcik7XG4gICAgICBpZiAod2luZG93LlNrZWxldG9uTG9hZGVyKSB3aW5kb3cuU2tlbGV0b25Mb2FkZXIuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcnZpY2VVcmwoaWQpIHtcbiAgICBjb25zdCBzdmMgPSB3aW5kb3cuQVBQUz8uZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgICBpZiAoc3ZjPy51cmwpIHJldHVybiBzdmMudXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IHN2Yy51cmwgOiAnaHR0cHM6Ly8nICsgc3ZjLnVybDtcbiAgICBpZiAoc3ZjPy5pc0V4dGVybmFsICYmIHN2Yy5leHRlcm5hbFVybCkgcmV0dXJuIHN2Yy5leHRlcm5hbFVybDtcbiAgICBjb25zdCBkbnMgPSBTSVRFLmRuc1NlcnZlcnM/LltpZF07XG4gICAgaWYgKGRucykgcmV0dXJuICdodHRwOi8vJyArIGRucy5pcCArICc6JyArIChkbnMucG9ydCB8fCA1MzgwKTtcbiAgICByZXR1cm4gYnVpbGRTZXJ2aWNlVXJsKGlkKTtcbiAgfVxuICBmdW5jdGlvbiBlbCh0YWcsIGNscywgdHh0KSB7IGNvbnN0IG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7IGlmIChjbHMpIG4uY2xhc3NOYW1lID0gY2xzOyBpZiAodHh0KSBuLnRleHRDb250ZW50ID0gdHh0OyByZXR1cm4gbjsgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkR3JpZCgpIHtcbiAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmRzJyk7IHJvb3QuaW5uZXJIVE1MID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aW5kb3cuQVBQUy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcyA9IHdpbmRvdy5BUFBTW2ldO1xuICAgICAgaWYgKHMuaWQgPT09ICdjYScpIGNvbnRpbnVlOyAvLyBEYXNoQ0EgbGl2ZXMgaW4gdG9wIGFuY2hvciByb3dcbiAgICAgIGNvbnN0IGNhcmQgPSBlbCgnZGl2JywgJ2NhcmQnKTtcbiAgICAgIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWFwcCcsIHMuaWQpO1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ29mZicpOyAvLyBJbml0aWFsIHN0YXR1c1xuICAgICAgaWYgKHMuY29udGFpbmVySWQpIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRhaW5lci1pZCcsIHMuY29udGFpbmVySWQpO1xuICAgICAgaWYgKHMuY2F0ZWdvcnkpIGNhcmQuc2V0QXR0cmlidXRlKCdkYXRhLWNhdGVnb3J5Jywgcy5jYXRlZ29yeSk7XG4gICAgICBpZiAocy5yZWNpcGVJZCkgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVjaXBlLWlkJywgcy5yZWNpcGVJZCk7XG5cbiAgICAgIGNvbnN0IGRvdCA9IGVsKCdzcGFuJywgJ2RvdCBiYWQgYXQtYmwnKTsgZG90LmlkID0gJ2RvdC0nICsgcy5pZCArICctZ3JpZCc7IGNhcmQuYXBwZW5kQ2hpbGQoZG90KTtcblxuICAgICAgY29uc3Qgcm93ID0gZWwoJ2RpdicsICdyb3cnKTtcbiAgICAgIGNvbnN0IHdyYXAgPSBlbCgnZGl2JywgJ2xvZ28td3JhcCcpO1xuXG4gICAgICAvLyBVc2UgcmVsaWFibGUgUE5HIGltYWdlcyB3aXRoIGF1dG9tYXRpYyBDRE4gZmFsbGJhY2tcbiAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLnNyYyA9IHMubG9nbztcbiAgICAgIGltZy5hbHQgPSBzLm5hbWU7XG4gICAgICBpbWcuY2xhc3NOYW1lID0gJ2xvZ28taW1nJztcbiAgICAgIGltZy5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFRyeSBDRE4gZmFsbGJhY2sgd2l0aCBtdWx0aXBsZSBuYW1pbmcgc3RyYXRlZ2llc1xuICAgICAgICAvLyBVc2UgaWQsIGFwcFRlbXBsYXRlLCBvciBkZXJpdmUgZnJvbSBuYW1lXG4gICAgICAgIGxldCBhcHBJZCA9IHMuaWQgfHwgcy5hcHBUZW1wbGF0ZTtcbiAgICAgICAgaWYgKCFhcHBJZCAmJiBzLm5hbWUpIHtcbiAgICAgICAgICAvLyBEZXJpdmUgSUQgZnJvbSBuYW1lIChsb3dlcmNhc2UsIHJlbW92ZSBzcGFjZXMpXG4gICAgICAgICAgYXBwSWQgPSBzLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXBwSWQpIHtcbiAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IENETiBVUkwgZm9ybWF0c1xuICAgICAgICAgIGNvbnN0IGNkblVybHMgPSBbXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7YXBwSWR9LnBuZ2AsXG4gICAgICAgICAgICBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3dhbGt4Y29kZS9kYXNoYm9hcmQtaWNvbnMvcG5nLyR7YXBwSWQudG9Mb3dlckNhc2UoKX0ucG5nYCxcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHthcHBJZC5yZXBsYWNlKC8tL2csICcnKX0ucG5nYCxcbiAgICAgICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvZ2gvd2Fsa3hjb2RlL2Rhc2hib2FyZC1pY29ucy9wbmcvJHtzLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJyl9LnBuZ2BcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICAgICAgICBjb25zdCB1bmlxdWVVcmxzID0gWy4uLm5ldyBTZXQoY2RuVXJscyldO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBVUkwgdG8gdHJ5XG4gICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdW5pcXVlVXJscy5pbmRleE9mKHRoaXMuc3JjKTtcbiAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuXG4gICAgICAgICAgaWYgKG5leHRJbmRleCA8IHVuaXF1ZVVybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNyYyA9IHVuaXF1ZVVybHNbbmV4dEluZGV4XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoaW1nKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZCh3cmFwKTtcblxuICAgICAgY29uc3QgbmFtZVNwYW4gPSBlbCgnc3BhbicsICduYW1lJywgcy5uYW1lKTtcbiAgICAgIHJvdy5hcHBlbmRDaGlsZChuYW1lU3Bhbik7XG5cbiAgICAgIC8vIEFkZCBUYWlsc2NhbGUgYmFkZ2UgaWYgc2VydmljZSBpcyBwcm90ZWN0ZWRcbiAgICAgIGlmIChzLnRhaWxzY2FsZU9ubHkpIHtcbiAgICAgICAgY29uc3QgdHNCYWRnZSA9IGVsKCdzcGFuJywgJ3RzLWJhZGdlJywgJ1x1RDgzRFx1REQxMCcpO1xuICAgICAgICB0c0JhZGdlLnRpdGxlID0gJ1RhaWxzY2FsZS1vbmx5IGFjY2Vzcyc7XG4gICAgICAgIHRzQmFkZ2Uuc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogNnB4OyBmb250LXNpemU6IDAuNzVyZW07IG9wYWNpdHk6IDAuODsnO1xuICAgICAgICBuYW1lU3Bhbi5hcHBlbmRDaGlsZCh0c0JhZGdlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIENhdGVnb3J5IGJhZGdlIGlmIHNlcnZpY2UgaGFzIG9uZSAoY29sb3JlZCBwaWxsIHdpdGggaWNvbilcbiAgICAgIGlmIChzLmNhdGVnb3J5KSB7XG4gICAgICAgIGNvbnN0IGNhdHMgPSAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKSB8fCB3aW5kb3cuRENfQ0FURUdPUklFUyB8fCB7fTtcbiAgICAgICAgY29uc3QgY2F0SW5mbyA9IGNhdHNbcy5jYXRlZ29yeV0gfHwge307XG4gICAgICAgIGNvbnN0IGNhdEJhZGdlID0gZWwoJ3NwYW4nLCAnY2F0LWJhZGdlJywgYCR7Y2F0SW5mby5pY29uIHx8ICcnfSAke3MuY2F0ZWdvcnl9YC50cmltKCkpO1xuICAgICAgICBjYXRCYWRnZS50aXRsZSA9IGBDYXRlZ29yeTogJHtzLmNhdGVnb3J5fWA7XG4gICAgICAgIGNhdEJhZGdlLnN0eWxlLmNzc1RleHQgPSBgbWFyZ2luLWxlZnQ6IDZweDsgZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAxcHggNnB4OyBib3JkZXItcmFkaXVzOiA5OTlweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Y2F0SW5mby5jb2xvciB8fCAnIzdmOGM4ZCd9IDI1JSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogJHtjYXRJbmZvLmNvbG9yIHx8ICcjN2Y4YzhkJ307IGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAke2NhdEluZm8uY29sb3IgfHwgJyM3ZjhjOGQnfSA1MCUsIHRyYW5zcGFyZW50KTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgZm9udC13ZWlnaHQ6IDUwMDtgO1xuICAgICAgICBuYW1lU3Bhbi5hcHBlbmRDaGlsZChjYXRCYWRnZSk7XG4gICAgICB9XG5cbiAgICAgIHJvdy5hcHBlbmRDaGlsZChlbCgnc3BhbicsICdzcGFjZXInKSk7XG5cbiAgICAgIGNvbnN0IHBpbGwgPSBlbCgnc3BhbicsICdiYWRnZSBvZmYnLCAnT0ZGJyk7IHBpbGwuaWQgPSAnYmFkZ2UtJyArIHMuaWQ7IHJvdy5hcHBlbmRDaGlsZChwaWxsKTtcblxuICAgICAgLy8gVXBkYXRlIGF2YWlsYWJsZSBiYWRnZSAoaGlkZGVuIGJ5IGRlZmF1bHQsIHNob3duIHdoZW4gdXBkYXRlIGRldGVjdGVkKVxuICAgICAgY29uc3QgdXBkYXRlQmFkZ2UgPSBlbCgnc3BhbicsICd1cGRhdGUtYXZhaWxhYmxlLWJhZGdlJywgJ1VQREFURScpO1xuICAgICAgdXBkYXRlQmFkZ2UuaWQgPSAndXBkYXRlLWJhZGdlLScgKyBzLmlkO1xuICAgICAgdXBkYXRlQmFkZ2UudGl0bGUgPSAnVXBkYXRlIGF2YWlsYWJsZSc7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQodXBkYXRlQmFkZ2UpO1xuXG4gICAgICBjYXJkLmFwcGVuZENoaWxkKHJvdyk7XG5cbiAgICAgIC8vIEFkZCByZXNwb25zZSB0aW1lIHJvd1xuICAgICAgY29uc3QgcmVzcG9uc2VSb3cgPSBlbCgnZGl2JywgJ3Jlc3BvbnNlLXJvdycpO1xuICAgICAgY29uc3QgdGltZVNwYW4gPSBlbCgnc3BhbicsICdyZXNwb25zZS10aW1lJywgJy0tJyk7IHRpbWVTcGFuLmlkID0gJ3RpbWUtJyArIHMuaWQ7XG4gICAgICByZXNwb25zZVJvdy5hcHBlbmRDaGlsZCh0aW1lU3Bhbik7XG4gICAgICBjYXJkLmFwcGVuZENoaWxkKHJlc3BvbnNlUm93KTtcblxuICAgICAgLy8gQWRkIGhlYWx0aC91cHRpbWUgcm93XG4gICAgICBjb25zdCBoZWFsdGhSb3cgPSBlbCgnZGl2JywgJ2hlYWx0aC1yb3cnKTtcbiAgICAgIGhlYWx0aFJvdy5pZCA9ICdoZWFsdGgtJyArIHMuaWQ7XG4gICAgICBjb25zdCB1cHRpbWVDaGlwID0gZWwoJ3NwYW4nLCAndXB0aW1lLWNoaXAnLCAnLS0nKTtcbiAgICAgIHVwdGltZUNoaXAuaWQgPSAndXB0aW1lLScgKyBzLmlkO1xuICAgICAgaGVhbHRoUm93LmFwcGVuZENoaWxkKHVwdGltZUNoaXApO1xuICAgICAgY29uc3QgdXB0aW1lTWluaUJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdXB0aW1lTWluaUJhci5jbGFzc05hbWUgPSAndXB0aW1lLW1pbmktYmFyJztcbiAgICAgIGNvbnN0IHVwdGltZUZpbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHVwdGltZUZpbGwuY2xhc3NOYW1lID0gJ2ZpbGwnO1xuICAgICAgdXB0aW1lRmlsbC5pZCA9ICd1cHRpbWUtYmFyLScgKyBzLmlkO1xuICAgICAgdXB0aW1lRmlsbC5zdHlsZS53aWR0aCA9ICcwJSc7XG4gICAgICB1cHRpbWVNaW5pQmFyLmFwcGVuZENoaWxkKHVwdGltZUZpbGwpO1xuICAgICAgaGVhbHRoUm93LmFwcGVuZENoaWxkKHVwdGltZU1pbmlCYXIpO1xuICAgICAgY2FyZC5hcHBlbmRDaGlsZChoZWFsdGhSb3cpO1xuXG4gICAgICBjb25zdCBidG5Sb3cgPSBlbCgnZGl2JywgJ2J0bi1yb3cnKTtcblxuICAgICAgLy8gQWRkIGxvZ3MgYnV0dG9uIGZvciBzZXJ2aWNlcyB3aXRoIGNvbnRhaW5lcklkc1xuICAgICAgaWYgKHMuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgbG9nc0J0biA9IGVsKCdidXR0b24nLCAnbG9ncy1idG4nLCAnXHVEODNEXHVEQ0NCJyk7XG4gICAgICAgIGxvZ3NCdG4udGl0bGUgPSAnVmlldyBjb250YWluZXIgbG9ncyc7XG4gICAgICAgIGxvZ3NCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbChzLmNvbnRhaW5lcklkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQobG9nc0J0bik7XG5cbiAgICAgICAgLy8gQWRkIHVwZGF0ZSBidXR0b24gZm9yIERvY2tlciBjb250YWluZXJzXG4gICAgICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGVsKCdidXR0b24nLCAndXBkYXRlLWJ0bicsICdcdTJCMDZcdUZFMEYnKTtcbiAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICB1cGRhdGVCdG4uaWQgPSBgdXBkYXRlLWJ0bi0ke3MuaWR9YDtcbiAgICAgICAgdXBkYXRlQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93LnVwZGF0ZUNvbnRhaW5lcihzLmNvbnRhaW5lcklkLCBzLm5hbWUsIHMuaWQpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQodXBkYXRlQnRuKTtcblxuICAgICAgICAvLyBUZXJtaW5hbCBleGVjIGJ1dHRvbiAoc3VidGxlIFx1MjAxNCB2aXNpYmxlIG9uIGhvdmVyKVxuICAgICAgICBjb25zdCBleGVjQnRuID0gZWwoJ2J1dHRvbicsICdleGVjLWJ0bicsICc+XycpO1xuICAgICAgICBleGVjQnRuLnRpdGxlID0gJ09wZW4gdGVybWluYWwnO1xuICAgICAgICBleGVjQnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKHdpbmRvdy5vcGVuRXhlY01vZGFsKSB3aW5kb3cub3BlbkV4ZWNNb2RhbChzLmNvbnRhaW5lcklkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoZXhlY0J0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBsb2dzIGJ1dHRvbiBmb3Igc2VydmljZXMgd2l0aCBsb2dQYXRoIChuYXRpdmUgYXBwcylcbiAgICAgIGlmIChzLmxvZ1BhdGggJiYgIXMuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgbG9nc0J0biA9IGVsKCdidXR0b24nLCAnbG9ncy1idG4nLCAnXHVEODNEXHVEQ0NCJyk7XG4gICAgICAgIGxvZ3NCdG4udGl0bGUgPSAnVmlldyBhcHBsaWNhdGlvbiBsb2dzJztcbiAgICAgICAgbG9nc0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuRmlsZUxvZ3NNb2RhbChzLmxvZ1BhdGgsIHMubmFtZSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChsb2dzQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNyZWRlbnRpYWxzIGJ1dHRvbiBmb3Igc2VydmljZXMgdGhhdCBzdXBwb3J0IGF1dG8tbG9naW5cbiAgICAgIGlmIChzLmlzRXh0ZXJuYWwgfHwgcy5hcHBUZW1wbGF0ZSB8fCBzLnVybCkge1xuICAgICAgICBjb25zdCBjcmVkc0J0biA9IGVsKCdidXR0b24nLCAnY3JlZHMtYnRuJywgJ1x1RDgzRFx1REQxMScpO1xuICAgICAgICBjcmVkc0J0bi50aXRsZSA9ICdBdXRvLWxvZ2luIGNyZWRlbnRpYWxzJztcbiAgICAgICAgY3JlZHNCdG4uaWQgPSBgY3JlZHMtYnRuLSR7cy5pZH1gO1xuICAgICAgICBjcmVkc0J0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwocyk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChjcmVkc0J0bik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBvcHRpb25zIGJ1dHRvbiBmb3IgYWxsIHNlcnZpY2VzIGV4Y2VwdCAnaW50ZXJuZXQnXG4gICAgICBpZiAocy5pZCAhPT0gJ2ludGVybmV0Jykge1xuICAgICAgICBjb25zdCBvcHRCdG4gPSBlbCgnYnV0dG9uJywgJ29wdGlvbnMtYnRuJywgJ1x1MjY5OVx1RkUwRicpO1xuICAgICAgICBvcHRCdG4udGl0bGUgPSAnRWRpdCBzZXJ2aWNlIHNldHRpbmdzJztcbiAgICAgICAgb3B0QnRuLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsKHMpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQob3B0QnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHNoYXJlIGJ1dHRvbiBmb3IgYWxsIHNlcnZpY2VzIGV4Y2VwdCAnaW50ZXJuZXQnIChEQy0wNTgpLlxuICAgICAgLy8gQ2FsbHMgaW50byB0aGUgc2hhcmUtbW9kYWwgbW9kdWxlIHJlZ2lzdGVyZWQgb24gd2luZG93LiBXZSBkb24ndFxuICAgICAgLy8gaGFyZC1yZXF1aXJlIHRoZSBtb2R1bGUgXHUyMDE0IGlmIHNoYXJlLW1vZGFsLmpzIHdhcyBleGNsdWRlZCBmcm9tIHRoZVxuICAgICAgLy8gYnVuZGxlLCB0aGUgYnV0dG9uIHN0aWxsIHJlbmRlcnMgYnV0IGNsaWNraW5nIGl0IHN1cmZhY2VzIGEgY2xlYXJcbiAgICAgIC8vIGVycm9yIHRvYXN0IGluc3RlYWQgb2YgYSBzaWxlbnQgbm8tb3AuXG4gICAgICBpZiAocy5pZCAhPT0gJ2ludGVybmV0Jykge1xuICAgICAgICBjb25zdCBzaGFyZUJ0biA9IGVsKCdidXR0b24nLCAnc2hhcmUtYnRuJywgJ1x1RDgzRFx1REQxNycpO1xuICAgICAgICBzaGFyZUJ0bi50aXRsZSA9ICdTaGFyZSB0aGlzIHNlcnZpY2UgKFBybyknO1xuICAgICAgICBzaGFyZUJ0bi5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lm9wZW5TaGFyZU1vZGFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cub3BlblNoYXJlTW9kYWwocyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93LnNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zaG93Tm90aWZpY2F0aW9uKCdTaGFyZSBtb2RhbCBub3QgbG9hZGVkLiBSZWZyZXNoIHRoZSBwYWdlLicsICdlcnJvcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnRuUm93LmFwcGVuZENoaWxkKHNoYXJlQnRuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGRlbGV0ZSBidXR0b24gZm9yIGFsbCBzZXJ2aWNlcyBleGNlcHQgSW50ZXJuZXRcbiAgICAgIGlmIChzLmlkICE9PSAnaW50ZXJuZXQnKSB7XG4gICAgICAgIGNvbnN0IGRlbEJ0biA9IGVsKCdidXR0b24nLCAnZGVsZXRlLWJ0bicsICdcdUQ4M0RcdURERDFcdUZFMEYnKTtcbiAgICAgICAgZGVsQnRuLnRpdGxlID0gJ0RlbGV0ZSB0aGlzIHNlcnZpY2UnO1xuICAgICAgICBkZWxCdG4ub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB3aW5kb3cuZGVsZXRlU2VydmljZShzLmlkLCBzLm5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICBidG5Sb3cuYXBwZW5kQ2hpbGQoZGVsQnRuKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnRuID0gZWwoJ2J1dHRvbicsIG51bGwsICdPcGVuJyk7XG4gICAgICBidG4ub25jbGljayA9ICgpID0+IHdpbmRvdy5vcGVuKHNlcnZpY2VVcmwocy5pZCksICdfYmxhbmsnLCAnbm9vcGVuZXInKTtcbiAgICAgIGJ0blJvdy5hcHBlbmRDaGlsZChidG4pO1xuICAgICAgY2FyZC5hcHBlbmRDaGlsZChidG5Sb3cpO1xuICAgICAgY2FyZC5zdHlsZS50cmFuc2l0aW9uRGVsYXkgPSBgJHtNYXRoLm1pbihpICogNDUsIDI3MCl9bXNgO1xuXG4gICAgICByb290LmFwcGVuZENoaWxkKGNhcmQpO1xuICAgIH1cblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkJykuZm9yRWFjaChjYXJkID0+IGNhcmQuY2xhc3NMaXN0LmFkZCgnbG9hZGVkJykpO1xuICAgIH0pO1xuXG4gICAgLy8gR3JvdXAgcmVjaXBlIGNhcmRzIHZpc3VhbGx5IGFmdGVyIGdyaWQgaXMgYnVpbHRcbiAgICBpZiAod2luZG93Lmdyb3VwUmVjaXBlQ2FyZHMpIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB3aW5kb3cuZ3JvdXBSZWNpcGVDYXJkcygpKTtcblxuICAgIC8vIFJlZnJlc2ggdGhlIHNlcnZpY2UgZmlsdGVyIHNvIHRoZSBjYXRlZ29yeSBkcm9wZG93biByZWZsZWN0cyBuZXcgc2VydmljZXNcbiAgICBpZiAod2luZG93LnJlZnJlc2hTZXJ2aWNlRmlsdGVyKSB3aW5kb3cucmVmcmVzaFNlcnZpY2VGaWx0ZXIoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEJhZGdlKGlkLCB1cCwgcmVzcG9uc2VUaW1lID0gbnVsbCkge1xuICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3QtJyArIGlkICsgJy1ncmlkJyk7XG4gICAgY29uc3QgcGlsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWRnZS0nICsgaWQpO1xuICAgIGNvbnN0IHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lLScgKyBpZCk7XG4gICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcD1cIiR7aWR9XCJdYCk7XG5cbiAgICBpZiAoZG90KSB7XG4gICAgICBkb3QuY2xhc3NMaXN0LnRvZ2dsZSgnb2snLCB1cCk7XG4gICAgICBkb3QuY2xhc3NMaXN0LnRvZ2dsZSgnYmFkJywgIXVwKTtcbiAgICB9XG5cbiAgICBpZiAocGlsbCkge1xuICAgICAgcGlsbC50ZXh0Q29udGVudCA9IHVwID8gJ09OJyA6ICdPRkYnO1xuICAgICAgcGlsbC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsIHVwKTtcbiAgICAgIHBpbGwuY2xhc3NMaXN0LnRvZ2dsZSgnb2ZmJywgIXVwKTtcbiAgICB9XG5cbiAgICBpZiAodGltZUVsICYmIHJlc3BvbnNlVGltZSAhPT0gbnVsbCkge1xuICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gdXAgPyBgJHtyZXNwb25zZVRpbWV9bXNgIDogJ3RpbWVvdXQnO1xuICAgICAgdGltZUVsLmNsYXNzTmFtZSA9IGByZXNwb25zZS10aW1lICR7Z2V0UmVzcG9uc2VUaW1lQ2xhc3MocmVzcG9uc2VUaW1lLCB1cCl9YDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY2FyZCBzdGF0dXMgZm9yIGljb24gY29sb3JpbmdcbiAgICBpZiAoY2FyZCkge1xuICAgICAgY2FyZC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgdXAgPyAnb24nIDogJ29mZicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hBbGwoKSB7XG4gICAgaWYgKHJlZnJlc2hJbkZsaWdodCkge1xuICAgICAgcmVmcmVzaFF1ZXVlZCA9IHRydWU7XG4gICAgICByZXR1cm4gcmVmcmVzaEluRmxpZ2h0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YW1wKGxhYmVsLCBjaGVja2VkQXQgPSBuZXcgRGF0ZSgpKSB7XG4gICAgICBjb25zdCBzdGFtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGFtcCcpO1xuICAgICAgaWYgKHN0YW1wKSBzdGFtcC50ZXh0Q29udGVudCA9IGAke2xhYmVsfTogJHtuZXcgRGF0ZShjaGVja2VkQXQpLnRvTG9jYWxlVGltZVN0cmluZygpfWA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHlCYXRjaFJlc3VsdHMoc3RhdHVzZXMpIHtcbiAgICAgIGNvbnN0IGRuc0lkcyA9IE9iamVjdC5rZXlzKFNJVEUuZG5zU2VydmVycyk7XG4gICAgICBkbnNJZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RhdHVzZXNbaWRdO1xuICAgICAgICBpZiAocmVzdWx0KSBzZXRRdWljayhpZCwgcmVzdWx0LmlzVXAsIHJlc3VsdC5yZXNwb25zZVRpbWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0dXNlcy5pbnRlcm5ldCkge1xuICAgICAgICBzZXRRdWljaygnaW50ZXJuZXQnLCBzdGF0dXNlcy5pbnRlcm5ldC5pc1VwLCBzdGF0dXNlcy5pbnRlcm5ldC5yZXNwb25zZVRpbWUpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cuQVBQUy5mb3JFYWNoKChzZXJ2aWNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXR1c2VzW3NlcnZpY2UuaWRdO1xuICAgICAgICBpZiAocmVzdWx0KSBzZXRCYWRnZShzZXJ2aWNlLmlkLCByZXN1bHQuaXNVcCwgcmVzdWx0LnJlc3BvbnNlVGltZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiByZWZyZXNoRmFsbGJhY2soKSB7XG4gICAgICBjb25zdCBkbnNJZHMgPSBPYmplY3Qua2V5cyhTSVRFLmRuc1NlcnZlcnMpO1xuICAgICAgY29uc3QgdG9wQ2hlY2tzID0gZG5zSWRzLm1hcChpZCA9PiBjaGVja1NlcnZpY2VXaXRoVGltaW5nKGlkKSk7XG4gICAgICB0b3BDaGVja3MucHVzaChjaGVja1NlcnZpY2VXaXRoVGltaW5nKCdpbnRlcm5ldCcpKTtcbiAgICAgIGNvbnN0IHRvcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0b3BDaGVja3MpO1xuXG4gICAgICBkbnNJZHMuZm9yRWFjaCgoaWQsIGkpID0+IHNldFF1aWNrKGlkLCB0b3BSZXN1bHRzW2ldLmlzVXAsIHRvcFJlc3VsdHNbaV0ucmVzcG9uc2VUaW1lKSk7XG4gICAgICBjb25zdCBpbnRlcm5ldFJlc3VsdCA9IHRvcFJlc3VsdHNbdG9wUmVzdWx0cy5sZW5ndGggLSAxXTtcbiAgICAgIHNldFF1aWNrKCdpbnRlcm5ldCcsIGludGVybmV0UmVzdWx0LmlzVXAsIGludGVybmV0UmVzdWx0LnJlc3BvbnNlVGltZSk7XG5cbiAgICAgIGNvbnN0IGFwcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgd2luZG93LkFQUFMubWFwKGFzeW5jIHMgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrU2VydmljZVdpdGhUaW1pbmcocy5pZCk7XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IHMuaWQsIC4uLnJlc3VsdCB9O1xuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgYXBwUmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIHNldEJhZGdlKHJlc3VsdC5pZCwgcmVzdWx0LmlzVXAsIHJlc3VsdC5yZXNwb25zZVRpbWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaEluRmxpZ2h0ID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VydmljZXMvc3RhdHVzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RhdHVzIHJlZnJlc2ggZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgYXBwbHlCYXRjaFJlc3VsdHMoZGF0YS5zdGF0dXNlcyB8fCB7fSk7XG4gICAgICAgIHVwZGF0ZVN0YW1wKCdsYXN0IGNoZWNrJywgZGF0YS5jaGVja2VkQXQgfHwgbmV3IERhdGUoKSk7XG4gICAgICB9IGNhdGNoIChiYXRjaEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQmF0Y2hlZCBzdGF0dXMgcmVmcmVzaCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBkaXJlY3QgcHJvYmVzOicsIGJhdGNoRXJyb3IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hGYWxsYmFjaygpO1xuICAgICAgICAgIHVwZGF0ZVN0YW1wKCdsYXN0IGNoZWNrJyk7XG4gICAgICAgIH0gY2F0Y2ggKGZhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdEYXNoYm9hcmQgcmVmcmVzaCBmYWlsZWQ6JywgZmFsbGJhY2tFcnJvcik7XG4gICAgICAgICAgdXBkYXRlU3RhbXAoJ2xhc3QgZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlZnJlc2hJbkZsaWdodCA9IG51bGw7XG4gICAgICAgIGlmIChyZWZyZXNoUXVldWVkKSB7XG4gICAgICAgICAgcmVmcmVzaFF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB3aW5kb3cucmVmcmVzaEFsbCgpOyB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICByZXR1cm4gcmVmcmVzaEluRmxpZ2h0O1xuICB9XG5cbiAgLy8gRE5TIG9wZW4gYnV0dG9ucyBcdTIwMTQgdXNlIGV2ZW50IGRlbGVnYXRpb24gb24gLnRvcCBjb250YWluZXJcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3Qgb3BlbkJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItb3BlblwiXScpO1xuICAgIGlmICghb3BlbkJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gb3BlbkJ0bi5pZC5yZXBsYWNlKCctb3BlbicsICcnKTtcbiAgICBpZiAoU0lURS5kbnNTZXJ2ZXJzW2lkXSkgd2luZG93Lm9wZW4oc2VydmljZVVybChpZCksICdfYmxhbmsnLCAnbm9vcGVuZXInKTtcbiAgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1vcGVuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gd2luZG93Lm9wZW4oc2VydmljZVVybCgnY2EnKSwgJ19ibGFuaycsICdub29wZW5lcicpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyZWRzLWJ0bi1jYScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGNvbnN0IHMgPSB3aW5kb3cuQVBQUy5maW5kKGEgPT4gYS5pZCA9PT0gJ2NhJyk7IGlmIChzICYmIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwpIHdpbmRvdy5vcGVuU2VydmljZUNyZWRzTW9kYWwocyk7IH0pO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3B0aW9ucy1idG4tY2EnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBjb25zdCBzID0gd2luZG93LkFQUFMuZmluZChhID0+IGEuaWQgPT09ICdjYScpOyBpZiAocyAmJiB3aW5kb3cub3BlblNlcnZpY2VFZGl0TW9kYWwpIHdpbmRvdy5vcGVuU2VydmljZUVkaXRNb2RhbChzKTsgfSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtYnRuLWNhJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKHdpbmRvdy5kZWxldGVTZXJ2aWNlKSB3aW5kb3cuZGVsZXRlU2VydmljZSgnY2EnLCAnRGFzaENBJyk7IH0pO1xuXG4gIC8vIFdpbmRvdyBleHBvcnRzXG4gIHdpbmRvdy5sb2FkU2VydmljZXMgPSBsb2FkU2VydmljZXM7XG4gIHdpbmRvdy5idWlsZEdyaWQgPSBidWlsZEdyaWQ7XG4gIHdpbmRvdy5yZWZyZXNoQWxsID0gcmVmcmVzaEFsbDtcbiAgd2luZG93LnNldFF1aWNrID0gc2V0UXVpY2s7XG4gIHdpbmRvdy5zZXRCYWRnZSA9IHNldEJhZGdlO1xuICB3aW5kb3cuZ2V0UmVzcG9uc2VUaW1lQ2xhc3MgPSBnZXRSZXNwb25zZVRpbWVDbGFzcztcbiAgd2luZG93LmNoZWNrU2VydmljZVdpdGhUaW1pbmcgPSBjaGVja1NlcnZpY2VXaXRoVGltaW5nO1xuICB3aW5kb3cuc2VydmljZVVybCA9IHNlcnZpY2VVcmw7XG4gIHdpbmRvdy5lbCA9IGVsO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBETlMgTUFOQUdFTUVOVCA9PT09PT09PT09XG4oZnVuY3Rpb24gKCkge1xuICAvLyBSZXN0YXJ0IEROUyBzZXJ2aWNlIHZpYSBiYWNrZW5kIHByb3h5IChiYWNrZW5kIGhhbmRsZXMgYXV0aCBhdXRvbWF0aWNhbGx5KVxuICBhc3luYyBmdW5jdGlvbiByZXN0YXJ0RG5zU2VydmljZShkbnNJZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvZG5zL3Jlc3RhcnQvJHtkbnNJZH1gLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdSZXN0YXJ0IGZhaWxlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gRXZlbnQgZGVsZWdhdGlvbiBmb3IgRE5TIHJlc3RhcnQgYnV0dG9ucyAoZHluYW1pYyBjYXJkcylcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgcmVzdGFydEJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItcmVzdGFydFwiXScpO1xuICAgIGlmICghcmVzdGFydEJ0bikgcmV0dXJuO1xuICAgIGNvbnN0IGRuc0lkID0gcmVzdGFydEJ0bi5pZC5yZXBsYWNlKCctcmVzdGFydCcsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oYFJlc3RhcnQgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSBzZXJ2aWNlP2ApKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhCdXR0b24ocmVzdGFydEJ0biwgJy4uLicsICgpID0+IHJlc3RhcnREbnNTZXJ2aWNlKGRuc0lkKSk7XG4gICAgICBzZXRUaW1lb3V0KHdpbmRvdy5yZWZyZXNoQWxsLCBEQy5ERUxBWVMuUkVMT0FEKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0YXJ0IGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBETlMgVXBkYXRlIGJ1dHRvbnNcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRG5zU2VydmVyKGRuc0lkLCBzZXJ2ZXJJcCkge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke2Ruc0lkfS11cGRhdGVgKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidG4/LnRleHRDb250ZW50IHx8ICdcdTJCMDZcdUZFMEYnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEZpcnN0IGNoZWNrIGZvciB1cGRhdGVzXG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBidG4udGl0bGUgPSAnQ2hlY2tpbmcgZm9yIHVwZGF0ZXMuLi4nO1xuXG4gICAgICBjb25zdCBjaGVja1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvZG5zL2NoZWNrLXVwZGF0ZT9zZXJ2ZXI9JHtlbmNvZGVVUklDb21wb25lbnQoc2VydmVySXApfWApO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFjaGVja1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjaGVja1Jlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGNoZWNrIGZvciB1cGRhdGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hlY2tSZXN1bHQudXBkYXRlQXZhaWxhYmxlKSB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgICBidG4udGl0bGUgPSBgQWxyZWFkeSBvbiBsYXRlc3QgdmVyc2lvbiAoJHtjaGVja1Jlc3VsdC5jdXJyZW50VmVyc2lvbn0pYDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUhIEN1cnJlbnQgdmVyc2lvbjogJHtjaGVja1Jlc3VsdC5jdXJyZW50VmVyc2lvbn1gLCAnaW5mbycpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZSBETlMgc2VydmVyJztcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGF2YWlsYWJsZSAtIGNvbmZpcm0gd2l0aCB1c2VyXG4gICAgICBjb25zdCBjb25maXJtVXBkYXRlID0gY29uZmlybShcbiAgICAgICAgYFVwZGF0ZSBhdmFpbGFibGUgZm9yICR7ZG5zSWQudG9VcHBlckNhc2UoKX0hXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50OiAke2NoZWNrUmVzdWx0LmN1cnJlbnRWZXJzaW9ufVxcbmAgK1xuICAgICAgICBgTmV3OiAke2NoZWNrUmVzdWx0LnVwZGF0ZVZlcnNpb259XFxuXFxuYCArXG4gICAgICAgIChjaGVja1Jlc3VsdC51cGRhdGVUaXRsZSA/IGAke2NoZWNrUmVzdWx0LnVwZGF0ZVRpdGxlfVxcblxcbmAgOiAnJykgK1xuICAgICAgICBgVGhlIEROUyBzZXJ2ZXIgd2lsbCByZXN0YXJ0IGR1cmluZyB0aGUgdXBkYXRlLlxcblByb2NlZWQ/YFxuICAgICAgKTtcblxuICAgICAgaWYgKCFjb25maXJtVXBkYXRlKSB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyZm9ybSB0aGUgdXBkYXRlXG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDA0JztcbiAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGluZy4uLic7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvZG5zL3VwZGF0ZT9zZXJ2ZXI9JHtlbmNvZGVVUklDb21wb25lbnQoc2VydmVySXApfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdXBkYXRlUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoIXVwZGF0ZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih1cGRhdGVSZXN1bHQuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5tYW51YWxVcGRhdGVSZXF1aXJlZCkge1xuICAgICAgICAvLyBUZWNobml0aXVtIHYxNCsgZG9lc24ndCBzdXBwb3J0IGF1dG8taW5zdGFsbCB2aWEgQVBJXG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTJCMDZcdUZFMEYnO1xuICAgICAgICBidG4udGl0bGUgPSBgVXBkYXRlIGF2YWlsYWJsZTogJHt1cGRhdGVSZXN1bHQubmV3VmVyc2lvbn1gO1xuICAgICAgICBjb25zdCBkb3dubG9hZEluZm8gPSB1cGRhdGVSZXN1bHQuZG93bmxvYWRMaW5rXG4gICAgICAgICAgPyBgXFxuRG93bmxvYWQ6ICR7dXBkYXRlUmVzdWx0LmRvd25sb2FkTGlua31gXG4gICAgICAgICAgOiAnJztcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zSW5mbyA9IHVwZGF0ZVJlc3VsdC5pbnN0cnVjdGlvbnNMaW5rXG4gICAgICAgICAgPyBgXFxuSW5zdHJ1Y3Rpb25zOiAke3VwZGF0ZVJlc3VsdC5pbnN0cnVjdGlvbnNMaW5rfWBcbiAgICAgICAgICA6ICcnO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IHVwZGF0ZSByZXF1aXJlcyBtYW51YWwgaW5zdGFsbGF0aW9uLiBDdXJyZW50OiAke3VwZGF0ZVJlc3VsdC5wcmV2aW91c1ZlcnNpb259IFx1MjE5MiAke3VwZGF0ZVJlc3VsdC5uZXdWZXJzaW9ufS4gUGxlYXNlIHVwZGF0ZSBtYW51YWxseSBvbiB0aGUgaG9zdCBtYWNoaW5lLmAsICd3YXJuaW5nJywgODAwMCk7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgYnRuLnRpdGxlID0gJ1VwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ISAke3VwZGF0ZVJlc3VsdC5wcmV2aW91c1ZlcnNpb259IFx1MjE5MiAke3VwZGF0ZVJlc3VsdC5uZXdWZXJzaW9ufS4gU2VydmVyIGlzIHJlc3RhcnRpbmcuLi5gLCAnc3VjY2VzcycpO1xuXG4gICAgICAvLyBSZWZyZXNoIGFmdGVyIGRlbGF5IGZvciBzZXJ2ZXIgcmVzdGFydFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9LCAxMDAwMCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRE5TIHVwZGF0ZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzRDJztcbiAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgZmFpbGVkJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byB1cGRhdGUgJHtkbnNJZC50b1VwcGVyQ2FzZSgpfTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIGJ0bi50aXRsZSA9ICdVcGRhdGUgRE5TIHNlcnZlcic7XG4gICAgICB9LCAzMDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBkZWxlZ2F0aW9uIGZvciBETlMgdXBkYXRlIGJ1dHRvbnMgKGR5bmFtaWMgY2FyZHMpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUJ0biA9IGUudGFyZ2V0LmNsb3Nlc3QoJ1tpZCQ9XCItdXBkYXRlXCJdJyk7XG4gICAgaWYgKCF1cGRhdGVCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IHVwZGF0ZUJ0bi5pZC5yZXBsYWNlKCctdXBkYXRlJywgJycpO1xuICAgIGlmICghU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSkgcmV0dXJuO1xuICAgIHVwZGF0ZURuc1NlcnZlcihkbnNJZCwgU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXT8uaXApO1xuICB9KTtcblxuICAvLyA9PT09PSBETlMgU0VUVElOR1MgTU9EQUwgPT09PT1cblxuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnZG5zLXNldHRpbmdzLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwiZG5zLXNldHRpbmdzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMyBpZD1cImRucy1zZXR0aW5ncy10aXRsZVwiPkROUyBTZXR0aW5nczwvaDM+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImRucy1lZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlcnZlciBJUDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkbnMtZWRpdC1pcFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiMTkyLjE2OC4xLjFcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZG5zLWVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5Qb3J0PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZG5zLWVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1pbnB1dC1tZFwiIHBsYWNlaG9sZGVyPVwiNTM4MFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJkbnMtZWRpdC1uYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPkRpc3BsYXkgTmFtZSAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRucy1lZGl0LW5hbWVcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cImUuZy4gUHJpbWFyeSBETlNcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGludC1zbVwiPk1hbmFnZSBjcmVkZW50aWFscyB2aWEgVG9rZW5zIGluIHRoZSB0b29sYmFyPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRucy1zZXR0aW5ncy1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRucy1zZXR0aW5ncy1kZWxldGVcIiBzdHlsZT1cImJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZTc0YzNjIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6ICNlNzRjM2M7IGNvbG9yOiAjZTc0YzNjO1wiPlJlbW92ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZG5zLXNldHRpbmdzLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgbGV0IGN1cnJlbnREbnNJZCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gb3BlbkRuc1NldHRpbmdzKGRuc0lkKSB7XG4gICAgY3VycmVudERuc0lkID0gZG5zSWQ7XG4gICAgY29uc3Qgc2VydmVyID0gU0lURS5kbnNTZXJ2ZXJzW2Ruc0lkXSB8fCB7fTtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtbW9kYWwnKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtdGl0bGUnKS50ZXh0Q29udGVudCA9IGAkeyhzZXJ2ZXIubmFtZSB8fCBkbnNJZCkudG9VcHBlckNhc2UoKX0gU2V0dGluZ3NgO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1pcCcpLnZhbHVlID0gc2VydmVyLmlwIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1wb3J0JykudmFsdWUgPSBzZXJ2ZXIucG9ydCB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWVkaXQtbmFtZScpLnZhbHVlID0gc2VydmVyLm5hbWUgfHwgJyc7XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzYXZlRG5zU2V0dGluZ3MoKSB7XG4gICAgaWYgKCFjdXJyZW50RG5zSWQpIHJldHVybjtcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1pcCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBwb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1lZGl0LXBvcnQnKS52YWx1ZS50cmltKCkgfHwgREMuREVGQVVMVFMuRE5TX1BPUlQ7XG4gICAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtZWRpdC1uYW1lJykudmFsdWUudHJpbSgpO1xuXG4gICAgaWYgKCFpcCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignU2VydmVyIElQIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGUgPSB7IGRuc1NlcnZlcnM6IHt9IH07XG4gICAgdXBkYXRlLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXSA9IHsgaXAsIHBvcnQ6IFN0cmluZyhwb3J0KSB9O1xuICAgIGlmIChuYW1lKSB1cGRhdGUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdLm5hbWUgPSBuYW1lO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIFNJVEUuZG5zU2VydmVyc1tjdXJyZW50RG5zSWRdID0gdXBkYXRlLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50RG5zSWQudG9VcHBlckNhc2UoKX0gc2V0dGluZ3Mgc2F2ZWRgLCAnc3VjY2VzcycpO1xuICAgICAgICBjbG9zZURuc1NldHRpbmdzKCk7XG4gICAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKHJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIHNhdmUgc2V0dGluZ3MnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlbW92ZURuc1NlcnZlcigpIHtcbiAgICBpZiAoIWN1cnJlbnREbnNJZCkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybShgUmVtb3ZlICR7Y3VycmVudERuc0lkLnRvVXBwZXJDYXNlKCl9IGZyb20gZGFzaGJvYXJkPyBUaGlzIHdvbid0IGFmZmVjdCB0aGUgYWN0dWFsIEROUyBzZXJ2ZXIuYCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBieSBzZXR0aW5nIHRvIG51bGwgaW4gZG5zU2VydmVyc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChjb25maWcuZG5zU2VydmVycykge1xuICAgICAgICBkZWxldGUgY29uZmlnLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhdmVSZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG5zU2VydmVyczogY29uZmlnLmRuc1NlcnZlcnMgfHwge30gfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2F2ZVJlc3AuanNvbigpO1xuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGRlbGV0ZSBTSVRFLmRuc1NlcnZlcnNbY3VycmVudERuc0lkXTtcbiAgICAgICAgLy8gUmVtb3ZlIGNhcmQgZnJvbSBET01cbiAgICAgICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC50b3AgW2RhdGEtYXBwPVwiJHtjdXJyZW50RG5zSWR9XCJdYCk7XG4gICAgICAgIGlmIChjYXJkKSBjYXJkLnJlbW92ZSgpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2N1cnJlbnREbnNJZC50b1VwcGVyQ2FzZSgpfSByZW1vdmVkIGZyb20gZGFzaGJvYXJkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgY2xvc2VEbnNTZXR0aW5ncygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihyZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byByZW1vdmUnLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byByZW1vdmU6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VEbnNTZXR0aW5ncygpIHtcbiAgICBjbG9zZU1vZGFsKCdkbnMtc2V0dGluZ3MtbW9kYWwnKTtcbiAgICBjdXJyZW50RG5zSWQgPSBudWxsO1xuICB9XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXJzIGZvciBtb2RhbCBidXR0b25zXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VEbnNTZXR0aW5ncyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3Mtc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVEbnNTZXR0aW5ncyk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkbnMtc2V0dGluZ3MtZGVsZXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVtb3ZlRG5zU2VydmVyKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1zZXR0aW5ncy1tb2RhbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmlkID09PSAnZG5zLXNldHRpbmdzLW1vZGFsJykgY2xvc2VEbnNTZXR0aW5ncygpO1xuICB9KTtcbiAgLy8gRXZlbnQgZGVsZWdhdGlvbiBmb3IgRE5TIHNldHRpbmdzIGJ1dHRvbnMgKGR5bmFtaWMgY2FyZHMpXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IHNldHRpbmdzQnRuID0gZS50YXJnZXQuY2xvc2VzdCgnW2lkJD1cIi1zZXR0aW5nc1wiXScpO1xuICAgIGlmICghc2V0dGluZ3NCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IHNldHRpbmdzQnRuLmlkLnJlcGxhY2UoJy1zZXR0aW5ncycsICcnKTtcbiAgICBpZiAoIVNJVEUuZG5zU2VydmVyc1tkbnNJZF0pIHJldHVybjtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIG9wZW5EbnNTZXR0aW5ncyhkbnNJZCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgd2luZG93LnJlZnJlc2hBbGwpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gTE9HIFZJRVdFUlMgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyBJbmplY3QgbG9ncy1tb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdsb2dzLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwibG9ncy1tb2RhbFwiIGNsYXNzPVwibG9ncy1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2dzLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODAwcHg7IG1heC13aWR0aDogMTAwMHB4O1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtaGVhZGVyXCI+XG4gICAgICAgIDxoMyBpZD1cImxvZ3MtdGl0bGVcIj5ETlMgTG9nczwvaDM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZy1saW5lc1wiPlNob3c6PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwibG9nLWxpbmVzXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMjVcIiBzZWxlY3RlZD4yNTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+NTA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDBcIj4xMDA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyMDBcIj4yMDA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibG9ncy1zdHJlYW1cIiBjbGFzcz1cInN0cmVhbS1idG5cIiB0aXRsZT1cIkVuYWJsZSByZWFsLXRpbWUgc3RyZWFtaW5nXCI+XHVEODNEXHVEQ0UxIExpdmU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwibG9ncy1wYXVzZVwiIGNsYXNzPVwicGF1c2UtYnRuXCI+XHUyM0Y4XHVGRTBGIFBhdXNlPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImxvZ3MtY2xvc2VcIiBjbGFzcz1cImNsb3NlLWJ0blwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtY29udGFpbmVyIHNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBpZD1cImxvZ3MtY29udGVudFwiIGNsYXNzPVwibG9ncy1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICAvLyA9PT09PSBTdGF0ZSA9PT09PVxuICBsZXQgY3VycmVudERuc1NlcnZpY2UgPSBudWxsO1xuICBsZXQgbG9nc0ludGVydmFsID0gbnVsbDtcbiAgbGV0IGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICBsZXQgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRDb250YWluZXJOYW1lID0gbnVsbDtcbiAgbGV0IGNvbnRhaW5lckxvZ3NNb2RlID0gZmFsc2U7XG5cbiAgbGV0IGN1cnJlbnRMb2dQYXRoID0gbnVsbDtcbiAgbGV0IGN1cnJlbnRMb2dTZXJ2aWNlTmFtZSA9IG51bGw7XG4gIGxldCBmaWxlTG9nc01vZGUgPSBmYWxzZTtcblxuICBsZXQgbG9nRXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcblxuICAvLyA9PT09PSBETlMgTE9HUyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoRG5zTG9ncyhkbnNJZCwgbGluZXMgPSAyNSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJ2ZXJJUCA9IGdldERuc1NlcnZlckFkZHIoZG5zSWQpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9kbnMvbG9ncz9zZXJ2ZXI9JHtzZXJ2ZXJJUH0mbGltaXQ9JHtsaW5lc31gLCB7XG4gICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5sb2dzKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbG9nczogcmVzdWx0LmxvZ3MsIGNvdW50OiByZXN1bHQuY291bnQsIHNlcnZlcjogcmVzdWx0LnNlcnZlciB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBsb2dzJyB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiAnRE5TIGF1dG8tYXV0aCBmYWlsZWQgLSBjaGVjayBjcmVkZW50aWFscyBpbiBzZXR0aW5ncycgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ROUyBsb2dzIGZldGNoIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4geyBlcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJjb2RlQ29sb3IocmNvZGUpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7XG4gICAgICAnTm9FcnJvcic6ICd2YXIoLS1vay1mZyknLFxuICAgICAgJ05PRVJST1InOiAndmFyKC0tb2stZmcpJyxcbiAgICAgICdOeERvbWFpbic6ICd2YXIoLS1tdXRlZCknLFxuICAgICAgJ05YRE9NQUlOJzogJ3ZhcigtLW11dGVkKScsXG4gICAgICAnUmVmdXNlZCc6ICd2YXIoLS1iYWQtZmcpJyxcbiAgICAgICdSRUZVU0VEJzogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgJ1NlcnZlckZhaWx1cmUnOiAnI2YzOWMxMicsXG4gICAgICAnU0VSVkZBSUwnOiAnI2YzOWMxMidcbiAgICB9O1xuICAgIHJldHVybiBjb2xvcnNbcmNvZGVdIHx8ICd2YXIoLS1mZyknO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyRG5zTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTQwcHggMTEwcHggMWZyIDcwcHggODBweDsgZ2FwOiA4cHg7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjhyZW07IGFsaWduLWl0ZW1zOiBjZW50ZXI7JztcblxuICAgIC8vIElmIHVucGFyc2VkIHJhdyBsb2dcbiAgICBpZiAobG9nLnBhcnNlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGRpdi5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJzFmcic7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChsb2cucmF3KX08L3NwYW4+YDtcbiAgICAgIHJldHVybiBkaXY7XG4gICAgfVxuXG4gICAgY29uc3QgcmNvZGVDb2xvciA9IGdldFJjb2RlQ29sb3IobG9nLnJjb2RlKTtcbiAgICBjb25zdCBpc0Jsb2NrZWQgPSBsb2cucmNvZGUgPT09ICdSZWZ1c2VkJyB8fCBsb2cucmNvZGUgPT09ICdSRUZVU0VEJztcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4ke2VzY2FwZUh0bWwobG9nLnRpbWVzdGFtcCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjc1cmVtO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGxvZy5jbGllbnQpfVwiPiR7ZXNjYXBlSHRtbChsb2cuY2xpZW50KX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyAke2lzQmxvY2tlZCA/ICd0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgb3BhY2l0eTogMC42OycgOiAnJ31cIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChsb2cuZG9tYWluKX1cIj4ke2VzY2FwZUh0bWwobG9nLmRvbWFpbil9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy50eXBlKX08L3NwYW4+XG4gICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAke3Jjb2RlQ29sb3J9OyBmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKGxvZy5yY29kZSl9PC9zcGFuPlxuICAgIGA7XG5cbiAgICByZXR1cm4gZGl2O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTG9nc0Rpc3BsYXkoKSB7XG4gICAgLy8gSGFuZGxlIGZpbGUgbG9ncyBtb2RlXG4gICAgaWYgKGZpbGVMb2dzTW9kZSkge1xuICAgICAgYXdhaXQgdXBkYXRlRmlsZUxvZ3NEaXNwbGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbnRhaW5lciBsb2dzIG1vZGVcbiAgICBpZiAoY29udGFpbmVyTG9nc01vZGUpIHtcbiAgICAgIGF3YWl0IHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIEROUyBsb2dzIG1vZGVcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudERuc1NlcnZpY2UpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmVzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZy1saW5lcycpLnZhbHVlKTtcbiAgICBjb25zdCBsb2dzQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNvbnRlbnQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaERuc0xvZ3MoY3VycmVudERuc1NlcnZpY2UsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaGVhZGVyIHJvd1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxNDBweCAxMTBweCAxZnIgNzBweCA4MHB4OyBnYXA6IDhweDsgcGFkZGluZzogOHB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuNzVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBvc2l0aW9uOiBzdGlja3k7IHRvcDogMDtcIj5cbiAgICAgICAgICA8c3Bhbj5UaW1lPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPkNsaWVudDwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5Eb21haW48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+VHlwZTwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj5TdGF0dXM8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGlmIChyZXN1bHQubG9ncyAmJiByZXN1bHQubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5sb2dzLmZvckVhY2gobG9nID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gcmVuZGVyRG5zTG9nRW50cnkobG9nKTtcbiAgICAgICAgICBsb2dzQ29udGVudC5hcHBlbmRDaGlsZChsb2dFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICBObyBETlMgcXVlcmllcyBsb2dnZWQgeWV0XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICBGYWlsZWQgdG8gZmV0Y2ggbG9nczogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Mb2dzTW9kYWwoZG5zSWQpIHtcbiAgICBjdXJyZW50RG5zU2VydmljZSA9IGRuc0lkO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1tb2RhbCcpO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtdGl0bGUnKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3Qgc3RyZWFtQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3Mtc3RyZWFtJyk7XG5cbiAgICB0aXRsZS50ZXh0Q29udGVudCA9IGAke2Ruc0lkLnRvVXBwZXJDYXNlKCl9IEROUyBMb2dzYDtcbiAgICBwYXVzZUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjhcdUZFMEYgUGF1c2UnO1xuICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuXG4gICAgLy8gSGlkZSBzdHJlYW0gYnV0dG9uIGZvciBETlMgbG9ncyAob25seSBhdmFpbGFibGUgZm9yIGNvbnRhaW5lciBsb2dzKVxuICAgIGlmIChzdHJlYW1CdG4pIHtcbiAgICAgIHN0cmVhbUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEluaXRpYWwgbG9hZFxuICAgIHVwZGF0ZUxvZ3NEaXNwbGF5KCk7XG5cbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggZXZlcnkgMyBzZWNvbmRzXG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZUxvZ3NNb2RhbCgpIHtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgaWYgKGxvZ3NJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChsb2dzSW50ZXJ2YWwpO1xuICAgICAgbG9nc0ludGVydmFsID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTdG9wIFNTRSBzdHJlYW1pbmcgaWYgYWN0aXZlXG4gICAgc3RvcExvZ1N0cmVhbWluZygpO1xuXG4gICAgLy8gUmVzZXQgYWxsIGxvZyBtb2Rlc1xuICAgIGN1cnJlbnREbnNTZXJ2aWNlID0gbnVsbDtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgY3VycmVudENvbnRhaW5lck5hbWUgPSBudWxsO1xuICAgIGZpbGVMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGN1cnJlbnRMb2dQYXRoID0gbnVsbDtcbiAgICBjdXJyZW50TG9nU2VydmljZU5hbWUgPSBudWxsO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8vID09PT09IFNTRSBMT0cgU1RSRUFNSU5HID09PT09XG5cbiAgZnVuY3Rpb24gc3RhcnRMb2dTdHJlYW1pbmcoY29udGFpbmVySWQpIHtcbiAgICBpZiAobG9nRXZlbnRTb3VyY2UpIHtcbiAgICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3QgbG9nc0NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1jb250ZW50Jyk7XG5cbiAgICAvLyBTdG9wIGludGVydmFsLWJhc2VkIHJlZnJlc2hcbiAgICBpZiAobG9nc0ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKGxvZ3NJbnRlcnZhbCk7XG4gICAgICBsb2dzSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsb2dFdmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZShgL2FwaS92MS9sb2dzL3N0cmVhbS8ke2NvbnRhaW5lcklkfWApO1xuICAgICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuXG4gICAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDM0IExpdmUnO1xuICAgICAgc3RyZWFtQnRuLnRpdGxlID0gJ1N0cmVhbWluZyAtIGNsaWNrIHRvIHN0b3AnO1xuICAgICAgcGF1c2VCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgLy8gQWRkIHN0cmVhbWluZyBpbmRpY2F0b3IgdG8gaGVhZGVyXG4gICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgICBpZiAoIXRpdGxlLnRleHRDb250ZW50LmluY2x1ZGVzKCdcdUQ4M0RcdUREMzQnKSkge1xuICAgICAgICB0aXRsZS5pbm5lckhUTUwgPSB0aXRsZS50ZXh0Q29udGVudC5yZXBsYWNlKCdcdUQ4M0RcdURDQ0InLCAnXHVEODNEXHVEQ0NCIFx1RDgzRFx1REQzNCcpO1xuICAgICAgfVxuXG4gICAgICBsb2dFdmVudFNvdXJjZS5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcblxuICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTdHJlYW0gZXJyb3I6JywgZGF0YS5lcnJvcik7XG4gICAgICAgICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQXBwZW5kIG5ldyBsb2cgZW50cnlcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgICAgICAgIGVudHJ5LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsnO1xuXG4gICAgICAgICAgY29uc3Qgc3RyZWFtVHlwZSA9IGRhdGEuc3RyZWFtIHx8ICdzdGRvdXQnO1xuICAgICAgICAgIGNvbnN0IGlzRXJyb3IgPSBzdHJlYW1UeXBlID09PSAnc3RkZXJyJztcbiAgICAgICAgICBjb25zdCBsZXZlbENvbG9yID0gaXNFcnJvciA/ICd2YXIoLS1iYWQtZmcpJyA6ICd2YXIoLS1mZyknO1xuICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBpc0Vycm9yID8gJ3ZhcigtLWJhZC1iZyknIDogJ3ZhcigtLW9rLWJnKSc7XG4gICAgICAgICAgY29uc3QgbGV2ZWxCYWRnZSA9IGA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke2xldmVsQ29sb3J9OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwOyBtaW4td2lkdGg6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke2lzRXJyb3IgPyAnU1RERVJSJyA6ICdTVERPVVQnfTwvc3Bhbj5gO1xuXG4gICAgICAgICAgZW50cnkuaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPiR7bGV2ZWxCYWRnZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBjb2xvcjogJHtsZXZlbENvbG9yfTsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XCI+JHtlc2NhcGVIdG1sKGRhdGEudGV4dCl9PC9kaXY+XG4gICAgICAgICAgYDtcblxuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5KTtcblxuICAgICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRvIGJvdHRvbVxuICAgICAgICAgIGxvZ3NDb250ZW50LnNjcm9sbFRvcCA9IGxvZ3NDb250ZW50LnNjcm9sbEhlaWdodDtcblxuICAgICAgICAgIC8vIExpbWl0IGVudHJpZXMgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzIChrZWVwIGxhc3QgNTAwKVxuICAgICAgICAgIHdoaWxlIChsb2dzQ29udGVudC5jaGlsZHJlbi5sZW5ndGggPiA1MDApIHtcbiAgICAgICAgICAgIGxvZ3NDb250ZW50LnJlbW92ZUNoaWxkKGxvZ3NDb250ZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdHJlYW0gZGF0YTonLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsb2dFdmVudFNvdXJjZS5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnIpO1xuICAgICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgc3RyZWFtaW5nOicsIGVycik7XG4gICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcExvZ1N0cmVhbWluZygpIHtcbiAgICBpZiAobG9nRXZlbnRTb3VyY2UpIHtcbiAgICAgIGxvZ0V2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBsb2dFdmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlzU3RyZWFtaW5nID0gZmFsc2U7XG5cbiAgICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKTtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG4gICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy10aXRsZScpO1xuXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENFMSBMaXZlJztcbiAgICAgIHN0cmVhbUJ0bi50aXRsZSA9ICdFbmFibGUgcmVhbC10aW1lIHN0cmVhbWluZyc7XG4gICAgfVxuXG4gICAgaWYgKHBhdXNlQnRuKSB7XG4gICAgICBwYXVzZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aXRsZS50ZXh0Q29udGVudCA9IHRpdGxlLnRleHRDb250ZW50LnJlcGxhY2UoJyBcdUQ4M0RcdUREMzQnLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gUmVzdGFydCBpbnRlcnZhbC1iYXNlZCByZWZyZXNoIGlmIGNvbnRhaW5lciBsb2dzIG1vZGFsIGlzIG9wZW5cbiAgICBpZiAoY29udGFpbmVyTG9nc01vZGUgJiYgY3VycmVudENvbnRhaW5lcklkICYmICFsb2dzSW50ZXJ2YWwpIHtcbiAgICAgIGxvZ3NJbnRlcnZhbCA9IHNldEludGVydmFsKHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENPTlRBSU5FUiBMT0dTID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDb250YWluZXJMb2dzKGNvbnRhaW5lcklkLCBsaW5lcyA9IDEwMCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL2xvZ3MvY29udGFpbmVyLyR7Y29udGFpbmVySWR9P3RhaWw9JHtsaW5lc30mdGltZXN0YW1wcz10cnVlYDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlbmRwb2ludCwge1xuICAgICAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZScgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQubG9ncykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2dzOiByZXN1bHQubG9ncyxcbiAgICAgICAgICAgIGNvdW50OiByZXN1bHQuY291bnQsXG4gICAgICAgICAgICBjb250YWluZXJOYW1lOiByZXN1bHQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiByZXN1bHQuY29udGFpbmVySWRcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBjb250YWluZXIgbG9ncycgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQ29udGFpbmVyIGxvZ3MgZmV0Y2ggZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQ29udGFpbmVyTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7JztcblxuICAgIGNvbnN0IHN0cmVhbUNvbG9yID0gbG9nLnN0cmVhbSA9PT0gJ3N0ZGVycicgPyAndmFyKC0tYmFkLWZnKScgOiAndmFyKC0tZmcpJztcbiAgICBjb25zdCBzdHJlYW1CYWRnZSA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID9cbiAgICAgICc8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwO1wiPlNUREVSUjwvc3Bhbj4nIDpcbiAgICAgICc8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgY29sb3I6IHZhcigtLW9rLWZnKTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuN3JlbTsgZm9udC13ZWlnaHQ6IDYwMDtcIj5TVERPVVQ8L3NwYW4+JztcblxuICAgIGRpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleC1zaHJpbms6IDA7XCI+JHtzdHJlYW1CYWRnZX08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBjb2xvcjogJHtzdHJlYW1Db2xvcn07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9kaXY+XG4gICAgYDtcblxuICAgIHJldHVybiBkaXY7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb250YWluZXJMb2dzRGlzcGxheSgpIHtcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudENvbnRhaW5lcklkIHx8ICFjb250YWluZXJMb2dzTW9kZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGluZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJykudmFsdWUpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoQ29udGFpbmVyTG9ncyhjdXJyZW50Q29udGFpbmVySWQsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgaGVhZGVyIHJvd1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC43NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW11dGVkKTsgcG9zaXRpb246IHN0aWNreTsgdG9wOiAwO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleC1zaHJpbms6IDA7IHdpZHRoOiA4MHB4O1wiPlN0cmVhbTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+TG9nIE91dHB1dDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcblxuICAgICAgaWYgKHJlc3VsdC5sb2dzICYmIHJlc3VsdC5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0LmxvZ3MuZm9yRWFjaChsb2cgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvZ0VsZW1lbnQgPSByZW5kZXJDb250YWluZXJMb2dFbnRyeShsb2cpO1xuICAgICAgICAgIGxvZ3NDb250ZW50LmFwcGVuZENoaWxkKGxvZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgbG9nc0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nc0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MICs9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgTm8gbG9ncyBhdmFpbGFibGUgZm9yIHRoaXMgY29udGFpbmVyXG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nc0NvbnRlbnQuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cbiAgICAgICAgICBGYWlsZWQgdG8gZmV0Y2ggbG9nczogJHtlc2NhcGVIdG1sKGVycm9yLm1lc3NhZ2UpfVxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Db250YWluZXJMb2dzTW9kYWwoY29udGFpbmVySWQsIGNvbnRhaW5lck5hbWUpIHtcbiAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICBjdXJyZW50Q29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgY29udGFpbmVyTG9nc01vZGUgPSB0cnVlO1xuICAgIGZpbGVMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbWluZ1xuICAgIHN0b3BMb2dTdHJlYW1pbmcoKTtcblxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0NCICR7Y29udGFpbmVyTmFtZX0gLSBDb250YWluZXIgTG9nc2A7XG4gICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcblxuICAgIC8vIFNob3cgc3RyZWFtIGJ1dHRvbiBmb3IgY29udGFpbmVyIGxvZ3NcbiAgICBpZiAoc3RyZWFtQnRuKSB7XG4gICAgICBzdHJlYW1CdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cblxuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEluaXRpYWwgbG9hZFxuICAgIHVwZGF0ZUNvbnRhaW5lckxvZ3NEaXNwbGF5KCk7XG5cbiAgICAvLyBTdGFydCBhdXRvLXJlZnJlc2ggZXZlcnkgMyBzZWNvbmRzXG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXksIERDLlBPTEwuTE9HUyk7XG4gIH1cblxuICAvLyA9PT09PSBGSUxFLUJBU0VEIExPR1MgKGZvciBuYXRpdmUgYXBwcykgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaEZpbGVMb2dzKGxvZ1BhdGgsIGxpbmVzID0gMTAwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gYC9hcGkvdjEvbG9ncy9maWxlP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQobG9nUGF0aCl9JnRhaWw9JHtsaW5lc31gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGVuZHBvaW50LCB7XG4gICAgICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDYWNoZS1Db250cm9sJzogJ25vLWNhY2hlJyB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5sb2dzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvZ3M6IHJlc3VsdC5sb2dzLFxuICAgICAgICAgICAgY291bnQ6IHJlc3VsdC5jb3VudCxcbiAgICAgICAgICAgIGxvZ1BhdGg6IHJlc3VsdC5sb2dQYXRoLFxuICAgICAgICAgICAgdG90YWxMaW5lczogcmVzdWx0LnRvdGFsTGluZXNcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiByZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBmaWxlIGxvZ3MnIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHJlc3VsdC5lcnJvciB8fCBgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c31gIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZpbGUgbG9ncyBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJGaWxlTG9nRW50cnkobG9nKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9ICdsb2ctZW50cnknO1xuICAgIGRpdi5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogMTJweDsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuOHJlbTsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7JztcblxuICAgIGNvbnN0IHRleHQgPSBsb2cudGV4dDtcbiAgICBsZXQgbG9nTGV2ZWwgPSAnSU5GTyc7XG4gICAgbGV0IGxldmVsQ29sb3IgPSAndmFyKC0tZmcpJztcblxuICAgIGlmICh0ZXh0Lm1hdGNoKC9FUlJPUnxGQVRBTHxDUklUSUNBTC9pKSkge1xuICAgICAgbG9nTGV2ZWwgPSAnRVJST1InO1xuICAgICAgbGV2ZWxDb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICB9IGVsc2UgaWYgKHRleHQubWF0Y2goL1dBUk58V0FSTklORy9pKSkge1xuICAgICAgbG9nTGV2ZWwgPSAnV0FSTic7XG4gICAgICBsZXZlbENvbG9yID0gJyNmMzljMTInO1xuICAgIH0gZWxzZSBpZiAodGV4dC5tYXRjaCgvREVCVUcvaSkpIHtcbiAgICAgIGxvZ0xldmVsID0gJ0RFQlVHJztcbiAgICAgIGxldmVsQ29sb3IgPSAndmFyKC0tbXV0ZWQpJztcbiAgICB9XG5cbiAgICBjb25zdCBiZ0NvbG9yID0gbGV2ZWxDb2xvciA9PT0gJ3ZhcigtLWJhZC1mZyknID8gJ3ZhcigtLWJhZC1iZyknIDogJ3ZhcigtLW9rLWJnKSc7XG4gICAgY29uc3QgbGV2ZWxCYWRnZSA9IGA8c3BhbiBzdHlsZT1cImJhY2tncm91bmQ6ICR7YmdDb2xvcn07IGNvbG9yOiAke2xldmVsQ29sb3J9OyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBmb250LXdlaWdodDogNjAwOyBtaW4td2lkdGg6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke2xvZ0xldmVsfTwvc3Bhbj5gO1xuXG4gICAgZGl2LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj4ke2xldmVsQmFkZ2V9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgY29sb3I6ICR7bGV2ZWxDb2xvcn07IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPiR7ZXNjYXBlSHRtbCh0ZXh0KX08L2Rpdj5cbiAgICBgO1xuXG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVMb2dzRGlzcGxheSgpIHtcbiAgICBpZiAobG9nc1BhdXNlZCB8fCAhY3VycmVudExvZ1BhdGggfHwgIWZpbGVMb2dzTW9kZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbGluZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nLWxpbmVzJykudmFsdWUpO1xuICAgIGNvbnN0IGxvZ3NDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtY29udGVudCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoRmlsZUxvZ3MoY3VycmVudExvZ1BhdGgsIGxpbmVzKTtcblxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjJyZW07IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2QTBcdUZFMEYgRXJyb3I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+JHtlc2NhcGVIdG1sKHJlc3VsdC5lcnJvcil9PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IHBhZGRpbmc6IDhweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjc1cmVtOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwb3NpdGlvbjogc3RpY2t5OyB0b3A6IDA7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPkxvZyBPdXRwdXQgKCR7cmVzdWx0LmNvdW50fSBvZiAke3Jlc3VsdC50b3RhbExpbmVzfSBsaW5lcyk8L3NwYW4+XG4gICAgICAgIDwvZGl2PmA7XG5cbiAgICAgIGlmIChyZXN1bHQubG9ncyAmJiByZXN1bHQubG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdC5sb2dzLmZvckVhY2gobG9nID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dFbGVtZW50ID0gcmVuZGVyRmlsZUxvZ0VudHJ5KGxvZyk7XG4gICAgICAgICAgbG9nc0NvbnRlbnQuYXBwZW5kQ2hpbGQobG9nRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBsb2dzQ29udGVudC5zY3JvbGxUb3AgPSBsb2dzQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgKz0gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICBObyBsb2dzIGF2YWlsYWJsZSBpbiB0aGlzIGZpbGVcbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dzQ29udGVudC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICAgIEZhaWxlZCB0byBmZXRjaCBsb2dzOiAke2VzY2FwZUh0bWwoZXJyb3IubWVzc2FnZSl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkZpbGVMb2dzTW9kYWwobG9nUGF0aCwgc2VydmljZU5hbWUpIHtcbiAgICBjdXJyZW50TG9nUGF0aCA9IGxvZ1BhdGg7XG4gICAgY3VycmVudExvZ1NlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7XG4gICAgZmlsZUxvZ3NNb2RlID0gdHJ1ZTtcbiAgICBjb250YWluZXJMb2dzTW9kZSA9IGZhbHNlO1xuICAgIGxvZ3NQYXVzZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXRpdGxlJyk7XG4gICAgY29uc3QgcGF1c2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1wYXVzZScpO1xuICAgIGNvbnN0IHN0cmVhbUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXN0cmVhbScpO1xuXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgXHVEODNEXHVEQ0NCICR7c2VydmljZU5hbWV9IC0gQXBwbGljYXRpb24gTG9nc2A7XG4gICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICBwYXVzZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdwYXVzZWQnKTtcblxuICAgIC8vIEhpZGUgc3RyZWFtIGJ1dHRvbiBmb3IgZmlsZSBsb2dzIChvbmx5IGF2YWlsYWJsZSBmb3IgY29udGFpbmVyIGxvZ3MpXG4gICAgaWYgKHN0cmVhbUJ0bikge1xuICAgICAgc3RyZWFtQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuXG4gICAgdXBkYXRlRmlsZUxvZ3NEaXNwbGF5KCk7XG4gICAgbG9nc0ludGVydmFsID0gc2V0SW50ZXJ2YWwodXBkYXRlRmlsZUxvZ3NEaXNwbGF5LCBEQy5QT0xMLkxPR1MpO1xuICB9XG5cbiAgLy8gPT09PT0gRVZFTlQgTElTVEVORVJTID09PT09XG5cbiAgLy8gRE5TIGxvZyBidXR0b25zIFx1MjAxNCBldmVudCBkZWxlZ2F0aW9uIGZvciBkeW5hbWljIGNhcmRzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGNvbnN0IGxvZ3NCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCdbaWQkPVwiLWxvZ3NcIl0nKTtcbiAgICBpZiAoIWxvZ3NCdG4pIHJldHVybjtcbiAgICBjb25zdCBkbnNJZCA9IGxvZ3NCdG4uaWQucmVwbGFjZSgnLWxvZ3MnLCAnJyk7XG4gICAgaWYgKCFTSVRFLmRuc1NlcnZlcnNbZG5zSWRdKSByZXR1cm47XG4gICAgb3BlbkxvZ3NNb2RhbChkbnNJZCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLWNsb3NlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VMb2dzTW9kYWwpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvZ3NQYXVzZWQgPSAhbG9nc1BhdXNlZDtcbiAgICBjb25zdCBwYXVzZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLXBhdXNlJyk7XG5cbiAgICBpZiAobG9nc1BhdXNlZCkge1xuICAgICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2XHVGRTBGIFJlc3VtZSc7XG4gICAgICBwYXVzZUJ0bi5jbGFzc0xpc3QuYWRkKCdwYXVzZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF1c2VCdG4udGV4dENvbnRlbnQgPSAnXHUyM0Y4XHVGRTBGIFBhdXNlJztcbiAgICAgIHBhdXNlQnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3BhdXNlZCcpO1xuICAgICAgdXBkYXRlTG9nc0Rpc3BsYXkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2ctbGluZXMnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmICghbG9nc1BhdXNlZCkge1xuICAgICAgdXBkYXRlTG9nc0Rpc3BsYXkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFN0cmVhbSBidXR0b24gZm9yIHJlYWwtdGltZSBTU0UgbG9ncyAob25seSB3b3JrcyB3aXRoIGNvbnRhaW5lciBsb2dzKVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9ncy1zdHJlYW0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXJMb2dzTW9kZSB8fCAhY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICAvLyBTdHJlYW1pbmcgb25seSBhdmFpbGFibGUgZm9yIGNvbnRhaW5lciBsb2dzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wTG9nU3RyZWFtaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0TG9nU3RyZWFtaW5nKGN1cnJlbnRDb250YWluZXJJZCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbG9zZSBtb2RhbCBvbiBvdXRzaWRlIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dzLW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICdsb2dzLW1vZGFsJykge1xuICAgICAgY2xvc2VMb2dzTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsb3NlIGxvZ3MtbW9kYWwgb24gRXNjYXBlIGtleVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ3MtbW9kYWwnKT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgICAgY2xvc2VMb2dzTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IEVYUE9SVFMgPT09PT1cbiAgd2luZG93Lm9wZW5Db250YWluZXJMb2dzTW9kYWwgPSBvcGVuQ29udGFpbmVyTG9nc01vZGFsO1xuICB3aW5kb3cub3BlbkZpbGVMb2dzTW9kYWwgPSBvcGVuRmlsZUxvZ3NNb2RhbDtcbiAgd2luZG93Lm9wZW5Mb2dzTW9kYWwgPSBvcGVuTG9nc01vZGFsO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIE1PREFMIFRFTVBMQVRFUyA9PT09PT09PT09XG4vLyBJbmplY3RzIHRoZSBIVE1MIGZvciBzZXJ2aWNlIGVkaXQsIGRlbGV0ZSwgYW5kIGFkZCBtb2RhbHMgaW50byB0aGUgRE9NLlxuLy8gTXVzdCBsb2FkIGJlZm9yZSBzZXJ2aWNlLWNydWQuanMgYW5kIHNlcnZpY2UtY3JlYXRlLmpzLlxuKGZ1bmN0aW9uICgpIHtcblxuICBpbmplY3RNb2RhbCgnc2VydmljZS1lZGl0LW1vZGFsJywgYFxuICA8ZGl2IGlkPVwic2VydmljZS1lZGl0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA1MDBweDsgbWF4LXdpZHRoOiA2MDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInNlcnZpY2UtZWRpdC10aXRsZVwiPkVkaXQgU2VydmljZTwvaDM+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU2VydmljZSBJbmZvIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4O1wiPlxuICAgICAgICAgIDxpbWcgaWQ9XCJlZGl0LXNlcnZpY2UtbG9nby1wcmV2aWV3XCIgc3JjPVwiXCIgYWx0PVwiXCIgc3R5bGU9XCJ3aWR0aDogNDhweDsgaGVpZ2h0OiA0OHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IG9iamVjdC1maXQ6IGNvbnRhaW47IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcIiAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgPGRpdiBpZD1cImVkaXQtc2VydmljZS11cmwtZGlzcGxheVwiIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERpc3BsYXkgTmFtZSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zZXJ2aWNlLW5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBEaXNwbGF5IE5hbWVcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZWRpdC1zZXJ2aWNlLW5hbWVcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiBwbGFjZWhvbGRlcj1cIlNlcnZpY2UgbmFtZSBzaG93biBvbiBkYXNoYm9hcmRcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFN1YmRvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zdWJkb21haW5cIiBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBTdWJkb21haW5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXAtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtc3ViZG9tYWluXCIgY2xhc3M9XCJpbnB1dC1mbGV4XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiZWRpdC10bGQtc3VmZml4XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPi5ob21lPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBvcnQgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVkaXQtcG9ydFwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFBvcnRcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJlZGl0LXBvcnRcIiBjbGFzcz1cImZvcm0taW5wdXQtbWRcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFRoZSBwb3J0IENhZGR5IHdpbGwgcHJveHkgdG8gKGNvbnRhaW5lcidzIGV4cG9zZWQgcG9ydClcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJUCBBZGRyZXNzIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJlZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgSVAgQWRkcmVzc1xuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJlZGl0LWlwXCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgUHJvdGVjdGlvbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVkaXQtdGFpbHNjYWxlLW9ubHlcIiBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy01MDBcIj5UYWlsc2NhbGUtT25seSBBY2Nlc3M8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBMb2dvIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XG4gICAgICAgICAgICBTZXJ2aWNlIExvZ29cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy1nYXAtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVkaXQtbG9nby11cmxcIiBwbGFjZWhvbGRlcj1cIi9hc3NldHMvc2VydmljZS5wbmcgb3IgaHR0cHM6Ly8uLi5cIiBjbGFzcz1cImlucHV0LWZsZXhcIiAvPlxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwicGFkZGluZzogMTBweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZWRpdC1sb2dvLWZpbGVcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgIFVwbG9hZFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICBFbnRlciBhIFVSTCBvciB1cGxvYWQgYW4gaW1hZ2UgZmlsZSAoUE5HLCBKUEcsIFNWRylcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDYXRlZ29yeSAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdC1zZXJ2aWNlLWNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlxuICAgICAgICAgICAgQ2F0ZWdvcnlcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJlZGl0LXNlcnZpY2UtY2F0ZWdvcnlcIiBkYXRhLXJvbGU9XCJzZXJ2aWNlLWNhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWlucHV0LW1kXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VydmljZS1lZGl0LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwic2VydmljZS1lZGl0LXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5cbiAgICAgICAgICBTYXZlIENoYW5nZXNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgaW5qZWN0TW9kYWwoJ2RlbGV0ZS1zZXJ2aWNlLW1vZGFsJywgYFxuICA8ZGl2IGlkPVwiZGVsZXRlLXNlcnZpY2UtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQwMHB4OyBtYXgtd2lkdGg6IDUwMHB4O1wiPlxuICAgICAgPGgzIGlkPVwiZGVsZXRlLW1vZGFsLXRpdGxlXCIgY2xhc3M9XCJtYi0xNlwiPkRlbGV0ZSBTZXJ2aWNlPC9oMz5cblxuICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1tZXNzYWdlXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBsaW5lLWhlaWdodDogMS41O1wiPlxuICAgICAgICA8IS0tIER5bmFtaWMgY29udGVudCAtLT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGlkPVwiZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPkRvY2tlciBDb250YWluZXI8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRlbGV0ZS1tb2RhbC1jb250YWluZXItbmFtZVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjlyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtbW9kYWwtY2FuY2VsXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7XCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkZWxldGUtbW9kYWwtcmVtb3ZlXCIgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDIwcHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlxuICAgICAgICAgIFJlbW92ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRlbGV0ZS1tb2RhbC1kZWxldGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDEwcHggMjBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNlNzRjM2MgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1jb2xvcjogI2U3NGMzYzsgY29sb3I6ICNlNzRjM2M7XCI+XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJkZWxldGUtbW9kYWwtaGVscFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW11dGVkKSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogOHB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIDxkaXY+PHN0cm9uZz5SZW1vdmU6PC9zdHJvbmc+IFJlbW92ZSBmcm9tIGRhc2hib2FyZCBvbmx5IChjb250YWluZXIga2VlcHMgcnVubmluZyk8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDtcIj48c3Ryb25nPkRlbGV0ZTo8L3N0cm9uZz4gRnVsbCByZW1vdmFsIC0gc3RvcHMgY29udGFpbmVyLCByZW1vdmVzIEROUyAmIENhZGR5IGNvbmZpZzwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGluamVjdE1vZGFsKCdhZGQtc2VydmljZS1tb2RhbCcsIGBcbiAgPGRpdiBpZD1cImFkZC1zZXJ2aWNlLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0MjBweDsgbWF4LXdpZHRoOiA1MjBweDtcIj5cbiAgICAgIDxoMz5BZGQgU2VydmljZTwvaDM+XG5cbiAgICAgIDwhLS0gU2VydmljZSBUeXBlIFRhYnMgLS0+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiA4cHg7IHBhZGRpbmc6IDNweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGxhYmVsIGlkPVwidGFiLWxvY2FsXCIgc3R5bGU9XCJmbGV4OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTsgdHJhbnNpdGlvbjogYWxsIDAuMTVzO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwic2VydmljZS10eXBlXCIgdmFsdWU9XCJsb2NhbFwiIGlkPVwic2VydmljZS10eXBlLWxvY2FsXCIgY2hlY2tlZCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICBMb2NhbFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgaWQ9XCJ0YWItZXh0ZXJuYWxcIiBzdHlsZT1cImZsZXg6IDE7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LXdlaWdodDogNTAwOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzZXJ2aWNlLXR5cGVcIiB2YWx1ZT1cImV4dGVybmFsXCIgaWQ9XCJzZXJ2aWNlLXR5cGUtZXh0ZXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICBFeHRlcm5hbFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBpZD1cInNlcnZpY2UtdHlwZS1kZXNjcmlwdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L3NwYW4+XG5cbiAgICAgIDwhLS0gTE9DQUwgU0VSVklDRSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJsb2NhbC1zZXJ2aWNlLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZXJ2aWNlLW5hbWUtaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPk5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2VydmljZS1uYW1lLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBKZWxseWZpblwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YmRvbWFpbi1wcmV2aWV3XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tdG9wOiA0cHg7IG1pbi1oZWlnaHQ6IDFlbTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1wb3J0LWlucHV0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5Qb3J0PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJzZXJ2aWNlLXBvcnQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cImUuZy4sIDgwOTZcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1pcC1pbnB1dFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+SVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2UtaXAtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkF1dG8tZGV0ZWN0ZWRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMXJlbTtcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLWlwLWJ1dHRvbnNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW4tdG9wOiA0cHg7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWljay1pcC1idG5cIiBkYXRhLWlwPVwiMTI3LjAuMC4xXCIgdGl0bGU9XCJMb2NhbGhvc3RcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBwYWRkaW5nOiAycHggNnB4O1wiPmxvY2FsaG9zdDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInF1aWNrLWlwLWJ0blwiIGRhdGEtaXA9XCJcIiBpZD1cInF1aWNrLWlwLWxhblwiIHRpdGxlPVwiTEFOIElQXCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgcGFkZGluZzogMnB4IDZweDtcIj5MQU48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJxdWljay1pcC1idG5cIiBkYXRhLWlwPVwiXCIgaWQ9XCJxdWljay1pcC10YWlsc2NhbGVcIiB0aXRsZT1cIlRhaWxzY2FsZSBJUFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IHBhZGRpbmc6IDJweCA2cHg7XCI+VGFpbHNjYWxlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBPcHRpb25zIChjb2xsYXBzZWQgYnkgZGVmYXVsdCkgLS0+XG4gICAgICAgIDxkZXRhaWxzIGlkPVwibG9jYWwtYWR2YW5jZWQtb3B0aW9uc1wiPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjhyZW07IHVzZXItc2VsZWN0OiBub25lO1wiPk9wdGlvbnM8L3N1bW1hcnk+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7IGRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2VydmljZS1zdWJkb21haW4taW5wdXRcIj5TdWJkb21haW46PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlcnZpY2Utc3ViZG9tYWluLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJhdXRvLWRlcml2ZWQgZnJvbSBuYW1lXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtbG9nby1pbnB1dFwiPkxvZ28gVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzZXJ2aWNlLWxvZ28taW5wdXRcIiBwbGFjZWhvbGRlcj1cIi9hc3NldHMvbmFtZS5wbmdcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IHN0YXJ0O1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNyZWF0ZS1kbnMtcmVjb3JkXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBETlMgUmVjb3JkXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNzbC10eXBlLXNlbGVjdFwiPlNTTDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzc2wtdHlwZS1zZWxlY3RcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5LW1hbmFnZWRcIj5DYWRkeSBNYW5hZ2VkIChJbnRlcm5hbCk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJsZXRzZW5jcnlwdFwiPkxldCdzIEVuY3J5cHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJleGlzdGluZy1jYVwiPkV4aXN0aW5nIENBPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VzdG9tLWNhXCI+Q3VzdG9tIENBPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkbnMtY29uZmlnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLTJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRucy10dGwtaW5wdXRcIj5ETlMgVFRMOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZG5zLXR0bC1pbnB1dFwiIHZhbHVlPVwiMzAwXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNhZGR5ZmlsZS1wYXRoLWlucHV0XCI+Q2FkZHlmaWxlIFBhdGg6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY2FkZHlmaWxlLXBhdGgtaW5wdXRcIiB2YWx1ZT1cIkM6XFxcXGNhZGR5XFxcXENhZGR5ZmlsZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJleGlzdGluZy1jYS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleGlzdGluZy1jYS1zZWxlY3RcIj5FeGlzdGluZyBDQTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3ctZ2FwXCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cImV4aXN0aW5nLWNhLXNlbGVjdFwiIHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nIENBcy4uLjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwicmVmcmVzaC1jYXNcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cXHV7MUY1MDR9PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjdXN0b20tY2EtY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2EtbmFtZS1pbnB1dFwiPkNBIE5hbWU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjYS1uYW1lLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBzYW1pLWNhXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGlkPVwibWFudWFsLXRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuNzVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUuLi48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1hbnVhbC10YWlsc2NhbGUtb25seVwiIC8+XG4gICAgICAgICAgICAgIFRhaWxzY2FsZS1Pbmx5IEFjY2Vzc1xuICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwicmVsb2FkLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICBSZWxvYWQgQ2FkZHkgYWZ0ZXIgYWRkaW5nXG4gICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICA8IS0tIENhdGVnb3J5IC0tPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNlcnZpY2UtY2F0ZWdvcnktaW5wdXRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPkNhdGVnb3J5PC9sYWJlbD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBpZD1cInNlcnZpY2UtY2F0ZWdvcnktaW5wdXRcIiBkYXRhLXJvbGU9XCJzZXJ2aWNlLWNhdGVnb3J5XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAzcHg7XCI+R3JvdXAgc2VydmljZXMgb24gdGhlIGRhc2hib2FyZCBieSBwdXJwb3NlIChNZWRpYSwgUHJvZHVjdGl2aXR5LCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxociBzdHlsZT1cImJvcmRlcjogbm9uZTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbjogNHB4IDA7XCIgLz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtMmNvbFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbmFibGUtYXV0aFwiIC8+XG4gICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvblxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImVuYWJsZS1jb3JzXCIgLz5cbiAgICAgICAgICAgICAgICAgIENPUlMgSGVhZGVyc1xuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVwc3RyZWFtLXBhdGgtaW5wdXRcIj5VcHN0cmVhbSBQYXRoOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ1cHN0cmVhbS1wYXRoLWlucHV0XCIgdmFsdWU9XCIvXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImhlYWx0aC1jaGVjay1pbnB1dFwiPkhlYWx0aCBDaGVjazo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWNoZWNrLWlucHV0XCIgcGxhY2Vob2xkZXI9XCIvaGVhbHRoXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGltZW91dC1pbnB1dFwiPlRpbWVvdXQgKHMpOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInRpbWVvdXQtaW5wdXRcIiB2YWx1ZT1cIjMwXCIgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY3VzdG9tLWhlYWRlcnMtaW5wdXRcIj5IZWFkZXJzIChKU09OKTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImN1c3RvbS1oZWFkZXJzLWlucHV0XCIgcGxhY2Vob2xkZXI9J3tcIlgtQ3VzdG9tXCI6IFwidmFsdWVcIn0nIHJvd3M9XCIyXCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTtcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVYVEVSTkFMIFNFUlZJQ0UgLS0+XG4gICAgICA8ZGl2IGlkPVwiZXh0ZXJuYWwtc2VydmljZS1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLW5hbWVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7IGRpc3BsYXk6IGJsb2NrO1wiPk5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLW5hbWVcIiBwbGFjZWhvbGRlcj1cImUuZy4sIFJhZGFyciAoU2VlZGhvc3QpXCIgc3R5bGU9XCJmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJleHRlcm5hbC1zdWJkb21haW4tcHJldmlld1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLXRvcDogNHB4OyBtaW4taGVpZ2h0OiAxZW07XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4dGVybmFsLXNlcnZpY2UtdXJsXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4OyBkaXNwbGF5OiBibG9jaztcIj5FeHRlcm5hbCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ1cmxcIiBpZD1cImV4dGVybmFsLXNlcnZpY2UtdXJsXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3VzZXJuYW1lLnNlZWRob3N0LmV1L3JhZGFyclwiIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtO1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIE9wdGlvbnMgKGNvbGxhcHNlZCBieSBkZWZhdWx0KSAtLT5cbiAgICAgICAgICA8ZGV0YWlscyBpZD1cImV4dGVybmFsLWFkdmFuY2VkLW9wdGlvbnNcIj5cbiAgICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgZm9udC1zaXplOiAwLjhyZW07IHVzZXItc2VsZWN0OiBub25lO1wiPk9wdGlvbnM8L3N1bW1hcnk+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpblwiPlN1YmRvbWFpbjo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpblwiIHBsYWNlaG9sZGVyPVwiYXV0by1kZXJpdmVkIGZyb20gbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImV4dGVybmFsLWRvbWFpbi1wcmV2aWV3XCIgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1sb2dvXCI+TG9nbyBVUkw6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1sb2dvXCIgcGxhY2Vob2xkZXI9XCIvYXNzZXRzL25hbWUucG5nXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1pY29uXCI+SWNvbiBFbW9qaTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZXh0ZXJuYWwtc2VydmljZS1pY29uXCIgcGxhY2Vob2xkZXI9XCJcXHV7MUYzQUN9XCIgbWF4bGVuZ3RoPVwiMlwiIHN0eWxlPVwid2lkdGg6IDYwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJleHRlcm5hbC1jcmVhdGUtZG5zXCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBETlMgUmVjb3JkXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtY3JlYXRlLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICAgIENyZWF0ZSBDYWRkeSBSZXZlcnNlIFByb3h5XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtcHJveHktaXBcIj5Qcm94eSBTZXJ2ZXIgSVA6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImV4dGVybmFsLXByb3h5LWlwXCIgcGxhY2Vob2xkZXI9XCJBdXRvLWRldGVjdGVkXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXh0ZXJuYWwtcHJlc2VydmUtaG9zdFwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgICBQcmVzZXJ2ZSBIb3N0IEhlYWRlclxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV4dGVybmFsLWZvbGxvdy1yZWRpcmVjdHNcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICAgICAgRm9sbG93IFJlZGlyZWN0c1xuICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgIDwhLS0gQ2F0ZWdvcnkgKGV4dGVybmFsKSAtLT5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZXh0ZXJuYWwtc2VydmljZS1jYXRlZ29yeVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDsgZGlzcGxheTogYmxvY2s7XCI+Q2F0ZWdvcnk8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5XCIgZGF0YS1yb2xlPVwic2VydmljZS1jYXRlZ29yeVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IE5vIGNhdGVnb3J5IFx1MjAxNDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFkZC1zZXJ2aWNlLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYWRkLXNlcnZpY2UtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+Q3JlYXRlIFNlcnZpY2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBJTkZSQVNUUlVDVFVSRSA9PT09PT09PT09XG4vLyBDYWRkeSBjb25maWcgZ2VuZXJhdGlvbiwgRE5TIHJlY29yZCBjcmVhdGlvbiwgYW5kIHNlcnZpY2UgcmVnaXN0cmF0aW9uLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyA9PT09PSBMT0FEIEVYSVNUSU5HIENBcyA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY2FkZHkvY2FzP2NhZGR5ZmlsZVBhdGg9JHtlbmNvZGVVUklDb21wb25lbnQoY2FkZHlmaWxlUGF0aCl9YCk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBDQXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhpc3RpbmctY2Etc2VsZWN0Jyk7XG4gICAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICBpZiAocmVzdWx0LmNhcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5ObyBDQXMgZm91bmQgaW4gQ2FkZHlmaWxlPC9vcHRpb24+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgZXhpc3RpbmcgQ0EuLi48L29wdGlvbj4nO1xuICAgICAgICAgIHJlc3VsdC5jYXMuZm9yRWFjaChjYSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2EgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IGNhLmlkO1xuICAgICAgICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBjYS5kaXNwbGF5TmFtZSB8fCBjYS5uYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gY2E7XG4gICAgICAgICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IGNhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhLmNhcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgQ0FzOicsIGVycm9yKTtcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKTtcbiAgICAgIHNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkVycm9yIGxvYWRpbmcgQ0FzPC9vcHRpb24+JztcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBHRU5FUkFURSBDQUREWSBDT05GSUcgPT09PT1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUNhZGR5Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHN1YmRvbWFpbixcbiAgICAgIHBvcnQsXG4gICAgICBpcCxcbiAgICAgIHNzbFR5cGUsXG4gICAgICBjYU5hbWUsXG4gICAgICBleGlzdGluZ0NhLFxuICAgICAgZW5hYmxlQXV0aCxcbiAgICAgIGVuYWJsZUNvcnMsXG4gICAgICBjdXN0b21IZWFkZXJzLFxuICAgICAgdXBzdHJlYW1QYXRoLFxuICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICB0aW1lb3V0LFxuICAgICAgdGFpbHNjYWxlT25seVxuICAgIH0gPSBjb25maWc7XG5cbiAgICBsZXQgY2FkZHlDb25maWcgPSBgJHtidWlsZERvbWFpbihzdWJkb21haW4pfSB7XFxuYDtcblxuICAgIC8vIFRhaWxzY2FsZS1vbmx5IGFjY2VzcyByZXN0cmljdGlvblxuICAgIGlmICh0YWlsc2NhbGVPbmx5KSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBAYmxvY2tlZCBub3QgcmVtb3RlX2lwIDEwMC42NC4wLjAvMTBcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgcmVzcG9uZCBAYmxvY2tlZCBcIkFjY2VzcyBkZW5pZWQuIFRhaWxzY2FsZSBjb25uZWN0aW9uIHJlcXVpcmVkLlwiIDQwM1xcbmA7XG4gICAgfVxuXG4gICAgLy8gU1NMIENvbmZpZ3VyYXRpb25cbiAgICBzd2l0Y2ggKHNzbFR5cGUpIHtcbiAgICAgIGNhc2UgJ2xldHNlbmNyeXB0JzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjYWRkeS1tYW5hZ2VkJzpcbiAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIGludGVybmFsXFxuYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleGlzdGluZy1jYSc6XG4gICAgICAgIGlmIChleGlzdGluZ0NhKSB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIHtcXG4gICAgY2EgJHtleGlzdGluZ0NhfVxcbiAgfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjdXN0b20tY2EnOlxuICAgICAgICBpZiAoY2FOYW1lKSB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgdGxzIHtcXG4gICAgY2EgJHtjYU5hbWV9XFxuICB9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBBdXRoZW50aWNhdGlvblxuICAgIGlmIChlbmFibGVBdXRoKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBiYXNpY2F1dGgge1xcbiAgICBhZG1pbiAkMmEkMTQkaGFzaGVkX3Bhc3N3b3JkX2hlcmVcXG4gIH1cXG5gO1xuICAgIH1cblxuICAgIC8vIENPUlMgSGVhZGVyc1xuICAgIGlmIChlbmFibGVDb3JzKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICBoZWFkZXIge1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiBcIipcIlxcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIEFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMgXCJHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBPUFRJT05TXCJcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgICBBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIFwiQ29udGVudC1UeXBlLCBBdXRob3JpemF0aW9uXCJcXG5gO1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgfVxcbmA7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9tIEhlYWRlcnNcbiAgICBpZiAoY3VzdG9tSGVhZGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IEpTT04ucGFyc2UoY3VzdG9tSGVhZGVycyk7XG4gICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIGhlYWRlciB7XFxuYDtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY2FkZHlDb25maWcgKz0gYCAgICAke2tleX0gXCIke3ZhbHVlfVwiXFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhZGR5Q29uZmlnICs9IGAgIH1cXG5gO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgSlNPTiBpbiBjdXN0b20gaGVhZGVycycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhlYWx0aCBDaGVja1xuICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgY2FkZHlDb25maWcgKz0gYCAgaGVhbHRoX3VyaSAke2hlYWx0aENoZWNrfVxcbmA7XG4gICAgfVxuXG4gICAgLy8gUmV2ZXJzZSBQcm94eVxuICAgIGNhZGR5Q29uZmlnICs9IGAgIHJldmVyc2VfcHJveHkgJHtpcH06JHtwb3J0fSB7XFxuYDtcbiAgICBpZiAodXBzdHJlYW1QYXRoICYmIHVwc3RyZWFtUGF0aCAhPT0gJy8nKSB7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIHJld3JpdGUgJHt1cHN0cmVhbVBhdGh9XFxuYDtcbiAgICB9XG4gICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCAhPT0gMzApIHtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgdHJhbnNwb3J0IGh0dHAge1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgICAgZGlhbF90aW1lb3V0ICR7dGltZW91dH1zXFxuYDtcbiAgICAgIGNhZGR5Q29uZmlnICs9IGAgICAgICByZXNwb25zZV9oZWFkZXJfdGltZW91dCAke3RpbWVvdXR9c1xcbmA7XG4gICAgICBjYWRkeUNvbmZpZyArPSBgICAgIH1cXG5gO1xuICAgIH1cbiAgICBjYWRkeUNvbmZpZyArPSBgICB9XFxuYDtcblxuICAgIGNhZGR5Q29uZmlnICs9IGB9XFxuYDtcblxuICAgIHJldHVybiBjYWRkeUNvbmZpZztcbiAgfVxuXG4gIC8vID09PT09IENSRUFURSBETlMgUkVDT1JEID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRG5zUmVjb3JkKHN1YmRvbWFpbiwgaXAsIHR0bCA9IERDLkRFRkFVTFRTLlRUTCkge1xuICAgIGNvbnN0IGRuc1Rva2VuID0gd2luZG93LmdldFRva2VuKGdldFByaW1hcnlEbnNJZCgpLCAnYWRtaW4nKTtcblxuICAgIGlmICghZG5zVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRE5TIGFkbWluIHRva2VuIG5vdCBjb25maWd1cmVkLiBQbGVhc2Ugc2V0IGl0IGluIHRoZSBUb2tlbnMgbWVudS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb21haW4gPSBidWlsZERvbWFpbihzdWJkb21haW4pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kbnMvcmVjb3JkJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICAgIGlwOiBpcCxcbiAgICAgICAgdHRsOiB0dGwsXG4gICAgICAgIHRva2VuOiBkbnNUb2tlbixcbiAgICAgICAgc2VydmVyOiBTSVRFLmRuc0lwXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBETlMgQVBJIEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBETlMgRXJyb3I6ICR7cmVzdWx0LmVycm9yIHx8ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT0gQUREIFNFUlZJQ0UgVE8gQ09ORklHID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gYWRkU2VydmljZVRvQ29uZmlnKHNlcnZpY2VDb25maWcpIHtcbiAgICBjb25zdCBuZXdTZXJ2aWNlID0ge1xuICAgICAgaWQ6IHNlcnZpY2VDb25maWcuc3ViZG9tYWluLFxuICAgICAgbmFtZTogc2VydmljZUNvbmZpZy5uYW1lLFxuICAgICAgbG9nbzogc2VydmljZUNvbmZpZy5sb2dvIHx8IGAvYXNzZXRzLyR7c2VydmljZUNvbmZpZy5zdWJkb21haW59LnBuZ2BcbiAgICB9O1xuICAgIC8vIEZvcndhcmQgb3B0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGlmIHByb3ZpZGVkXG4gICAgaWYgKHNlcnZpY2VDb25maWcuY2F0ZWdvcnkpIG5ld1NlcnZpY2UuY2F0ZWdvcnkgPSBzZXJ2aWNlQ29uZmlnLmNhdGVnb3J5O1xuICAgIGlmIChzZXJ2aWNlQ29uZmlnLmNvbnRhaW5lcklkKSBuZXdTZXJ2aWNlLmNvbnRhaW5lcklkID0gc2VydmljZUNvbmZpZy5jb250YWluZXJJZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG5ld1NlcnZpY2UpXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmVycm9yIHx8ICdGYWlsZWQgdG8gc2F2ZSBzZXJ2aWNlJyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdpbmRvdy5sb2FkU2VydmljZXMoKTtcbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcblxuICAgICAgcmV0dXJuIG5ld1NlcnZpY2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhZGQgc2VydmljZSB0byBjb25maWc6JywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQUREIFRPIENBRERZRklMRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZFRvQ2FkZHlmaWxlKGNvbmZpZykge1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0JykudmFsdWUudHJpbSgpIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUudHJpbSgpIHx8ICc4MCc7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NpdGUnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkb21haW46IGJ1aWxkRG9tYWluKHN1YmRvbWFpbiksXG4gICAgICAgIHVwc3RyZWFtOiBgJHtpcH06JHtwb3J0fWAsXG4gICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICB9KVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8IGBDYWRkeSBBUEkgRXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gPT09PT0gV0lORE9XIEVYUE9SVFMgPT09PT1cblxuICB3aW5kb3cubG9hZEV4aXN0aW5nQ0FzID0gbG9hZEV4aXN0aW5nQ0FzO1xuICB3aW5kb3cuZ2VuZXJhdGVDYWRkeUNvbmZpZyA9IGdlbmVyYXRlQ2FkZHlDb25maWc7XG4gIHdpbmRvdy5jcmVhdGVEbnNSZWNvcmQgPSBjcmVhdGVEbnNSZWNvcmQ7XG4gIHdpbmRvdy5hZGRTZXJ2aWNlVG9Db25maWcgPSBhZGRTZXJ2aWNlVG9Db25maWc7XG4gIHdpbmRvdy5hZGRUb0NhZGR5ZmlsZSA9IGFkZFRvQ2FkZHlmaWxlO1xuXG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIENSVUQgPT09PT09PT09PVxuLy8gRWRpdCwgZGVsZXRlLCBhbmQgdXBkYXRlIG9wZXJhdGlvbnMgZm9yIGV4aXN0aW5nIHNlcnZpY2VzLlxuKGZ1bmN0aW9uICgpIHtcblxuICAvLyA9PT09PSBTRVJWSUNFIEVESVQgTU9EQUwgPT09PT1cbiAgbGV0IGN1cnJlbnRFZGl0U2VydmljZSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gb3BlblNlcnZpY2VFZGl0TW9kYWwoc2VydmljZSkge1xuICAgIGN1cnJlbnRFZGl0U2VydmljZSA9IHNlcnZpY2U7XG4gICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LW1vZGFsJyk7XG5cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LXRpdGxlJykudGV4dENvbnRlbnQgPSBgRWRpdCAke3NlcnZpY2UubmFtZX1gO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtbmFtZScpLnZhbHVlID0gc2VydmljZS5uYW1lO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtdXJsLWRpc3BsYXknKS50ZXh0Q29udGVudCA9IHNlcnZpY2UudXJsIHx8IGJ1aWxkU2VydmljZVVybChzZXJ2aWNlLmlkKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWxvZ28tcHJldmlldycpLnNyYyA9IHNlcnZpY2UubG9nbyB8fCBgL2Fzc2V0cy8ke3NlcnZpY2UuaWR9LnBuZ2A7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc3ViZG9tYWluJykudmFsdWUgPSBzZXJ2aWNlLmlkO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXBvcnQnKS52YWx1ZSA9IHNlcnZpY2UucG9ydCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1pcCcpLnZhbHVlID0gc2VydmljZS5pcCB8fCAnbG9jYWxob3N0JztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10YWlsc2NhbGUtb25seScpLmNoZWNrZWQgPSBzZXJ2aWNlLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZSA9IHNlcnZpY2UubG9nbyB8fCAnJztcblxuICAgIC8vIFBvcHVsYXRlIHRoZSBjYXRlZ29yeSBzZWxlY3QgZm9yIHRoaXMgc2VydmljZSwgdGhlbiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgLy8gcG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKSB1c2VzIGRhdGEtY3VycmVudCBzbyB3ZSBzZXQgaXQgZmlyc3QsIHRoZW4gY2FsbC5cbiAgICBjb25zdCBjYXRlZ29yeVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtY2F0ZWdvcnknKTtcbiAgICBpZiAoY2F0ZWdvcnlTZWxlY3QpIHtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LmRhdGFzZXQuY3VycmVudCA9IHNlcnZpY2UuY2F0ZWdvcnkgfHwgJyc7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5wb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKSB7XG4gICAgY2xvc2VNb2RhbCgnc2VydmljZS1lZGl0LW1vZGFsJyk7XG4gICAgY3VycmVudEVkaXRTZXJ2aWNlID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVTZXJ2aWNlQ2hhbmdlcygpIHtcbiAgICBpZiAoIWN1cnJlbnRFZGl0U2VydmljZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3U3ViZG9tYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc3ViZG9tYWluJykudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmV3TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LXNlcnZpY2UtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBuZXdQb3J0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtcG9ydCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBuZXdJcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWlwJykudmFsdWUudHJpbSgpIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHRhaWxzY2FsZU9ubHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC10YWlsc2NhbGUtb25seScpLmNoZWNrZWQ7XG4gICAgY29uc3QgbmV3TG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0LWxvZ28tdXJsJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IG5ld0NhdGVnb3J5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtc2VydmljZS1jYXRlZ29yeScpPy52YWx1ZSB8fCAnJztcblxuICAgIGlmICghbmV3U3ViZG9tYWluKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdTdWJkb21haW4gaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFN1YmRvbWFpbiA9IGN1cnJlbnRFZGl0U2VydmljZS5pZDtcbiAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICBpZiAobmV3U3ViZG9tYWluICE9PSBvbGRTdWJkb21haW4pIGNoYW5nZXMucHVzaCgnc3ViZG9tYWluJyk7XG4gICAgaWYgKG5ld05hbWUgJiYgbmV3TmFtZSAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLm5hbWUpIGNoYW5nZXMucHVzaCgnbmFtZScpO1xuICAgIGlmIChuZXdQb3J0ICYmIG5ld1BvcnQgIT09IFN0cmluZyhjdXJyZW50RWRpdFNlcnZpY2UucG9ydCkpIGNoYW5nZXMucHVzaCgncG9ydCcpO1xuICAgIGlmIChuZXdJcCAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLmlwKSBjaGFuZ2VzLnB1c2goJ2lwJyk7XG4gICAgaWYgKHRhaWxzY2FsZU9ubHkgIT09IChjdXJyZW50RWRpdFNlcnZpY2UudGFpbHNjYWxlT25seSB8fCBmYWxzZSkpIGNoYW5nZXMucHVzaCgndGFpbHNjYWxlJyk7XG4gICAgaWYgKG5ld0xvZ28gJiYgbmV3TG9nbyAhPT0gY3VycmVudEVkaXRTZXJ2aWNlLmxvZ28pIGNoYW5nZXMucHVzaCgnbG9nbycpO1xuICAgIGlmIChuZXdDYXRlZ29yeSAhPT0gKGN1cnJlbnRFZGl0U2VydmljZS5jYXRlZ29yeSB8fCAnJykpIGNoYW5nZXMucHVzaCgnY2F0ZWdvcnknKTtcblxuICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWVkaXQtc2F2ZScpO1xuICAgIHNhdmVCdG4udGV4dENvbnRlbnQgPSAnU2F2aW5nLi4uJztcbiAgICBzYXZlQnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzL3VwZGF0ZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb2xkU3ViZG9tYWluLFxuICAgICAgICAgIG5ld1N1YmRvbWFpbixcbiAgICAgICAgICBuYW1lOiBuZXdOYW1lIHx8IGN1cnJlbnRFZGl0U2VydmljZS5uYW1lLFxuICAgICAgICAgIHBvcnQ6IG5ld1BvcnQgfHwgY3VycmVudEVkaXRTZXJ2aWNlLnBvcnQsXG4gICAgICAgICAgaXA6IG5ld0lwLFxuICAgICAgICAgIHRhaWxzY2FsZU9ubHksXG4gICAgICAgICAgbG9nbzogbmV3TG9nbyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgY2F0ZWdvcnk6IG5ld0NhdGVnb3J5XG4gICAgICAgIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gdXBkYXRlIHNlcnZpY2UnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGxvY2FsIEFQUFMgYXJyYXkgdG8gbWF0Y2hcbiAgICAgIGNvbnN0IGFwcEluZGV4ID0gd2luZG93LkFQUFMuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gb2xkU3ViZG9tYWluKTtcbiAgICAgIGlmIChhcHBJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgd2luZG93LkFQUFNbYXBwSW5kZXhdID0ge1xuICAgICAgICAgIC4uLndpbmRvdy5BUFBTW2FwcEluZGV4XSxcbiAgICAgICAgICBpZDogbmV3U3ViZG9tYWluLFxuICAgICAgICAgIG5hbWU6IG5ld05hbWUgfHwgd2luZG93LkFQUFNbYXBwSW5kZXhdLm5hbWUsXG4gICAgICAgICAgcG9ydDogbmV3UG9ydCB8fCB3aW5kb3cuQVBQU1thcHBJbmRleF0ucG9ydCxcbiAgICAgICAgICBpcDogbmV3SXAsXG4gICAgICAgICAgdGFpbHNjYWxlT25seSxcbiAgICAgICAgICBsb2dvOiBuZXdMb2dvIHx8IHdpbmRvdy5BUFBTW2FwcEluZGV4XS5sb2dvLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdDYXRlZ29yeSB8fCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2xvc2VTZXJ2aWNlRWRpdE1vZGFsKCk7XG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNhdmluZyBzZXJ2aWNlIGNoYW5nZXM6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3Igc2F2aW5nIGNoYW5nZXM6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2F2ZUJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIENoYW5nZXMnO1xuICAgICAgc2F2ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvZ28gZmlsZSB1cGxvYWQgaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLWZpbGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGUpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG5cbiAgICBpZiAoIWZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIHNlbGVjdCBhbiBpbWFnZSBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFVcmwgPSBldmVudC50YXJnZXQucmVzdWx0O1xuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1zZXJ2aWNlLWxvZ28tcHJldmlldycpLnNyYyA9IGRhdGFVcmw7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdC1sb2dvLXVybCcpLnZhbHVlID0gZGF0YVVybDtcblxuICAgICAgaWYgKGN1cnJlbnRFZGl0U2VydmljZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXNzZXRzL3VwbG9hZCcsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGZpbGVuYW1lOiBgJHtjdXJyZW50RWRpdFNlcnZpY2UuaWR9LnBuZ2AsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFVcmxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQucGF0aCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXQtbG9nby11cmwnKS52YWx1ZSA9IHJlc3VsdC5wYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGF0YSBVUkxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gIH0pO1xuXG4gIC8vIFNlcnZpY2UgZWRpdCBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZWRpdC1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVNlcnZpY2VFZGl0TW9kYWwpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlU2VydmljZUNoYW5nZXMpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1lZGl0LW1vZGFsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQuaWQgPT09ICdzZXJ2aWNlLWVkaXQtbW9kYWwnKSBjbG9zZVNlcnZpY2VFZGl0TW9kYWwoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT0gREVMRVRFIFNFUlZJQ0UgTU9EQUwgPT09PT1cblxuICBmdW5jdGlvbiBzaG93RGVsZXRlTW9kYWwoc2VydmljZU5hbWUsIGhhc0NvbnRhaW5lciwgY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1zZXJ2aWNlLW1vZGFsJyk7XG4gICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtdGl0bGUnKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLW1lc3NhZ2UnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWNvbnRhaW5lci1pbmZvJyk7XG4gICAgICBjb25zdCBjb250YWluZXJOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1jb250YWluZXItbmFtZScpO1xuICAgICAgY29uc3QgaGVscCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtaGVscCcpO1xuICAgICAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZS1tb2RhbC1jYW5jZWwnKTtcbiAgICAgIGNvbnN0IHJlbW92ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGUtbW9kYWwtcmVtb3ZlJyk7XG4gICAgICBjb25zdCBkZWxldGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlLW1vZGFsLWRlbGV0ZScpO1xuXG4gICAgICB0aXRsZS50ZXh0Q29udGVudCA9IGBEZWxldGUgXCIke3NlcnZpY2VOYW1lfVwiYDtcblxuICAgICAgaWYgKGhhc0NvbnRhaW5lcikge1xuICAgICAgICBtZXNzYWdlLmlubmVySFRNTCA9ICdUaGlzIHNlcnZpY2UgaGFzIGFuIGFzc29jaWF0ZWQgRG9ja2VyIGNvbnRhaW5lci48YnI+Q2hvb3NlIGhvdyB0byBwcm9jZWVkOic7XG4gICAgICAgIGNvbnRhaW5lckluZm8uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGNvbnRhaW5lck5hbWUudGV4dENvbnRlbnQgPSBgQ29udGFpbmVyIElEOiAke2NvbnRhaW5lcklkPy5zbGljZSgwLCAxMikgfHwgJ1Vua25vd24nfWA7XG4gICAgICAgIGhlbHAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRlbGV0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UudGV4dENvbnRlbnQgPSAnUmVtb3ZlIHRoaXMgc2VydmljZSBmcm9tIHRoZSBkYXNoYm9hcmQ/JztcbiAgICAgICAgY29udGFpbmVySW5mby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRlbGV0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIGNhbmNlbEJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNhbmNlbCk7XG4gICAgICAgIHJlbW92ZUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlbW92ZSk7XG4gICAgICAgIGRlbGV0ZUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZURlbGV0ZSk7XG4gICAgICAgIG1vZGFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQmFja2Ryb3ApO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4geyBjbGVhbnVwKCk7IHJlc29sdmUobnVsbCk7IH07XG4gICAgICBjb25zdCBoYW5kbGVSZW1vdmUgPSAoKSA9PiB7IGNsZWFudXAoKTsgcmVzb2x2ZShmYWxzZSk7IH07XG4gICAgICBjb25zdCBoYW5kbGVEZWxldGUgPSAoKSA9PiB7IGNsZWFudXAoKTsgcmVzb2x2ZSh0cnVlKTsgfTtcbiAgICAgIGNvbnN0IGhhbmRsZUJhY2tkcm9wID0gKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgeyBjbGVhbnVwKCk7IHJlc29sdmUobnVsbCk7IH0gfTtcblxuICAgICAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2FuY2VsKTtcbiAgICAgIHJlbW92ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZVJlbW92ZSk7XG4gICAgICBkZWxldGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVEZWxldGUpO1xuICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVCYWNrZHJvcCk7XG5cbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09IFVQREFURSBDT05UQUlORVIgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVDb250YWluZXIoY29udGFpbmVySWQsIHNlcnZpY2VOYW1lLCBzZXJ2aWNlSWQpIHtcbiAgICBjb25zdCB1cGRhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdXBkYXRlLWJ0bi0ke3NlcnZpY2VJZH1gKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSB1cGRhdGVCdG4/LnRleHRDb250ZW50O1xuXG4gICAgaWYgKCFjb25maXJtKGBVcGRhdGUgJHtzZXJ2aWNlTmFtZX0gdG8gdGhlIGxhdGVzdCB2ZXJzaW9uP1xcblxcblRoaXMgd2lsbDpcXG4xLiBQdWxsIHRoZSBsYXRlc3QgaW1hZ2VcXG4yLiBTdG9wIHRoZSBjb250YWluZXJcXG4zLiBSZWNyZWF0ZSB3aXRoIHNhbWUgc2V0dGluZ3NcXG5cXG5UaGUgc2VydmljZSB3aWxsIGJlIGJyaWVmbHkgdW5hdmFpbGFibGUuYCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezFGNTA0fSc7XG4gICAgICAgIHVwZGF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHVwZGF0ZUJ0bi50aXRsZSA9ICdVcGRhdGluZy4uLic7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2NvbnRhaW5lcklkfS91cGRhdGVgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IHdpbmRvdy5BUFBTLmZpbmQoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICAgICAgaWYgKHNlcnZpY2UgJiYgcmVzdWx0Lm5ld0NvbnRhaW5lcklkKSB7XG4gICAgICAgICAgc2VydmljZS5jb250YWluZXJJZCA9IHJlc3VsdC5uZXdDb250YWluZXJJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVCdG4pIHtcbiAgICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezI3MDV9JztcbiAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSAnVXBkYXRlZCBzdWNjZXNzZnVsbHkhJztcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHVwZGF0ZUJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgICAgIHVwZGF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICAgIH0sIDMwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB3aW5kb3cucmVmcmVzaEFsbCgpLCAyMDAwKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtzZXJ2aWNlTmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVXBkYXRlIGVycm9yOicsIGVycm9yKTtcblxuICAgICAgaWYgKHVwZGF0ZUJ0bikge1xuICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSAnXFx1ezI3NEN9JztcbiAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBmYWlsZWQnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB1cGRhdGVCdG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICAgICAgdXBkYXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgdXBkYXRlQnRuLnRpdGxlID0gJ1VwZGF0ZSBjb250YWluZXIgdG8gbGF0ZXN0IHZlcnNpb24nO1xuICAgICAgICB9LCAzMDAwKTtcbiAgICAgIH1cblxuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHVwZGF0ZSAke3NlcnZpY2VOYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IERFTEVURSBTRVJWSUNFID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlU2VydmljZShzZXJ2aWNlSWQsIHNlcnZpY2VOYW1lKSB7XG4gICAgY29uc3Qgc2VydmljZSA9IHdpbmRvdy5BUFBTLmZpbmQoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICBjb25zdCBkb21haW4gPSBzZXJ2aWNlID8gYnVpbGREb21haW4oc2VydmljZS5pZCkgOiBudWxsO1xuICAgIGNvbnN0IGhhc0NvbnRhaW5lciA9IHNlcnZpY2U/LmNvbnRhaW5lcklkO1xuXG4gICAgY29uc3QgZGVsZXRlQ29udGFpbmVyID0gYXdhaXQgc2hvd0RlbGV0ZU1vZGFsKHNlcnZpY2VOYW1lIHx8IHNlcnZpY2VJZCwgaGFzQ29udGFpbmVyLCBzZXJ2aWNlPy5jb250YWluZXJJZCk7XG5cbiAgICBpZiAoZGVsZXRlQ29udGFpbmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm47IC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdHMgPSB7XG4gICAgICBkYXNoYm9hcmQ6IGZhbHNlLFxuICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgZG5zOiBudWxsLFxuICAgICAgY2FkZHk6IG51bGwsXG4gICAgICBzZXJ2aWNlOiBudWxsXG4gICAgfTtcblxuICAgIC8vIEZ1bGwgcmVtb3ZhbCB3aXRoIGNvbnRhaW5lclxuICAgIGlmIChkZWxldGVDb250YWluZXIgJiYgaGFzQ29udGFpbmVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICBjb250YWluZXJJZDogc2VydmljZS5jb250YWluZXJJZCxcbiAgICAgICAgICBzdWJkb21haW46IHNlcnZpY2UuaWQsXG4gICAgICAgICAgaXA6IHNlcnZpY2UuaXAgfHwgJ2xvY2FsaG9zdCcsXG4gICAgICAgICAgZGVsZXRlQ29udGFpbmVyOiAndHJ1ZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hcHBzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2UuaWQpfT8ke3BhcmFtcy50b1N0cmluZygpfWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHsgLi4ucmVzdWx0cywgLi4ucmVzdWx0LnJlc3VsdHMsIGRhc2hib2FyZDogZmFsc2UgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBcHAgcmVtb3ZhbCBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXBwIHJlbW92YWwgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVsZXRlQ29udGFpbmVyICYmIGRvbWFpbikge1xuICAgICAgLy8gRmFsbGJhY2sgZm9yIG1hbnVhbGx5IGFkZGVkIHNlcnZpY2VzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlSVAgPSBzZXJ2aWNlPy5pcCB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgZG5zUmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9kbnMvcmVjb3JkP2RvbWFpbj0ke2VuY29kZVVSSUNvbXBvbmVudChkb21haW4pfSZ0eXBlPUEmaXBBZGRyZXNzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VJUCl9JnNlcnZlcj0ke1NJVEUuZG5zSXB9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ0RFTEVURSdcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRuc1Jlc3VsdCA9IGF3YWl0IGRuc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmVzdWx0cy5kbnMgPSBkbnNSZXN1bHQuc3VjY2VzcyA/ICdkZWxldGVkJyA6IChkbnNSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXN1bHRzLmRucyA9IGUubWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FkZHlSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NpdGUvJHtlbmNvZGVVUklDb21wb25lbnQoZG9tYWluKX1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnREVMRVRFJ1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2FkZHlSZXN1bHQgPSBhd2FpdCBjYWRkeVJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmVzdWx0cy5jYWRkeSA9IChjYWRkeVJlc3VsdC5zdWNjZXNzIHx8IChjYWRkeVJlc3VsdC5lcnJvciAmJiBjYWRkeVJlc3VsdC5lcnJvci5pbmNsdWRlcygnbm90IGZvdW5kJykpKSA/ICdyZW1vdmVkJyA6IChjYWRkeVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3VsdHMuY2FkZHkgPSBlLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gQVBQUyBhcnJheVxuICAgIGNvbnN0IGluZGV4ID0gd2luZG93LkFQUFMuZmluZEluZGV4KGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2VJZCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHdpbmRvdy5BUFBTLnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXN1bHRzLmRhc2hib2FyZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTignY3VzdG9tLWFwcHMnLCBbXSk7XG4gICAgICBjb25zdCBsb2NhbEluZGV4ID0gY3VzdG9tQXBwcy5maW5kSW5kZXgoYXBwID0+IGFwcC5pZCA9PT0gc2VydmljZUlkKTtcbiAgICAgIGlmIChsb2NhbEluZGV4ID4gLTEpIHtcbiAgICAgICAgY3VzdG9tQXBwcy5zcGxpY2UobG9jYWxJbmRleCwgMSk7XG4gICAgICAgIHNhZmVTZXQoJ2N1c3RvbS1hcHBzJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElnbm9yZSBsb2NhbFN0b3JhZ2UgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gc2VydmljZXMuanNvbiB2aWEgQVBJXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcnZpY2VSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3NlcnZpY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VJZCl9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlcnZpY2VSZXN1bHQgPSBhd2FpdCBzZXJ2aWNlUmVzcG9uc2UuanNvbigpO1xuICAgICAgcmVzdWx0cy5zZXJ2aWNlID0gc2VydmljZVJlc3VsdC5zdWNjZXNzID8gJ3JlbW92ZWQnIDogKHNlcnZpY2VSZXN1bHQuZXJyb3IgfHwgJ2ZhaWxlZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdHMuc2VydmljZSA9IGUubWVzc2FnZTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgd2luZG93LnJlZnJlc2hBbGwoKTtcblxuICAgIC8vIE9ubHkgc2hvdyBhbGVydCBpZiB0aGVyZSBhcmUgYWN0dWFsIGVycm9yc1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBsZXQgZXJyb3JNZXNzYWdlcyA9IFtdO1xuXG4gICAgaWYgKCFyZXN1bHRzLmRhc2hib2FyZCkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaCgnXFx1ezI3MTd9IEZhaWxlZCB0byByZW1vdmUgZnJvbSBkYXNoYm9hcmQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWNjZXNzU3RhdGVzID0gWydyZW1vdmVkJywgJ2FscmVhZHkgcmVtb3ZlZCcsICdub3QgZm91bmQnLCAnZGVsZXRlZCcsICdrZXB0ICh1c2VyIGNob2ljZSknLCAnc2tpcHBlZCcsICdubyBzdWNoIHJlY29yZCcsICdkb2VzIG5vdCBleGlzdCddO1xuICAgIGNvbnN0IGlzU3VjY2VzcyA9ICh2YWwpID0+ICF2YWwgfHwgc3VjY2Vzc1N0YXRlcy5zb21lKHMgPT4gdmFsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocy50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAocmVzdWx0cy5jb250YWluZXIgJiYgIWlzU3VjY2VzcyhyZXN1bHRzLmNvbnRhaW5lcikpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBDb250YWluZXI6ICR7cmVzdWx0cy5jb250YWluZXJ9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmRucyAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuZG5zKSkge1xuICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXFx1ezI2QTB9IEROUyBSZWNvcmQ6ICR7cmVzdWx0cy5kbnN9YCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmNhZGR5ICYmICFpc1N1Y2Nlc3MocmVzdWx0cy5jYWRkeSkpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBDYWRkeSBDb25maWc6ICR7cmVzdWx0cy5jYWRkeX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdHMuc2VydmljZSAmJiAhaXNTdWNjZXNzKHJlc3VsdHMuc2VydmljZSkpIHtcbiAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFxcdXsyNkEwfSBTZXJ2aWNlIEZpbGU6ICR7cmVzdWx0cy5zZXJ2aWNlfWApO1xuICAgIH1cblxuICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yIGRlbGV0aW5nIFwiJHtzZXJ2aWNlTmFtZSB8fCBzZXJ2aWNlSWR9XCI6ICR7ZXJyb3JNZXNzYWdlcy5qb2luKCcsICcpfWAsICdlcnJvcicsIDYwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IFdJTkRPVyBFWFBPUlRTID09PT09XG5cbiAgd2luZG93Lm9wZW5TZXJ2aWNlRWRpdE1vZGFsID0gb3BlblNlcnZpY2VFZGl0TW9kYWw7XG4gIHdpbmRvdy5zaG93RGVsZXRlTW9kYWwgPSBzaG93RGVsZXRlTW9kYWw7XG4gIHdpbmRvdy51cGRhdGVDb250YWluZXIgPSB1cGRhdGVDb250YWluZXI7XG4gIHdpbmRvdy5kZWxldGVTZXJ2aWNlID0gZGVsZXRlU2VydmljZTtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gU0VSVklDRSBDUkVBVElPTiA9PT09PT09PT09XG4vLyBBZGQgc2VydmljZSBtb2RhbCwgbG9jYWwvZXh0ZXJuYWwgc2VydmljZSBjcmVhdGlvbiBmbG93cywgYW5kIGV2ZW50IHdpcmluZy5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gPT09PT0gU1VCRE9NQUlOIEFVVE8tREVSSVZFID09PT09XG5cbiAgZnVuY3Rpb24gZGVyaXZlU3ViZG9tYWluKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICcnKS5yZXBsYWNlKC8tKy9nLCAnLScpLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNtYXJ0U3NsRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gU0lURS5kZWZhdWx0cz8uc3NsVHlwZSB8fCAoU0lURS5jb25maWd1cmF0aW9uVHlwZSA9PT0gJ3B1YmxpYycgPyAnbGV0c2VuY3J5cHQnIDogJ2NhZGR5LW1hbmFnZWQnKTtcbiAgfVxuXG4gIC8vID09PT09IFNFUlZJQ0UgUFJFVklFVyA9PT09PVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCkge1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcpLnZhbHVlIHx8ICdzdWJkb21haW4nO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZSB8fCBRVUlDS19JUFMubGFuIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0JykudmFsdWU7XG4gICAgY29uc3QgY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhLW5hbWUtaW5wdXQnKS52YWx1ZSB8fCAnc2FtaS1jYSc7XG4gICAgY29uc3QgZXhpc3RpbmdDYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1zZWxlY3QnKS52YWx1ZTtcbiAgICBjb25zdCBlbmFibGVBdXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1hdXRoJykuY2hlY2tlZDtcbiAgICBjb25zdCBlbmFibGVDb3JzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1jb3JzJykuY2hlY2tlZDtcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2N1c3RvbS1oZWFkZXJzLWlucHV0JykudmFsdWU7XG4gICAgY29uc3QgdXBzdHJlYW1QYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKS52YWx1ZSB8fCAnLyc7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWlucHV0JykudmFsdWU7XG4gICAgY29uc3QgdGltZW91dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1lb3V0LWlucHV0JykudmFsdWUgfHwgMzA7XG5cbiAgICBjb25zdCBkbnNQcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1wcmV2aWV3Jyk7XG4gICAgaWYgKGRuc1ByZXZpZXcpIGRuc1ByZXZpZXcudGV4dENvbnRlbnQgPSBgJHtidWlsZERvbWFpbihzdWJkb21haW4pfSBcXHUyMTkyICR7aXB9YDtcblxuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsLXByZXZpZXcnKTtcbiAgICBpZiAodXJsUHJldmlldykgdXJsUHJldmlldy50ZXh0Q29udGVudCA9IGJ1aWxkU2VydmljZVVybChzdWJkb21haW4pO1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgc3ViZG9tYWluLCBwb3J0LCBpcCwgc3NsVHlwZSwgY2FOYW1lLCBleGlzdGluZ0NhLFxuICAgICAgZW5hYmxlQXV0aCwgZW5hYmxlQ29ycywgY3VzdG9tSGVhZGVycywgdXBzdHJlYW1QYXRoLCBoZWFsdGhDaGVjaywgdGltZW91dFxuICAgIH07XG5cbiAgICBjb25zdCBjYWRkeUNvbmZpZyA9IHdpbmRvdy5nZW5lcmF0ZUNhZGR5Q29uZmlnKGNvbmZpZyk7XG4gICAgY29uc3QgY29uZmlnUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWRkeS1jb25maWctcHJldmlldycpO1xuICAgIGlmIChjb25maWdQcmV2aWV3KSBjb25maWdQcmV2aWV3LnZhbHVlID0gY2FkZHlDb25maWc7XG4gIH1cblxuICAvLyA9PT09PSBRVUlDSyBJUCBDT05GSUdVUkFUSU9OID09PT09XG5cbiAgY29uc3QgUVVJQ0tfSVBTID0ge1xuICAgIGxvY2FsaG9zdDogJzEyNy4wLjAuMScsXG4gICAgbGFuOiAnJyxcbiAgICB0YWlsc2NhbGU6ICcnXG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0TmV0d29ya0lQcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9uZXR3b3JrL2lwcycsIHtcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDIwMDApXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5sYW4pIFFVSUNLX0lQUy5sYW4gPSBkYXRhLmxhbjtcbiAgICAgICAgaWYgKGRhdGEudGFpbHNjYWxlKSBRVUlDS19JUFMudGFpbHNjYWxlID0gZGF0YS50YWlsc2NhbGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQVBJIG5vdCBhdmFpbGFibGVcbiAgICB9XG5cbiAgICBjb25zdCBsYW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2staXAtbGFuJyk7XG4gICAgY29uc3QgdHNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2staXAtdGFpbHNjYWxlJyk7XG4gICAgaWYgKGxhbkJ0bikge1xuICAgICAgaWYgKFFVSUNLX0lQUy5sYW4pIHtcbiAgICAgICAgbGFuQnRuLmRhdGFzZXQuaXAgPSBRVUlDS19JUFMubGFuO1xuICAgICAgICBsYW5CdG4udGV4dENvbnRlbnQgPSBgTEFOICgke1FVSUNLX0lQUy5sYW59KWA7XG4gICAgICAgIGxhbkJ0bi50aXRsZSA9IGBMQU4gSVA6ICR7UVVJQ0tfSVBTLmxhbn1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFuQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0c0J0bikge1xuICAgICAgaWYgKFFVSUNLX0lQUy50YWlsc2NhbGUpIHtcbiAgICAgICAgdHNCdG4uZGF0YXNldC5pcCA9IFFVSUNLX0lQUy50YWlsc2NhbGU7XG4gICAgICAgIHRzQnRuLnRleHRDb250ZW50ID0gYFRhaWxzY2FsZSAoJHtRVUlDS19JUFMudGFpbHNjYWxlfSlgO1xuICAgICAgICB0c0J0bi50aXRsZSA9IGBUYWlsc2NhbGUgSVA6ICR7UVVJQ0tfSVBTLnRhaWxzY2FsZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHNCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWlwLWlucHV0Jyk7XG4gICAgaWYgKGlwSW5wdXQgJiYgIWlwSW5wdXQudmFsdWUgJiYgUVVJQ0tfSVBTLmxhbikgaXBJbnB1dC52YWx1ZSA9IFFVSUNLX0lQUy5sYW47XG4gIH1cblxuICBmdW5jdGlvbiBpbml0UXVpY2tJUEJ1dHRvbnMoKSB7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLWlwLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaXAgPSBidG4uZGF0YXNldC5pcDtcbiAgICAgICAgaWYgKGlwKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZSA9IGlwO1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1pcC1idG4nKS5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgIHVwZGF0ZVNlcnZpY2VQcmV2aWV3KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKT8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudElQID0gZS50YXJnZXQudmFsdWU7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2staXAtYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQuaXAgPT09IGN1cnJlbnRJUCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09IEFERCBTRVJWSUNFIE1PREFMID09PT09XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlbkFkZFNlcnZpY2VNb2RhbCgpIHtcbiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1tb2RhbCcpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLW1vZGFsLWNvbnRlbnQnKTtcbiAgICBpZiAobW9kYWxDb250ZW50KSBtb2RhbENvbnRlbnQuc2Nyb2xsVG9wID0gMDtcblxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblxuICAgIC8vIFNldCBzbWFydCBTU0wgZGVmYXVsdFxuICAgIGNvbnN0IHNzbFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKTtcbiAgICBpZiAoc3NsU2VsZWN0KSBzc2xTZWxlY3QudmFsdWUgPSBnZXRTbWFydFNzbERlZmF1bHQoKTtcblxuICAgIGF3YWl0IGRldGVjdE5ldHdvcmtJUHMoKTtcblxuICAgIGNvbnN0IGNhZGR5ZmlsZVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FkZHlmaWxlLXBhdGgtaW5wdXQnKS52YWx1ZSB8fCBEQy5ERUZBVUxUUy5DQUREWUZJTEU7XG4gICAgYXdhaXQgd2luZG93LmxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKTtcblxuICAgIC8vIENoZWNrIFRhaWxzY2FsZSBzdGF0dXNcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFudWFsLXRhaWxzY2FsZS1zdGF0dXMnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW51YWwtdGFpbHNjYWxlLW9ubHknKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90YWlsc2NhbGUvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmluc3RhbGxlZCAmJiBkYXRhLmNvbm5lY3RlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICM0Y2FmNTA7XCI+XFx1MjcxMyBDb25uZWN0ZWQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPiR7ZGF0YS5zZWxmPy5ob3N0bmFtZX0gKCR7ZGF0YS5zZWxmPy5pcH0pPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+XFx1MjZBMCBOb3QgY29ubmVjdGVkPC9zcGFuPmA7XG4gICAgICAgIHRhaWxzY2FsZUNoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vdCBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRhaWxzY2FsZVN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBjaGVjazwvc3Bhbj5gO1xuICAgICAgdGFpbHNjYWxlQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0YWlsc2NhbGVDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG5cbiAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICB9XG5cbiAgLy8gPT09PT0gU0VSVklDRSBUWVBFIFNXSVRDSElORyAoVEFCIFNUWUxFKSA9PT09PVxuXG4gIGZ1bmN0aW9uIHNldHVwU2VydmljZVR5cGVTd2l0Y2hpbmcoKSB7XG4gICAgY29uc3QgbG9jYWxSYWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLXR5cGUtbG9jYWwnKTtcbiAgICBjb25zdCBleHRlcm5hbFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtdHlwZS1leHRlcm5hbCcpO1xuICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBjb25zdCB0YWJMb2NhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItbG9jYWwnKTtcbiAgICBjb25zdCB0YWJFeHRlcm5hbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWItZXh0ZXJuYWwnKTtcblxuICAgIGZ1bmN0aW9uIHN3aXRjaFNlcnZpY2VUeXBlKCkge1xuICAgICAgaWYgKGxvY2FsUmFkaW8uY2hlY2tlZCkge1xuICAgICAgICBsb2NhbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnO1xuICAgICAgICBleHRlcm5hbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBpZiAodGFiTG9jYWwpIHsgdGFiTG9jYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1hY2NlbnQpJzsgdGFiTG9jYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYmcpJzsgfVxuICAgICAgICBpZiAodGFiRXh0ZXJuYWwpIHsgdGFiRXh0ZXJuYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IHRhYkV4dGVybmFsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGV4dGVybmFsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBpZiAodGFiRXh0ZXJuYWwpIHsgdGFiRXh0ZXJuYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1hY2NlbnQpJzsgdGFiRXh0ZXJuYWwuc3R5bGUuY29sb3IgPSAndmFyKC0tYmcpJzsgfVxuICAgICAgICBpZiAodGFiTG9jYWwpIHsgdGFiTG9jYWwuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7IHRhYkxvY2FsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7IH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2NhbFJhZGlvPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBzd2l0Y2hTZXJ2aWNlVHlwZSk7XG4gICAgZXh0ZXJuYWxSYWRpbz8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgc3dpdGNoU2VydmljZVR5cGUpO1xuICB9XG5cbiAgLy8gPT09PT0gQVVUTy1ERVJJVkUgU1VCRE9NQUlOIEZST00gTkFNRSA9PT09PVxuXG4gIGZ1bmN0aW9uIHNldHVwQXV0b1N1YmRvbWFpbigpIHtcbiAgICAvLyBMb2NhbCBzZXJ2aWNlOiBuYW1lIFx1MjE5MiBzdWJkb21haW4gKyBwcmV2aWV3XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbmFtZS1pbnB1dCcpO1xuICAgIGNvbnN0IHN1YmRvbWFpbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0Jyk7XG4gICAgY29uc3Qgc3ViZG9tYWluUHJldmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJkb21haW4tcHJldmlldycpO1xuICAgIGxldCB1c2VyRWRpdGVkU3ViZG9tYWluID0gZmFsc2U7XG5cbiAgICBuYW1lSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZVN1YmRvbWFpbihuYW1lSW5wdXQudmFsdWUpO1xuICAgICAgaWYgKCF1c2VyRWRpdGVkU3ViZG9tYWluICYmIHN1YmRvbWFpbklucHV0KSB7XG4gICAgICAgIHN1YmRvbWFpbklucHV0LnZhbHVlID0gZGVyaXZlZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJkb21haW5QcmV2aWV3KSB7XG4gICAgICAgIHN1YmRvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBkZXJpdmVkID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihkZXJpdmVkKX1gIDogJyc7XG4gICAgICB9XG4gICAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICAgIH0pO1xuXG4gICAgc3ViZG9tYWluSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgdXNlckVkaXRlZFN1YmRvbWFpbiA9IHN1YmRvbWFpbklucHV0LnZhbHVlICE9PSBkZXJpdmVTdWJkb21haW4obmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBjb25zdCBzdWIgPSBzdWJkb21haW5JbnB1dC52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKG5hbWVJbnB1dD8udmFsdWUgfHwgJycpO1xuICAgICAgaWYgKHN1YmRvbWFpblByZXZpZXcpIHtcbiAgICAgICAgc3ViZG9tYWluUHJldmlldy50ZXh0Q29udGVudCA9IHN1YiA/IGBcXHUyMTkyICR7YnVpbGREb21haW4oc3ViKX1gIDogJyc7XG4gICAgICB9XG4gICAgICB1cGRhdGVTZXJ2aWNlUHJldmlldygpO1xuICAgIH0pO1xuXG4gICAgLy8gRXh0ZXJuYWwgc2VydmljZTogbmFtZSBcdTIxOTIgc3ViZG9tYWluICsgcHJldmlld1xuICAgIGNvbnN0IGV4dE5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLW5hbWUnKTtcbiAgICBjb25zdCBleHRTdWJkb21haW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IGV4dFN1YmRvbWFpblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBjb25zdCBleHREb21haW5QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLWRvbWFpbi1wcmV2aWV3Jyk7XG4gICAgbGV0IHVzZXJFZGl0ZWRFeHRTdWJkb21haW4gPSBmYWxzZTtcblxuICAgIGV4dE5hbWVJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZXJpdmVkID0gZGVyaXZlU3ViZG9tYWluKGV4dE5hbWVJbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoIXVzZXJFZGl0ZWRFeHRTdWJkb21haW4gJiYgZXh0U3ViZG9tYWluSW5wdXQpIHtcbiAgICAgICAgZXh0U3ViZG9tYWluSW5wdXQudmFsdWUgPSBkZXJpdmVkO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ViID0gZXh0U3ViZG9tYWluSW5wdXQ/LnZhbHVlIHx8IGRlcml2ZWQ7XG4gICAgICBpZiAoZXh0U3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBleHRTdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihzdWIpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChleHREb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dERvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBidWlsZERvbWFpbihzdWIpIDogJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBleHRTdWJkb21haW5JbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICB1c2VyRWRpdGVkRXh0U3ViZG9tYWluID0gZXh0U3ViZG9tYWluSW5wdXQudmFsdWUgIT09IGRlcml2ZVN1YmRvbWFpbihleHROYW1lSW5wdXQ/LnZhbHVlIHx8ICcnKTtcbiAgICAgIGNvbnN0IHN1YiA9IGV4dFN1YmRvbWFpbklucHV0LnZhbHVlLnRyaW0oKSB8fCBkZXJpdmVTdWJkb21haW4oZXh0TmFtZUlucHV0Py52YWx1ZSB8fCAnJyk7XG4gICAgICBpZiAoZXh0U3ViZG9tYWluUHJldmlldykge1xuICAgICAgICBleHRTdWJkb21haW5QcmV2aWV3LnRleHRDb250ZW50ID0gc3ViID8gYFxcdTIxOTIgJHtidWlsZERvbWFpbihzdWIpfWAgOiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChleHREb21haW5QcmV2aWV3KSB7XG4gICAgICAgIGV4dERvbWFpblByZXZpZXcudGV4dENvbnRlbnQgPSBzdWIgPyBidWlsZERvbWFpbihzdWIpIDogJyc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PSBDUkVBVEUgRVhURVJOQUwgU0VSVklDRSA9PT09PVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUV4dGVybmFsU2VydmljZSgpIHtcbiAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBleHRlcm5hbFVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXVybCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzdWJkb21haW4gPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2Utc3ViZG9tYWluJykudmFsdWUudHJpbSgpIHx8IGRlcml2ZVN1YmRvbWFpbihuYW1lKSkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtbG9nbycpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtaWNvbicpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBjcmVhdGVEbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtY3JlYXRlLWRucycpLmNoZWNrZWQ7XG4gICAgY29uc3QgY3JlYXRlQ2FkZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtY3JlYXRlLWNhZGR5JykuY2hlY2tlZDtcbiAgICBjb25zdCBwcm94eUlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXByb3h5LWlwJykudmFsdWUudHJpbSgpIHx8IFNJVEUuZG5zSXAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgY29uc3QgcHJlc2VydmVIb3N0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXByZXNlcnZlLWhvc3QnKS5jaGVja2VkO1xuICAgIGNvbnN0IGZvbGxvd1JlZGlyZWN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1mb2xsb3ctcmVkaXJlY3RzJykuY2hlY2tlZDtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5Jyk/LnZhbHVlIHx8ICcnO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFleHRlcm5hbFVybCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGZpbGwgaW4gTmFtZSBhbmQgRXh0ZXJuYWwgVVJMJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ291bGQgbm90IGRlcml2ZSBzdWJkb21haW4gZnJvbSBuYW1lLiBQbGVhc2Ugc2V0IG9uZSBpbiBPcHRpb25zLicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFleHRlcm5hbFVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIWV4dGVybmFsVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0V4dGVybmFsIFVSTCBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLyBvciBodHRwczovLycsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZG9tYWluID0gYnVpbGREb21haW4oc3ViZG9tYWluKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRzID0geyBkbnM6IG51bGwsIGNhZGR5OiBudWxsLCBkYXNoYm9hcmQ6IGZhbHNlIH07XG5cbiAgICAgIGlmIChjcmVhdGVEbnMpIHtcbiAgICAgICAgY29uc3QgYWRtaW5Ub2tlbiA9IHdpbmRvdy5nZXRUb2tlbihnZXRQcmltYXJ5RG5zSWQoKSwgJ2FkbWluJyk7XG4gICAgICAgIGlmIChhZG1pblRva2VuKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRuc1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZG5zL3JlY29yZCcsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICAgICAgICAgICAgaXA6IHByb3h5SXAsXG4gICAgICAgICAgICAgICAgdHRsOiBEQy5ERUZBVUxUUy5UVEwsXG4gICAgICAgICAgICAgICAgc2VydmVyOiBTSVRFLmRuc0lwXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRuc1Jlc3VsdCA9IGF3YWl0IGRuc1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJlc3VsdHMuZG5zID0gZG5zUmVzdWx0LnN1Y2Nlc3MgPyAnY3JlYXRlZCcgOiAoZG5zUmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXN1bHRzLmRucyA9IGUubWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0cy5kbnMgPSAnbm8gYWRtaW4gdG9rZW4gKGNvbmZpZ3VyZSBpbiBcXHVEODNEXFx1REQxMSBUb2tlbnMpJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3JlYXRlQ2FkZHkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjYWRkeUNvbmZpZyA9IHtcbiAgICAgICAgICAgIHN1YmRvbWFpbjogc3ViZG9tYWluLFxuICAgICAgICAgICAgZXh0ZXJuYWxVcmw6IGV4dGVybmFsVXJsLFxuICAgICAgICAgICAgcHJlc2VydmVIb3N0OiBwcmVzZXJ2ZUhvc3QsXG4gICAgICAgICAgICBmb2xsb3dSZWRpcmVjdHM6IGZvbGxvd1JlZGlyZWN0cyxcbiAgICAgICAgICAgIHNzbFR5cGU6ICdjYWRkeS1tYW5hZ2VkJyxcbiAgICAgICAgICAgIGNhZGR5ZmlsZVBhdGg6IERDLkRFRkFVTFRTLkNBRERZRklMRSxcbiAgICAgICAgICAgIHJlbG9hZENhZGR5OiB0cnVlXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNhZGR5UmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zaXRlL2V4dGVybmFsJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNhZGR5Q29uZmlnKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgY2FkZHlSZXN1bHQgPSBhd2FpdCBjYWRkeVJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gY2FkZHlSZXN1bHQuc3VjY2VzcyA/ICdjcmVhdGVkJyA6IChjYWRkeVJlc3VsdC5lcnJvciB8fCAnZmFpbGVkJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXN1bHRzLmNhZGR5ID0gZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1NlcnZpY2UgPSB7XG4gICAgICAgIGlkOiBzdWJkb21haW4sXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHVybDogYGh0dHBzOi8vJHtkb21haW59YCxcbiAgICAgICAgZXh0ZXJuYWxVcmw6IGV4dGVybmFsVXJsLFxuICAgICAgICBsb2dvOiBsb2dvIHx8IGljb24gfHwgJ1xcdUQ4M0NcXHVERjEwJyxcbiAgICAgICAgaXNFeHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgaXNDdXN0b206IHRydWVcbiAgICAgIH07XG4gICAgICAvLyBPbmx5IGF0dGFjaCBjYXRlZ29yeSBpZiB1c2VyIGFjdHVhbGx5IHBpY2tlZCBvbmVcbiAgICAgIGlmIChjYXRlZ29yeSkgbmV3U2VydmljZS5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuXG4gICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld1NlcnZpY2UpO1xuICAgICAgcmVzdWx0cy5kYXNoYm9hcmQgPSB0cnVlO1xuXG4gICAgICBjb25zdCBkZWZhdWx0U2VydmljZXMgPSBbJ3BsZXgnLCAncm91dGVyJywgJ2NoYXQnLCAnc3luYycsICd0b3JyZW50JywgJ3JhZGFycicsICdzb25hcnInLCAncHJvd2xhcnInLCAncG9ydGFpbmVyJywgJ3JlcXVlc3RzJywgJ2plbGx5ZmluJywgJ2VtYnknXTtcbiAgICAgIGNvbnN0IGN1c3RvbVNlcnZpY2VzID0gd2luZG93LkFQUFMuZmlsdGVyKGFwcCA9PiAhZGVmYXVsdFNlcnZpY2VzLmluY2x1ZGVzKGFwcC5pZCkpO1xuICAgICAgc2FmZVNldCgnY3VzdG9tLXNlcnZpY2VzJywgSlNPTi5zdHJpbmdpZnkoY3VzdG9tU2VydmljZXMpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2VydmljZXMnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkod2luZG93LkFQUFMpXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIHRvIHNlcnZpY2VzLmpzb246JywgZSk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICAgIHdpbmRvdy5yZWZyZXNoQWxsKCk7XG5cbiAgICAgIGNsb3NlQWRkU2VydmljZU1vZGFsKCk7XG5cbiAgICAgIGNvbnN0IHBhcnRzID0gW2BFeHRlcm5hbCBzZXJ2aWNlIFwiJHtuYW1lfVwiIGFkZGVkIWBdO1xuICAgICAgaWYgKGNyZWF0ZURucykgcGFydHMucHVzaChgRE5TOiAke3Jlc3VsdHMuZG5zID09PSAnY3JlYXRlZCcgPyAnXFx1MjcxMycgOiAnXFx1MjZBMCAnICsgcmVzdWx0cy5kbnN9YCk7XG4gICAgICBpZiAoY3JlYXRlQ2FkZHkpIHBhcnRzLnB1c2goYENhZGR5OiAke3Jlc3VsdHMuY2FkZHkgPT09ICdjcmVhdGVkJyA/ICdcXHUyNzEzJyA6ICdcXHUyNkEwICcgKyByZXN1bHRzLmNhZGR5fWApO1xuICAgICAgcGFydHMucHVzaChgQWNjZXNzIGF0OiBodHRwczovLyR7ZG9tYWlufWApO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihwYXJ0cy5qb2luKCcgfCAnKSwgJ3N1Y2Nlc3MnLCA2MDAwKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGV4dGVybmFsIHNlcnZpY2U6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIGNyZWF0ZSBleHRlcm5hbCBzZXJ2aWNlOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gQ0xPU0UgQUREIFNFUlZJQ0UgTU9EQUwgPT09PT1cblxuICBmdW5jdGlvbiBjbG9zZUFkZFNlcnZpY2VNb2RhbCgpIHtcbiAgICBjbG9zZU1vZGFsKCdhZGQtc2VydmljZS1tb2RhbCcpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtbmFtZS1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2Utc3ViZG9tYWluLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1pcC1pbnB1dCcpLnZhbHVlID0gUVVJQ0tfSVBTLmxhbiB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1sb2dvLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXR0bC1pbnB1dCcpLnZhbHVlID0gREMuREVGQVVMVFMuVFRMO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzc2wtdHlwZS1zZWxlY3QnKS52YWx1ZSA9IGdldFNtYXJ0U3NsRGVmYXVsdCgpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYS1uYW1lLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW5hYmxlLWF1dGgnKS5jaGVja2VkID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1jb3JzJykuY2hlY2tlZCA9IGZhbHNlO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20taGVhZGVycy1pbnB1dCcpLnZhbHVlID0gJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKS52YWx1ZSA9ICcvJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWlucHV0JykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltZW91dC1pbnB1dCcpLnZhbHVlID0gJzMwJztcblxuICAgIC8vIENsZWFyIHN1YmRvbWFpbiBwcmV2aWV3c1xuICAgIGNvbnN0IHN1YlByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBpZiAoc3ViUHJldikgc3ViUHJldi50ZXh0Q29udGVudCA9ICcnO1xuICAgIGNvbnN0IGV4dFN1YlByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc3ViZG9tYWluLXByZXZpZXcnKTtcbiAgICBpZiAoZXh0U3ViUHJldikgZXh0U3ViUHJldi50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgLy8gQ2xlYXIgZXh0ZXJuYWwgZmllbGRzXG4gICAgY29uc3QgZXh0TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLW5hbWUnKTtcbiAgICBpZiAoZXh0TmFtZSkgZXh0TmFtZS52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dFN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXN1YmRvbWFpbicpO1xuICAgIGlmIChleHRTdWIpIGV4dFN1Yi52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dFVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLXVybCcpO1xuICAgIGlmIChleHRVcmwpIGV4dFVybC52YWx1ZSA9ICcnO1xuICAgIGNvbnN0IGV4dExvZ28gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1sb2dvJyk7XG4gICAgaWYgKGV4dExvZ28pIGV4dExvZ28udmFsdWUgPSAnJztcbiAgICBjb25zdCBleHRJY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4dGVybmFsLXNlcnZpY2UtaWNvbicpO1xuICAgIGlmIChleHRJY29uKSBleHRJY29uLnZhbHVlID0gJyc7XG5cbiAgICAvLyBDb2xsYXBzZSBvcHRpb25zXG4gICAgY29uc3QgbG9jYWxPcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLWFkdmFuY2VkLW9wdGlvbnMnKTtcbiAgICBpZiAobG9jYWxPcHRzKSBsb2NhbE9wdHMucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG4gICAgY29uc3QgZXh0T3B0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1hZHZhbmNlZC1vcHRpb25zJyk7XG4gICAgaWYgKGV4dE9wdHMpIGV4dE9wdHMucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG5cbiAgICAvLyBSZXNldCB0byBsb2NhbCB0YWJcbiAgICBjb25zdCBsb2NhbFJhZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtdHlwZS1sb2NhbCcpO1xuICAgIGlmIChsb2NhbFJhZGlvKSBsb2NhbFJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNvbnN0IGxvY2FsQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvY2FsLXNlcnZpY2UtY29uZmlnJyk7XG4gICAgY29uc3QgZXh0ZXJuYWxDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXh0ZXJuYWwtc2VydmljZS1jb25maWcnKTtcbiAgICBpZiAobG9jYWxDb25maWcpIGxvY2FsQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnZ3JpZCc7XG4gICAgaWYgKGV4dGVybmFsQ29uZmlnKSBleHRlcm5hbENvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGNvbnN0IHRhYkxvY2FsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1sb2NhbCcpO1xuICAgIGNvbnN0IHRhYkV4dGVybmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYi1leHRlcm5hbCcpO1xuICAgIGlmICh0YWJMb2NhbCkgeyB0YWJMb2NhbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLWFjY2VudCknOyB0YWJMb2NhbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1iZyknOyB9XG4gICAgaWYgKHRhYkV4dGVybmFsKSB7IHRhYkV4dGVybmFsLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnOyB0YWJFeHRlcm5hbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknOyB9XG4gIH1cblxuICAvLyA9PT09PSBDUkVBVEUgTkVXIFNFUlZJQ0UgPT09PT1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOZXdTZXJ2aWNlKCkge1xuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1uYW1lLWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHN1YmRvbWFpbiA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1zdWJkb21haW4taW5wdXQnKS52YWx1ZS50cmltKCkgfHwgZGVyaXZlU3ViZG9tYWluKG5hbWUpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1wb3J0LWlucHV0JykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IGlwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtaXAtaW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgbG9nbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWxvZ28taW5wdXQnKS52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgY3JlYXRlRG5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NyZWF0ZS1kbnMtcmVjb3JkJykuY2hlY2tlZDtcbiAgICBjb25zdCB0dGwgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLXR0bC1pbnB1dCcpLnZhbHVlKSB8fCBEQy5ERUZBVUxUUy5UVEw7XG4gICAgY29uc3QgdGFpbHNjYWxlT25seSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW51YWwtdGFpbHNjYWxlLW9ubHknKT8uY2hlY2tlZCB8fCBmYWxzZTtcblxuICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0Jyk/LnZhbHVlIHx8ICdjYWRkeS1tYW5hZ2VkJztcbiAgICBjb25zdCBjYU5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2EtbmFtZS1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBleGlzdGluZ0NhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4aXN0aW5nLWNhLXNlbGVjdCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBlbmFibGVBdXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VuYWJsZS1hdXRoJyk/LmNoZWNrZWQgfHwgZmFsc2U7XG4gICAgY29uc3QgZW5hYmxlQ29ycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbmFibGUtY29ycycpPy5jaGVja2VkIHx8IGZhbHNlO1xuICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3VzdG9tLWhlYWRlcnMtaW5wdXQnKT8udmFsdWUgfHwgJyc7XG4gICAgY29uc3QgdXBzdHJlYW1QYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Vwc3RyZWFtLXBhdGgtaW5wdXQnKT8udmFsdWUgfHwgJy8nO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnB1dCcpPy52YWx1ZSB8fCAnJztcbiAgICBjb25zdCB0aW1lb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWVvdXQtaW5wdXQnKT8udmFsdWUgfHwgMzA7XG5cbiAgICAvLyBDYXRlZ29yeSBpcyBvcHRpb25hbCBcdTIwMTQgcHVsbGVkIGZyb20gZWl0aGVyIGxvY2FsIG9yIGV4dGVybmFsIHNlbGVjdCBieSB0aGVcbiAgICAvLyBvcGVuQWRkU2VydmljZU1vZGFsIHJlc2V0LiBJZiB1c2VyIGRvZXNuJ3QgY2hvb3NlIG9uZSwgaXQgc3RheXMgdW5kZWZpbmVkXG4gICAgLy8gYW5kIHdlIGRvbid0IHNlbmQgaXQgKHNvIHRoZSBiYWNrZW5kIGtlZXBzIHRoZSBleGlzdGluZyBiZWhhdmlvcikuXG4gICAgY29uc3QgY2F0ZWdvcnlFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWNhdGVnb3J5LWlucHV0JylcbiAgICAgIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHRlcm5hbC1zZXJ2aWNlLWNhdGVnb3J5Jyk7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBjYXRlZ29yeUVsPy52YWx1ZSB8fCAnJztcblxuICAgIGNvbnN0IGRuc1Rva2VuID0gd2luZG93LmdldFRva2VuKGdldFByaW1hcnlEbnNJZCgpLCAnYWRtaW4nKTtcblxuICAgIGlmICghbmFtZSB8fCAhcG9ydCB8fCAhaXApIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBmaWxsIGluIE5hbWUsIFBvcnQsIGFuZCBJUCBBZGRyZXNzJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ291bGQgbm90IGRlcml2ZSBzdWJkb21haW4gZnJvbSBuYW1lLiBQbGVhc2Ugc2V0IG9uZSBpbiBPcHRpb25zLicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZURucyAmJiAhZG5zVG9rZW4pIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ROUyBBZG1pbiB0b2tlbiByZXF1aXJlZC4gQ29uZmlndXJlIGl0IGluIHRoZSBUb2tlbnMgbWVudSBmaXJzdC4nLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSB7IGRuczogbnVsbCwgY2FkZHk6IG51bGwsIGRhc2hib2FyZDogZmFsc2UgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY3JlYXRlRG5zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2luZG93LmNyZWF0ZURuc1JlY29yZChzdWJkb21haW4sIGlwLCB0dGwpO1xuICAgICAgICAgIHJlc3VsdHMuZG5zID0gJ2NyZWF0ZWQnO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ROUyBjcmVhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgIHJlc3VsdHMuZG5zID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEROUyBjcmVhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0cy5kbnMgPSAnc2tpcHBlZCc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhZGR5Q29uZmlnID0gd2luZG93LmdlbmVyYXRlQ2FkZHlDb25maWcoe1xuICAgICAgICBzdWJkb21haW4sIHBvcnQsIGlwLCBzc2xUeXBlLCBjYU5hbWUsIGV4aXN0aW5nQ2EsXG4gICAgICAgIGVuYWJsZUF1dGgsIGVuYWJsZUNvcnMsIGN1c3RvbUhlYWRlcnMsIHVwc3RyZWFtUGF0aCwgaGVhbHRoQ2hlY2ssIHRpbWVvdXQsIHRhaWxzY2FsZU9ubHlcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYWRkeVJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc2l0ZScsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBkb21haW46IGJ1aWxkRG9tYWluKHN1YmRvbWFpbiksXG4gICAgICAgICAgICB1cHN0cmVhbTogYCR7aXB9OiR7cG9ydH1gLFxuICAgICAgICAgICAgY29uZmlnOiBjYWRkeUNvbmZpZ1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhZGR5UmVzdWx0ID0gYXdhaXQgY2FkZHlSZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjYWRkeVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9ICdhZGRlZCAmIHJlbG9hZGVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYWRkeSBjb25maWd1cmF0aW9uIGZhaWxlZDonLCBjYWRkeVJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgcmVzdWx0cy5jYWRkeSA9IGNhZGR5UmVzdWx0LmVycm9yIHx8ICdmYWlsZWQnO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FkZHkgY29uZmlndXJhdGlvbiBmYWlsZWQ6ICR7Y2FkZHlSZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NhZGR5IEFQSSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIHJlc3VsdHMuY2FkZHkgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhZGR5IEFQSSBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXJ2aWNlQ29uZmlnID0ge1xuICAgICAgICBuYW1lLCBzdWJkb21haW4sIHBvcnQsIGlwLFxuICAgICAgICBsb2dvOiBsb2dvIHx8IGAvYXNzZXRzLyR7c3ViZG9tYWlufS5wbmdgLFxuICAgICAgICB0YWlsc2NhbGVPbmx5OiB0YWlsc2NhbGVPbmx5IHx8IGZhbHNlXG4gICAgICB9O1xuICAgICAgLy8gT25seSBpbmNsdWRlIGNhdGVnb3J5IGlmIHVzZXIgYWN0dWFsbHkgcGlja2VkIG9uZVxuICAgICAgaWYgKGNhdGVnb3J5KSBzZXJ2aWNlQ29uZmlnLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG5cbiAgICAgIGF3YWl0IHdpbmRvdy5hZGRTZXJ2aWNlVG9Db25maWcoc2VydmljZUNvbmZpZyk7XG4gICAgICByZXN1bHRzLmRhc2hib2FyZCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHN0YXR1c1BhcnRzID0gW1xuICAgICAgICBgRE5TOiAke3Jlc3VsdHMuZG5zID09PSAnY3JlYXRlZCcgPyAnXFx1MjcxMycgOiByZXN1bHRzLmRucyA9PT0gJ3NraXBwZWQnID8gJ1xcdTI1Q0InIDogJ1xcdTI3MTcnfWAsXG4gICAgICAgIGBDYWRkeTogJHtyZXN1bHRzLmNhZGR5ID09PSAnYWRkZWQgJiByZWxvYWRlZCcgPyAnXFx1MjcxMycgOiAnXFx1MjcxNyd9YCxcbiAgICAgICAgYERhc2hib2FyZDogJHtyZXN1bHRzLmRhc2hib2FyZCA/ICdcXHUyNzEzJyA6ICdcXHUyNzE3J31gXG4gICAgICBdO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgU2VydmljZSBcIiR7bmFtZX1cIiBjcmVhdGVkISAke3N0YXR1c1BhcnRzLmpvaW4oJyB8ICcpfSBcXHUyMDE0ICR7YnVpbGRTZXJ2aWNlVXJsKHN1YmRvbWFpbil9JHt0YWlsc2NhbGVPbmx5ID8gJyAoVGFpbHNjYWxlKScgOiAnJ31gLCAnc3VjY2VzcycsIDYwMDApO1xuXG4gICAgICBjbG9zZUFkZFNlcnZpY2VNb2RhbCgpO1xuXG4gICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNyZWF0aW5nIHNlcnZpY2U6JywgZXJyb3IpO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3IgY3JlYXRpbmcgXCIke25hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCA2MDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PSBFVkVOVCBMSVNURU5FUlMgPT09PT1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXNlcnZpY2UnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuQWRkU2VydmljZU1vZGFsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlQWRkU2VydmljZU1vZGFsKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWNyZWF0ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzZXJ2aWNlLXR5cGVcIl06Y2hlY2tlZCcpPy52YWx1ZTtcbiAgICBpZiAoc2VydmljZVR5cGUgPT09ICdleHRlcm5hbCcpIHtcbiAgICAgIGNyZWF0ZUV4dGVybmFsU2VydmljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVOZXdTZXJ2aWNlKCk7XG4gICAgfVxuICB9KTtcblxuICBzZXR1cFNlcnZpY2VUeXBlU3dpdGNoaW5nKCk7XG4gIHNldHVwQXV0b1N1YmRvbWFpbigpO1xuICBpbml0UXVpY2tJUEJ1dHRvbnMoKTtcblxuICAvLyBTU0wgdHlwZSBjaGFuZ2UgaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3NsLXR5cGUtc2VsZWN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmdDYUNvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGlzdGluZy1jYS1jb25maWcnKTtcbiAgICBjb25zdCBjdXN0b21DYUNvbmZpZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjdXN0b20tY2EtY29uZmlnJyk7XG5cbiAgICBleGlzdGluZ0NhQ29uZmlnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VzdG9tQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIGlmIChlLnRhcmdldC52YWx1ZSA9PT0gJ2V4aXN0aW5nLWNhJykge1xuICAgICAgZXhpc3RpbmdDYUNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LnZhbHVlID09PSAnY3VzdG9tLWNhJykge1xuICAgICAgY3VzdG9tQ2FDb25maWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuXG4gICAgdXBkYXRlU2VydmljZVByZXZpZXcoKTtcbiAgfSk7XG5cbiAgLy8gUmVmcmVzaCBDQXMgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoLWNhcycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVmcmVzaC1jYXMnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1xcdTIzMUIgTG9hZGluZy4uLic7XG4gICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWRkeWZpbGVQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhZGR5ZmlsZS1wYXRoLWlucHV0JykudmFsdWUgfHwgREMuREVGQVVMVFMuQ0FERFlGSUxFO1xuICAgICAgYXdhaXQgd2luZG93LmxvYWRFeGlzdGluZ0NBcyhjYWRkeWZpbGVQYXRoKTtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcXHUyNzA1IFJlZnJlc2hlZCc7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDIEZhaWxlZCc7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCBDQXM6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfSwgMjAwMCk7XG4gIH0pO1xuXG4gIC8vIEROUyByZWNvcmQgY2hlY2tib3ggaGFuZGxlclxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3JlYXRlLWRucy1yZWNvcmQnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBkbnNDb25maWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG5zLWNvbmZpZycpO1xuICAgIGRuc0NvbmZpZy5zdHlsZS5kaXNwbGF5ID0gZS50YXJnZXQuY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH0pO1xuXG4gIC8vIFJlYWwtdGltZSBwcmV2aWV3IHVwZGF0ZXNcbiAgWydzZXJ2aWNlLXN1YmRvbWFpbi1pbnB1dCcsICdzZXJ2aWNlLWlwLWlucHV0JywgJ3NlcnZpY2UtcG9ydC1pbnB1dCcsICdjYS1uYW1lLWlucHV0JyxcbiAgICdleGlzdGluZy1jYS1zZWxlY3QnLCAnZW5hYmxlLWF1dGgnLCAnZW5hYmxlLWNvcnMnLCAnY3VzdG9tLWhlYWRlcnMtaW5wdXQnLCAndXBzdHJlYW0tcGF0aC1pbnB1dCcsXG4gICAnaGVhbHRoLWNoZWNrLWlucHV0JywgJ3RpbWVvdXQtaW5wdXQnXS5mb3JFYWNoKGlkID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdXBkYXRlU2VydmljZVByZXZpZXcpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVTZXJ2aWNlUHJldmlldyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBDVVNUT00gU0VSVklDRVMgRlJPTSBMT0NBTFNUT1JBR0UgPT09PT1cblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRDdXN0b21TZXJ2aWNlcygpO1xuXG4gIC8vID09PT09IFdJTkRPVyBFWFBPUlRTID09PT09XG5cbiAgd2luZG93Lm9wZW5BZGRTZXJ2aWNlTW9kYWwgPSBvcGVuQWRkU2VydmljZU1vZGFsO1xuICB3aW5kb3cuY2xvc2VBZGRTZXJ2aWNlTW9kYWwgPSBjbG9zZUFkZFNlcnZpY2VNb2RhbDtcblxufSkoKTtcbjtcbi8vID09PT09PT09PT0gTElWRSBEQVNIQk9BUkQgRVZFTlRTIChTU0UpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgbGV0IGVzID0gbnVsbDtcbiAgbGV0IHJlY29ubmVjdERlbGF5ID0gMTAwMDtcbiAgY29uc3QgTUFYX1JFQ09OTkVDVCA9IDMwMDAwO1xuXG4gIGZ1bmN0aW9uIGNvbm5lY3QoKSB7XG4gICAgaWYgKGVzKSB7IHRyeSB7IGVzLmNsb3NlKCk7IH0gY2F0Y2ggKF8pIHt9IH1cblxuICAgIGVzID0gbmV3IEV2ZW50U291cmNlKCcvYXBpL3YxL2V2ZW50cy9zdHJlYW0nKTtcblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nvbm5lY3RlZCcsICgpID0+IHtcbiAgICAgIHJlY29ubmVjdERlbGF5ID0gMTAwMDsgLy8gcmVzZXQgYmFja29mZlxuICAgICAgZGVidWcoJ1tTU0VdIENvbm5lY3RlZCB0byBldmVudCBzdHJlYW0nKTtcbiAgICB9KTtcblxuICAgIC8vIEhlYWx0aCBzdGF0dXMgY2hhbmdlcyBcdTIxOTIgdXBkYXRlIGNhcmQgZG90cy9iYWRnZXMgaW4gcmVhbCB0aW1lXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignc3RhdHVzLWNoYW5nZScsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAoZC5zZXJ2aWNlSWQgJiYgdHlwZW9mIHdpbmRvdy5zZXRCYWRnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IHVwID0gZC5zdGF0dXMgPT09ICd1cCcgfHwgZC5zdGF0dXMgPT09ICdoZWFsdGh5JztcbiAgICAgICAgICB3aW5kb3cuc2V0QmFkZ2UoZC5zZXJ2aWNlSWQsIHVwLCBkLnJlc3BvbnNlVGltZSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFJlc291cmNlIGFsZXJ0cyBcdTIxOTIgdG9hc3Qgbm90aWZpY2F0aW9uXG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcigncmVzb3VyY2UtYWxlcnQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgY29uc3QgbXNnID0gYCR7ZC5jb250YWluZXJOYW1lIHx8IGQuY29udGFpbmVySWR9OiAke2QubWV0cmljfSBhdCAke2QudmFsdWV9JSAodGhyZXNob2xkOiAke2QudGhyZXNob2xkfSUpYDtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihtc2csICd3YXJuaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBDb250YWluZXIgYXV0by1yZXN0YXJ0XG4gICAgZXMuYWRkRXZlbnRMaXN0ZW5lcignYXV0by1yZXN0YXJ0JywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYENvbnRhaW5lciBcIiR7ZC5jb250YWluZXJOYW1lfVwiIHdhcyBhdXRvLXJlc3RhcnRlZGAsICdpbmZvJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgYXZhaWxhYmxlIFx1MjE5MiBzaG93IG5vdGlmaWNhdGlvbiBkb3Qgb24gVXBkYXRlcyBidXR0b25cbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGUtYXZhaWxhYmxlJywgKGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgICAgICAgaWYgKHVwZGF0ZXNCdG4gJiYgIXVwZGF0ZXNCdG4ucXVlcnlTZWxlY3RvcignLnNzZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3NzZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTttYXJnaW4tbGVmdDo2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICAgICAgdXBkYXRlc0J0bi5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYFVwZGF0ZSBhdmFpbGFibGUgZm9yICR7ZC5jb250YWluZXJOYW1lIHx8IGQuY29udGFpbmVySWR9YCwgJ2luZm8nKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBzdGFydC9jb21wbGV0ZS9mYWlsZWRcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGUtY29tcGxldGUnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGNvbXBsZXRlZDogJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH1gLCAnc3VjY2VzcycpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgYSBkYXNoYm9hcmQgcmVmcmVzaFxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQWxsID09PSAnZnVuY3Rpb24nKSB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIGVzLmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZS1mYWlsZWQnLCAoZSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzaG93Tm90aWZpY2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGZhaWxlZDogJHtkLmNvbnRhaW5lck5hbWUgfHwgZC5jb250YWluZXJJZH0gXHUyMDE0ICR7ZC5lcnJvciB8fCAndW5rbm93biBlcnJvcid9YCwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfSk7XG5cbiAgICAvLyBJbmNpZGVudHNcbiAgICBlcy5hZGRFdmVudExpc3RlbmVyKCdpbmNpZGVudCcsIChlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoZC50eXBlID09PSAnY3JlYXRlZCcpIHtcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oYEluY2lkZW50OiAke2QubWVzc2FnZSB8fCBkLnNlcnZpY2VJZH1gLCAnZXJyb3InKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3Jlc29sdmVkJykge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVzb2x2ZWQ6ICR7ZC5zZXJ2aWNlSWQgfHwgJ2luY2lkZW50J31gLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9KTtcblxuICAgIC8vIFJlY29ubmVjdCBvbiBlcnJvclxuICAgIGVzLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICBlcy5jbG9zZSgpO1xuICAgICAgY29uc29sZS53YXJuKGBbU1NFXSBEaXNjb25uZWN0ZWQsIHJlY29ubmVjdGluZyBpbiAke3JlY29ubmVjdERlbGF5IC8gMTAwMH1zLi4uYCk7XG4gICAgICBzZXRUaW1lb3V0KGNvbm5lY3QsIHJlY29ubmVjdERlbGF5KTtcbiAgICAgIHJlY29ubmVjdERlbGF5ID0gTWF0aC5taW4ocmVjb25uZWN0RGVsYXkgKiAyLCBNQVhfUkVDT05ORUNUKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gU3RhcnQgb24gcGFnZSBsb2FkXG4gIGNvbm5lY3QoKTtcblxuICAvLyBFeHBvc2UgZm9yIGRlYnVnZ2luZ1xuICB3aW5kb3cuX3NzZVJlY29ubmVjdCA9IGNvbm5lY3Q7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRVJWSUNFIEZJTFRFUiA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLXNlYXJjaCcpO1xuICBjb25zdCBzdGF0dXNTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmljZS1maWx0ZXItc3RhdHVzJyk7XG4gIGNvbnN0IGNhdGVnb3J5U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWNhdGVnb3J5Jyk7XG4gIGNvbnN0IGNvdW50U3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlLWZpbHRlci1jb3VudCcpO1xuXG4gIC8vIEJ1aWxkIGEgc2luZ2xlIGNhdGVnb3J5IGxpc3QgZnJvbSBib3RoIHRoZSBBUEkgY2F0ZWdvcmllcyBhbmQgYW55XG4gIC8vIGNhdGVnb3JpZXMgcHJlc2VudCBvbiB0aGUgYWN0dWFsIHJlbmRlcmVkIGNhcmRzIChjb3ZlcnMgY3VzdG9tIHNlcnZpY2VzXG4gIC8vIHdob3NlIGNhdGVnb3J5IGlzbid0IGluIFRFTVBMQVRFX0NBVEVHT1JJRVMpLlxuICBmdW5jdGlvbiBnZXRDYXRlZ29yeUxpc3QoKSB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBmcm9tQ2FyZHMgPSBuZXcgU2V0KCk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkW2RhdGEtY2F0ZWdvcnldJykuZm9yRWFjaChjID0+IHtcbiAgICAgIGNvbnN0IGNhdCA9IGMuZGF0YXNldC5jYXRlZ29yeS50cmltKCk7XG4gICAgICBpZiAoY2F0KSBmcm9tQ2FyZHMuYWRkKGNhdCk7XG4gICAgfSk7XG4gICAgY29uc3QgYXBpQ2F0cyA9ICh3aW5kb3cuRENfQ0FURUdPUklFUyB8fCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5DQVRFR09SSUVTKSkgfHwge307XG4gICAgY29uc3QgYWxsID0gT2JqZWN0LmtleXMoYXBpQ2F0cykuY29uY2F0KFsuLi5mcm9tQ2FyZHNdLmZpbHRlcihjID0+ICFhcGlDYXRzW2NdKSk7XG4gICAgYWxsLmZvckVhY2goYyA9PiBzZWVuLmFkZChjKSk7XG4gICAgcmV0dXJuIHsgbGlzdDogWy4uLnNlZW5dLCBhcGlDYXRzIH07XG4gIH1cblxuICBmdW5jdGlvbiByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpIHtcbiAgICBpZiAoIWNhdGVnb3J5U2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgeyBsaXN0LCBhcGlDYXRzIH0gPSBnZXRDYXRlZ29yeUxpc3QoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gY2F0ZWdvcnlTZWxlY3QudmFsdWU7XG4gICAgY2F0ZWdvcnlTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgQ2F0ZWdvcmllczwvb3B0aW9uPic7XG4gICAgbGlzdC5zb3J0KCkuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGluZm8gPSBhcGlDYXRzW25hbWVdO1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBuYW1lO1xuICAgICAgb3B0LnRleHRDb250ZW50ID0gaW5mbyA/IGAke2luZm8uaWNvbiB8fCAnJ30gJHtuYW1lfWAudHJpbSgpIDogbmFtZTtcbiAgICAgIGNhdGVnb3J5U2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7XG4gICAgfSk7XG4gICAgLy8gUmVzdG9yZSBzZWxlY3Rpb24gaWYgaXQgc3RpbGwgZXhpc3RzXG4gICAgaWYgKGN1cnJlbnQgJiYgWy4uLmNhdGVnb3J5U2VsZWN0Lm9wdGlvbnNdLnNvbWUobyA9PiBvLnZhbHVlID09PSBjdXJyZW50KSkge1xuICAgICAgY2F0ZWdvcnlTZWxlY3QudmFsdWUgPSBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXRlZ29yeVNlbGVjdC52YWx1ZSA9ICdhbGwnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZpbHRlcigpIHtcbiAgICByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bigpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoSW5wdXQudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgc3RhdHVzRmlsdGVyID0gc3RhdHVzU2VsZWN0LnZhbHVlOyAvLyAnYWxsJywgJ29uJywgb3IgJ29mZidcbiAgICBjb25zdCBjYXRlZ29yeUZpbHRlciA9IGNhdGVnb3J5U2VsZWN0ID8gY2F0ZWdvcnlTZWxlY3QudmFsdWUgOiAnYWxsJztcblxuICAgIGNvbnN0IGNhcmRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2NhcmRzIC5jYXJkJyk7XG4gICAgbGV0IHZpc2libGVDb3VudCA9IDA7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAnb2ZmJzsgLy8gJ29uJyBvciAnb2ZmJ1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSBjYXJkLmRhdGFzZXQuY2F0ZWdvcnkgfHwgJyc7XG5cbiAgICAgIGNvbnN0IG1hdGNoZXNTZWFyY2ggPSAhcXVlcnkgfHwgbmFtZS5pbmNsdWRlcyhxdWVyeSkgfHwgYXBwLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgIGNvbnN0IG1hdGNoZXNTdGF0dXMgPSBzdGF0dXNGaWx0ZXIgPT09ICdhbGwnIHx8IHN0YXR1cyA9PT0gc3RhdHVzRmlsdGVyO1xuICAgICAgY29uc3QgbWF0Y2hlc0NhdGVnb3J5ID0gY2F0ZWdvcnlGaWx0ZXIgPT09ICdhbGwnIHx8IGNhdGVnb3J5ID09PSBjYXRlZ29yeUZpbHRlcjtcblxuICAgICAgaWYgKG1hdGNoZXNTZWFyY2ggJiYgbWF0Y2hlc1N0YXR1cyAmJiBtYXRjaGVzQ2F0ZWdvcnkpIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHZpc2libGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FyZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNvdW50U3Bhbikge1xuICAgICAgY29uc3QgdG90YWwgPSBjYXJkcy5sZW5ndGg7XG4gICAgICBjb3VudFNwYW4udGV4dENvbnRlbnQgPSBgJHt2aXNpYmxlQ291bnR9IG9mICR7dG90YWx9IHNlcnZpY2VzYDtcbiAgICB9XG4gIH1cblxuICAvLyBEZWJvdW5jZSBoZWxwZXJcbiAgZnVuY3Rpb24gZGVib3VuY2UoZm4sIGRlbGF5KSB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MpLCBkZWxheSk7XG4gICAgfTtcbiAgfVxuXG4gIHNlYXJjaElucHV0Py5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGRlYm91bmNlKHVwZGF0ZUZpbHRlciwgMjAwKSk7XG4gIHN0YXR1c1NlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlRmlsdGVyKTtcbiAgY2F0ZWdvcnlTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUZpbHRlcik7XG5cbiAgLy8gSW5pdGlhbCBjb3VudCBvbiBwYWdlIGxvYWRcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiBzZXRUaW1lb3V0KHVwZGF0ZUZpbHRlciwgNTAwKSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dCh1cGRhdGVGaWx0ZXIsIDUwMCk7XG4gIH1cblxuICAvLyBFeHBvc2UgZm9yIGV4dGVybmFsIHRyaWdnZXJzIChjYWxsZWQgYWZ0ZXIgYnVpbGRHcmlkIHRvIHJlcG9wdWxhdGUgY2F0ZWdvcmllcylcbiAgd2luZG93LnJlZnJlc2hTZXJ2aWNlRmlsdGVyID0gdXBkYXRlRmlsdGVyO1xuICB3aW5kb3cucmVmcmVzaENhdGVnb3J5RHJvcGRvd24gPSByZWZyZXNoQ2F0ZWdvcnlEcm9wZG93bjtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEJBVENIIENPTlRBSU5FUiBPUEVSQVRJT05TID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgYmF0Y2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtb3BlcmF0aW9ucy1idG4nKTtcbiAgY29uc3QgYmF0Y2hCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtYWN0aW9uLWJhcicpO1xuICBjb25zdCBiYXRjaENvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXNlbGVjdGVkLWNvdW50Jyk7XG4gIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0YXJ0LWJ0bicpO1xuICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLXN0b3AtYnRuJyk7XG4gIGNvbnN0IHJlc3RhcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmF0Y2gtcmVzdGFydC1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhdGNoLWNhbmNlbC1idG4nKTtcblxuICBsZXQgYmF0Y2hNb2RlID0gZmFsc2U7XG4gIGxldCBzZWxlY3RlZENvbnRhaW5lcnMgPSBuZXcgU2V0KCk7XG5cbiAgZnVuY3Rpb24gZW50ZXJCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gdHJ1ZTtcbiAgICBzZWxlY3RlZENvbnRhaW5lcnMuY2xlYXIoKTtcbiAgICBiYXRjaEJhci5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgYmF0Y2hCdG4udGV4dENvbnRlbnQgPSAnXHUyNzEzIEV4aXQgQmF0Y2ggTW9kZSc7XG4gICAgdXBkYXRlU2VsZWN0ZWRDb3VudCgpO1xuICAgIFxuICAgIC8vIEFkZCBjaGVja2JveGVzIHRvIGFsbCBjYXJkcyB3aXRoIGNvbnRhaW5lcklkXG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmRbZGF0YS1hcHBdJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcklkID0gY2FyZC5kYXRhc2V0LmNvbnRhaW5lcklkO1xuICAgICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2hlY2tib3ggaWYgYW55XG4gICAgICBjb25zdCBleGlzdGluZyA9IGNhcmQucXVlcnlTZWxlY3RvcignLmJhdGNoLWNoZWNrYm94Jyk7XG4gICAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnJlbW92ZSgpO1xuICAgICAgXG4gICAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdiYXRjaC1jaGVja2JveCc7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LmNvbnRhaW5lcklkID0gY29udGFpbmVySWQ7XG4gICAgICBjaGVja2JveC5kYXRhc2V0LnNlcnZpY2VOYW1lID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcubmFtZScpPy50ZXh0Q29udGVudCB8fCBjb250YWluZXJJZDtcbiAgICAgIGNoZWNrYm94LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246IGFic29sdXRlOyB0b3A6IDhweDsgbGVmdDogOHB4OyB6LWluZGV4OiAxMDsgd2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgY3Vyc29yOiBwb2ludGVyOyc7XG4gICAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5hZGQoY29udGFpbmVySWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVySWQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICAgIH0pO1xuICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICBjYXJkLmluc2VydEJlZm9yZShjaGVja2JveCwgY2FyZC5maXJzdENoaWxkKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4aXRCYXRjaE1vZGUoKSB7XG4gICAgYmF0Y2hNb2RlID0gZmFsc2U7XG4gICAgc2VsZWN0ZWRDb250YWluZXJzLmNsZWFyKCk7XG4gICAgYmF0Y2hCYXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBiYXRjaEJ0bi50ZXh0Q29udGVudCA9ICdcdTI2MzAgQmF0Y2ggT3BlcmF0aW9ucyc7XG4gICAgXG4gICAgLy8gUmVtb3ZlIGFsbCBjaGVja2JveGVzXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJhdGNoLWNoZWNrYm94JykuZm9yRWFjaChjYiA9PiBjYi5yZW1vdmUoKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTZWxlY3RlZENvdW50KCkge1xuICAgIGNvbnN0IGNvdW50ID0gc2VsZWN0ZWRDb250YWluZXJzLnNpemU7XG4gICAgYmF0Y2hDb3VudC50ZXh0Q29udGVudCA9IGAke2NvdW50fSBzZWxlY3RlZGA7XG4gICAgc3RhcnRCdG4uZGlzYWJsZWQgPSBjb3VudCA9PT0gMDtcbiAgICBzdG9wQnRuLmRpc2FibGVkID0gY291bnQgPT09IDA7XG4gICAgcmVzdGFydEJ0bi5kaXNhYmxlZCA9IGNvdW50ID09PSAwO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYmF0Y2hBY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKHNlbGVjdGVkQ29udGFpbmVycy5zaXplID09PSAwKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgY29udGFpbmVycyA9IEFycmF5LmZyb20oc2VsZWN0ZWRDb250YWluZXJzKTtcbiAgICBjb25zdCBhY3Rpb25MYWJlbCA9IHsgc3RhcnQ6ICdTdGFydGluZycsIHN0b3A6ICdTdG9wcGluZycsIHJlc3RhcnQ6ICdSZXN0YXJ0aW5nJyB9W2FjdGlvbl07XG4gICAgXG4gICAgaWYgKCFjb25maXJtKGAke2FjdGlvbkxhYmVsfSAke2NvbnRhaW5lcnMubGVuZ3RofSBjb250YWluZXIocyk/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGJ0bnMgPSBbc3RhcnRCdG4sIHN0b3BCdG4sIHJlc3RhcnRCdG5dO1xuICAgIGJ0bnMuZm9yRWFjaChiID0+IHsgYi5kaXNhYmxlZCA9IHRydWU7IGIudGV4dENvbnRlbnQgPSAnLi4uJzsgfSk7XG4gICAgXG4gICAgbGV0IHN1Y2Nlc3MgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgY29udGFpbmVySWQgb2YgY29udGFpbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJJZCl9LyR7YWN0aW9ufWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIHN1Y2Nlc3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTtcbiAgICAgICAgICBlcnJvcnMucHVzaChgJHtjb250YWluZXJJZH06ICR7ZGF0YS5lcnJvciB8fCByZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgZXJyb3JzLnB1c2goYCR7Y29udGFpbmVySWR9OiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmVzdG9yZSBidXR0b25zXG4gICAgYnRuc1swXS50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RhcnQgQWxsJztcbiAgICBidG5zWzFdLnRleHRDb250ZW50ID0gJ1x1MkIxQiBTdG9wIEFsbCc7XG4gICAgYnRuc1syXS50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMDQgUmVzdGFydCBBbGwnO1xuICAgIHVwZGF0ZVNlbGVjdGVkQ291bnQoKTtcbiAgICBcbiAgICAvLyBTaG93IHJlc3VsdHNcbiAgICBpZiAoZmFpbGVkID09PSAwKSB7XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHthY3Rpb25MYWJlbH0gY29tcGxldGVkOiAke3N1Y2Nlc3N9IGNvbnRhaW5lcihzKWAsICdzdWNjZXNzJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke2FjdGlvbkxhYmVsfTogJHtzdWNjZXNzfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWRgLCAnd2FybmluZycpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcignQmF0Y2ggb3BlcmF0aW9uIGVycm9yczonLCBlcnJvcnMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWZyZXNoIGRhc2hib2FyZCBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHJlZnJlc2hBbGwoKTtcbiAgICB9LCAxNTAwKTtcbiAgfVxuXG4gIGJhdGNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoYmF0Y2hNb2RlKSB7XG4gICAgICBleGl0QmF0Y2hNb2RlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyQmF0Y2hNb2RlKCk7XG4gICAgfVxuICB9KTtcblxuICBzdGFydEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBiYXRjaEFjdGlvbignc3RhcnQnKSk7XG4gIHN0b3BCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3N0b3AnKSk7XG4gIHJlc3RhcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gYmF0Y2hBY3Rpb24oJ3Jlc3RhcnQnKSk7XG4gIGNhbmNlbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBleGl0QmF0Y2hNb2RlKTtcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiQ0FLQyxTQUFTQSxFQUFRLENBQ2hCLGFBRUEsTUFBTUMsQ0FBYSxDQUNqQixhQUFjLENBQ1osS0FBSyxP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QUFXLFdBQVksVUFBVyxZQUFhLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxNQUFPLFVBQVcsYUFBYyxVQUFXLEtBQU0sVUFBVyxRQUFTLFVBQVcsUUFBUyxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsU0FBVSxVQUFXLFVBQVcsVUFBVyxPQUFRLFVBQVcsUUFBUyxVQUFXLE1BQU8sVUFBVyxRQUFTLFVBQVcsT0FBUSxVQUFXLGdCQUFpQixTQUFVLEVBQ2hkLFFBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsaUJBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsRUFDaGQsa0JBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFVBQVcsUUFBUyxFQUFLLEVBQy9kLEtBQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFVBQVcsUUFBUyxFQUFLLEVBQy9kLE1BQWtCLENBQUUsR0FBSSxVQUFXLEdBQUksVUFBVyxNQUFPLFVBQVcsV0FBWSxVQUFXLFlBQWEsVUFBVyxVQUFXLFVBQVcsT0FBUSxVQUFXLE1BQU8sVUFBVyxhQUFjLFVBQVcsS0FBTSxVQUFXLFFBQVMsVUFBVyxRQUFTLFVBQVcsU0FBVSxVQUFXLFNBQVUsVUFBVyxTQUFVLFVBQVcsVUFBVyxVQUFXLE9BQVEsVUFBVyxRQUFTLFVBQVcsTUFBTyxVQUFXLFFBQVMsVUFBVyxPQUFRLFVBQVcsZ0JBQWlCLFNBQVUsQ0FDbGQsRUFJQSxTQUFTQyxFQUFTQyxFQUFLLENBQ3JCLE1BQUksQ0FBQ0EsR0FBTyxPQUFPQSxHQUFRLFNBQWlCLENBQUUsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLENBQUUsR0FDL0RBLEVBQU1BLEVBQUksUUFBUSxJQUFLLEVBQUUsRUFDckJBLEVBQUksU0FBVyxJQUFHQSxFQUFNQSxFQUFJLENBQUMsRUFBRUEsRUFBSSxDQUFDLEVBQUVBLEVBQUksQ0FBQyxFQUFFQSxFQUFJLENBQUMsRUFBRUEsRUFBSSxDQUFDLEVBQUVBLEVBQUksQ0FBQyxHQUM3RCxDQUNMLEVBQUcsU0FBU0EsRUFBSSxPQUFPLEVBQUcsQ0FBQyxFQUFHLEVBQUUsR0FBSyxFQUNyQyxFQUFHLFNBQVNBLEVBQUksT0FBTyxFQUFHLENBQUMsRUFBRyxFQUFFLEdBQUssRUFDckMsRUFBRyxTQUFTQSxFQUFJLE9B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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBa0czQixFQUVQLFlBQVksdUJBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQTZCN0IsRUFFUCxZQUFZLG9CQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QVMsR0FHN0UsT0FBTyxrQkFBcUIsWUFDOUIsaUJBQWlCLEdBQUdGLENBQVcsS0FBS0UsQ0FBTyxlQUFlQyxDQUFNLFVBQVcsU0FBUyxFQUV0RixRQUFRLE1BQU0sMEJBQTJCQyxDQUFNLEdBSWpELFdBQVcsSUFBTSxDQUNYLE9BQU8sWUFBZSxZQUFZLFdBQVcsQ0FDbkQsRUFBRyxJQUFJLENBQ1QsQ0FFQW5CLEdBQVUsaUJBQWlCLFFBQVMsSUFBTSxDQUNwQ0ssRUFDRkssRUFBYyxFQUVkSCxFQUFlLENBRW5CLENBQUMsRUFFREosR0FBVSxpQkFBaUIsUUFBUyxJQUFNUyxFQUFZLE9BQU8sQ0FBQyxFQUM5RFIsR0FBUyxpQkFBaUIsUUFBUyxJQUFNUSxFQUFZLE1BQU0sQ0FBQyxFQUM1RHJQLEdBQVksaUJBQWlCLFFBQVMsSUFBTXFQLEVBQVksU0FBUyxDQUFDLEVBQ2xFakksR0FBVyxpQkFBaUIsUUFBUytILENBQWEsQ0FDcEQsR0FBRyIsCiAgIm5hbWVzIjogWyJ3aW5kb3ciLCAiRXJyb3JIYW5kbGVyIiwgImNvbnRleHQiLCAiZXJyb3IiLCAibWV0YWRhdGEiLCAiZXJyb3JFbnRyeSIsICJjdXJyZW50U3RlcCIsICJtZXNzYWdlIiwgInN0YXRzIiwgInR5cGUiLCAiZmFsbGJhY2tNZXNzYWdlIiwgIm1lbW9yeVN0b3JhZ2UiLCAia2V5IiwgInZhbHVlIiwgInIiLCAiYyIsICJrIiwgInYiLCAidG9rZW5zQnRuIiwgImVsIiwgInRsZFN1ZmZpeCIsICJwcm94eUlwSW5wdXQiLCAic3ViIiwgImRuc0lkIiwgInMiLCAiaWQiLCAiaW5mbyIsICJ0b3BSb3ciLCAiZG5zSWRzIiwgInN2Z0ljb24iLCAiZmlyc3RDaGlsZCIsICJzYWZlSWQiLCAibGFiZWwiLCAiY2FyZCIsICJyZXNwb25zZSIsICJ1cmwiLCAib3B0aW9ucyIsICJtZXRob2QiLCAibmVlZHNDc3JmIiwgInRva2VuIiwgImJvZHkiLCAiZnJlc2hUb2tlbiIsICJkYXRhIiwgInJlc3AiLCAicmVzdWx0IiwgIm1zZyIsICJidG4iLCAibG9hZGluZ1RleHQiLCAiYXN5bmNGbiIsICJvcHRzIiwgIm9yaWdpbmFsIiwgInN1Y2Nlc3NUZXh0IiwgInJlc2V0RGVsYXkiLCAiZSIsICJtb2RhbCIsICJjbG9zZUJ0bnMiLCAidGV4dCIsICJkdXJhdGlvbiIsICJleGlzdGluZ05vdGlmIiwgImNvbG9ycyIsICJ0cyIsICJkaWZmIiwgImZhbGxiYWNrIiwgImh0bWwiLCAiZXZlbnQiLCAiZm4iLCAiX2EiLCAiaCIsICJhcHBzIiwgImFwcCIsICJpZHgiLCAiYSIsICJjaGFuZ2VzIiwgImNyZWF0ZVNrZWxldG9uQ2FyZCIsICJzaG93U2tlbGV0b25zIiwgImNvdW50IiwgImdyaWQiLCAiaSIsICJzayIsICJoaWRlU2tlbGV0b25zIiwgInNrZWxldG9ucyIsICJUSEVNRV9LRVkiLCAiVVNFUl9USEVNRVNfS0VZIiwgIkxFR0FDWV9DVVNUT01fS0VZIiwgIkJVSUxUSU5fVEhFTUVTIiwgIlRIRU1FUyIsICJUSEVNRV9QUk9QUyIsICJCQVNFX1BST1BTIiwgIkRFUklWRURfUFJPUFMiLCAiVEhFTUVfQ09MT1JTIiwgImhleFRvUmdiIiwgImhleCIsICJyZ2JUb0hleCIsICJnIiwgImIiLCAieCIsICJibGVuZENvbG9ycyIsICJoZXgxIiwgImhleDIiLCAicmF0aW8iLCAiYzEiLCAiYzIiLCAiaGV4THVtaW5hbmNlIiwgImRlcml2ZUV4dGVuZGVkQ29sb3JzIiwgImJnIiwgImZnIiwgIm11dGVkIiwgImNhcmRCYXNlIiwgImRvdE9rIiwgImRvdEJhZCIsICJpc0xpZ2h0IiwgImRlcml2ZWQiLCAiZ2VuZXJhdGVCb2R5QmFja2dyb3VuZENTUyIsICJzbHVnIiwgImFjY2VudCIsICJhY2NlbnRSZ2IiLCAiZ2VuZXJhdGVCdXR0b25Ib3ZlckNTUyIsICJnZXRTeXN0ZW1UaGVtZSIsICJjbGVhckN1c3RvbVByb3BlcnRpZXMiLCAicHJvcCIsICJzbHVnaWZ5IiwgIm5hbWUiLCAiY3VycmVudFNsdWciLCAiY2FjaGVkIiwgImJhc2UiLCAiY291bnRlciIsICJpbmplY3RVc2VyVGhlbWVTdHlsZXMiLCAidGhlbWVzRGF0YSIsICJleGlzdGluZyIsICJ1c2VyVGhlbWVzIiwgInNsdWdzIiwgImNzcyIsICJ0aGVtZSIsICJjb2xvck1hcCIsICJwIiwgInN0eWxlIiwgInN5bmNUaGVtZXNGcm9tU2VydmVyIiwgInNlcnZlclRoZW1lcyIsICJjdXJyZW50IiwgImFwcGx5VGhlbWUiLCAibWlncmF0ZUxlZ2FjeUN1c3RvbVRoZW1lIiwgImxlZ2FjeSIsICJ0aGVtZURhdGEiLCAibW9kZSIsICJ0IiwgIm1ldGEiLCAic2F2ZWRUaGVtZSIsICJtZXRob2RzQ2FjaGUiLCAiZmV0Y2hNZXRob2RzIiwgInJlcyIsICJzaG93UHJvdmlkZXJTZWxlY3RvciIsICJwcm92aWRlcnMiLCAib3ZlcmxheSIsICJvcmlnaW5hbEJvZHkiLCAicHJvdmlkZXJCdXR0b25zIiwgInByb3ZpZGVyIiwgInJlbmRlclByb3ZpZGVyQ2hhbGxlbmdlIiwgInJlc3RvcmVPcmlnaW5hbEJvZHkiLCAiaW5wdXQiLCAic3VibWl0IiwgInN0YXR1cyIsICJiYWNrIiwgImVtYWlsIiwgInZpYSIsICJtYXNrZWQiLCAic2hvdyIsICJzaG93VG90cFdpdGhFbWFpbEZhbGxiYWNrIiwgInRvdHBQcm92aWRlciIsICJlbWFpbEVuYWJsZWQiLCAiZGl2IiwgImlzQWxsb3dlZFJldHVyblVybCIsICJyZXR1cm5VcmwiLCAicGFyc2VkIiwgInN1ZmZpeCIsICJ1cmxQYXJhbXMiLCAidXBkYXRlVG90cExvZ28iLCAibSIsICJsdW0iLCAiZGFyayIsICJsaWdodCIsICJzaG93VG90cE92ZXJsYXkiLCAiZmlyc3RJbnB1dCIsICJoaWRlVG90cE92ZXJsYXkiLCAiYnVpbGRTc29IYW5kb2ZmVGFyZ2V0IiwgInJlZGlyZWN0IiwgImlzUHJpdmF0ZUhvc3QiLCAicmV0dXJuUGF0aCIsICJjb250YWluZXIiLCAiaW5wdXRzIiwgInZhbCIsICJjb2RlIiwgInN1Ym1pdFRvdHBDb2RlIiwgInBhc3RlZCIsICJpbnAiLCAiZXJyb3JFbCIsICJ0YXJnZXQiLCAiaG9zdG5hbWUiLCAiaXNTYW1lT3JpZ2luIiwgImlzT3VyVGxkIiwgImZldGNoUmVjb3ZlcnlJbmZvIiwgInNob3dSZWNvdmVyeUxpbmsiLCAibGluayIsICJvcGVuUmVjb3ZlcnlQYW5lbCIsICJwYW5lbCIsICJzdGF0dXNFbCIsICJpbXBvcnRFbCIsICJ2ZXJpZnlFbCIsICJjbG9zZVJlY292ZXJ5UGFuZWwiLCAic3VibWl0UmVjb3ZlcnlTZWNyZXQiLCAic2VjcmV0IiwgInN1Ym1pdFJlY292ZXJ5Q29kZSIsICJlcnJvckhhbmRsZXIiLCAiY3VycmVudFNlcnZpY2UiLCAiYXJyU2VydmljZXMiLCAicXVhbGl0eVByb2ZpbGVTZXJ2aWNlcyIsICJnZXRTZXJ2aWNlVXJsIiwgInNlcnZpY2UiLCAic2hvd0Vycm9yIiwgImhpZGVFcnJvciIsICJ0aXRsZSIsICJkZXNjIiwgInNlZWRob3N0U2VjdGlvbiIsICJhcGlrZXlTZWN0aW9uIiwgImJhc2ljU2VjdGlvbiIsICJxdWFsaXR5U2VjdGlvbiIsICJpc0V4dCIsICJpc0FyciIsICJoYXNRdWFsaXR5IiwgInF1YWxTZWxlY3QiLCAibG9hZFNlcnZpY2VDcmVkcyIsICJkb3QiLCAiY2xlYXJCdG4iLCAiaGFzQ3JlZHMiLCAic3ZjSWQiLCAibG9hZFF1YWxpdHlQcm9maWxlcyIsICJxdWFsU3RhdHVzIiwgInN2Y1VybCIsICJwYXJhbXMiLCAib3B0IiwgIm1hdGNoNzIwIiwgImFwaUtleSIsICJzYXZlQnRuIiwgInVzZXIiLCAicGFzcyIsICJxdWFsaXR5UHJvZmlsZUlkIiwgInF1YWxpdHlQcm9maWxlTmFtZSIsICJzZWVkRGF0YSIsICJkIiwgImxvYWRUb3RwU2V0dGluZ3MiLCAiZW5hYmxlZCIsICJzZXNzaW9uRHVyYXRpb24iLCAiaXNTZXRVcCIsICJzdGF0dXNEb3QiLCAic3RhdHVzVGV4dCIsICJzdGF0dXNCYW5uZXIiLCAic2V0dXBTZWN0aW9uIiwgInFyU2VjdGlvbiIsICJkdXJhdGlvblNlY3Rpb24iLCAiZGlzYWJsZVNlY3Rpb24iLCAic2V0dXBCdG4iLCAidXBkYXRlQXV0aENhcmQiLCAiRFVSQVRJT05fTEFCRUxTIiwgImFjdGl2ZSIsICJwaWxsIiwgInBheWxvYWQiLCAiYmxvYiIsICJlcnIiLCAiQVBJIiwgIl9lbCIsICJ0YWciLCAiYXR0cnMiLCAiY2hpbGRyZW4iLCAibm9kZSIsICJfZmV0Y2hKU09OIiwgImNzcmYiLCAiX3JlbmRlckJhZGdlIiwgInJvbGUiLCAiX3JlbmRlclVzZXJzTGlzdCIsICJ1c2VycyIsICJvbkNoYW5nZSIsICJ0YWJsZSIsICJ0Ym9keSIsICJ1IiwgInJvdyIsICJlbWFpbENlbGwiLCAicm9sZUNlbGwiLCAiYWN0aW9uc0NlbGwiLCAicm9sZVNlbGVjdCIsICJldiIsICJkZWxCdG4iLCAiX3JlbmRlckludml0ZUZvcm0iLCAib25Jc3N1ZWQiLCAiZm9ybSIsICJmZCIsICJyb2xlU2VsIiwgIl9yZW5kZXJJbnZpdGVzTGlzdCIsICJpbnZpdGVzIiwgImludiIsICJfcmVuZGVySXNzdWVkSW52aXRlQmFubmVyIiwgImludml0ZSIsICJwYXJlbnQiLCAiYmFubmVyIiwgImNvcHlCdG4iLCAibW91bnQiLCAibWVEYXRhIiwgInJlZnJlc2hCdG4iLCAidXNlcnNIZWFkZXIiLCAidXNlcnNMaXN0IiwgInVzZXJzRGF0YSIsICJhZGRVc2VyRm9ybSIsICJpbnZpdGVGb3JtQ29udGFpbmVyIiwgImludml0ZXNMaXN0IiwgImludml0ZXNEYXRhIiwgImlzc3VlZCIsICJvcGVuIiwgImJhY2tkcm9wIiwgImNsb3NlIiwgImF0dGFjaFRyaWdnZXIiLCAiYmFyQ29udGFpbmVyIiwgIl9tYXliZVNob3ciLCAibWUiLCAiZ2V0RG5zSWRzIiwgImdldERuc0Rpc3BsYXlOYW1lIiwgImJ1aWxkQ3JlZGVudGlhbFNlY3Rpb25zIiwgImdldEVuY3J5cHRpb25LZXkiLCAib2xkS2V5IiwgImFycmF5IiwgIkVOQ1JZUFRJT05fS0VZIiwgImNyZWRlbnRpYWxFbmNyeXB0IiwgIml2IiwgIml2SGV4IiwgImtleUJ5dGVzIiwgImNoYXJDb2RlIiwgImNyZWRlbnRpYWxEZWNyeXB0IiwgImVuY3J5cHRlZFRleHQiLCAiZGVjb2RlZCIsICJnZXRDcmVkZW50aWFsIiwgInRva2VuVHlwZSIsICJjcmVkVHlwZSIsICJlbmNyeXB0ZWQiLCAic2V0Q3JlZGVudGlhbCIsICJnZXRUb2tlbiIsICJnZXRVc2VybmFtZSIsICJzZXRUb2tlbiIsICJzZXRVc2VybmFtZSIsICJ1c2VybmFtZSIsICJnZXRBbGxDcmVkZW50aWFscyIsICJjbGVhckFsbENyZWRlbnRpYWxzIiwgImdldFN0b3JlZENyZWRlbnRpYWxzIiwgInJlYWRvbmx5VG9rZW4iLCAicmVhZG9ubHlVc2VybmFtZSIsICJhZG1pblRva2VuIiwgImFkbWluVXNlcm5hbWUiLCAib2xkVG9rZW4iLCAib2xkVXNlcm5hbWUiLCAiY3JlZHMiLCAidGFyZ2V0SWQiLCAic2VydmVycyIsICJoYXNBbnlDcmVkcyIsICJlbnRyeSIsICJyb1VzZXIiLCAicm9QYXNzIiwgImFkbWluVXNlciIsICJhZG1pblBhc3MiLCAic2V0UXVpY2siLCAidXAiLCAicmVzcG9uc2VUaW1lIiwgInRpbWVFbCIsICJnZXRSZXNwb25zZVRpbWVDbGFzcyIsICJ0aW1lIiwgImlzVXAiLCAiY2hlY2tTZXJ2aWNlV2l0aFRpbWluZyIsICJzdGFydFRpbWUiLCAiZW5kVGltZSIsICJyZWZyZXNoSW5GbGlnaHQiLCAicmVmcmVzaFF1ZXVlZCIsICJsb2FkU2VydmljZXMiLCAic2VydmljZVVybCIsICJzdmMiLCAiZG5zIiwgImNscyIsICJ0eHQiLCAiYnVpbGRHcmlkIiwgInJvb3QiLCAid3JhcCIsICJpbWciLCAiYXBwSWQiLCAiY2RuVXJscyIsICJ1bmlxdWVVcmxzIiwgIm5leHRJbmRleCIsICJuYW1lU3BhbiIsICJ0c0JhZGdlIiwgImNhdEluZm8iLCAiY2F0QmFkZ2UiLCAidXBkYXRlQmFkZ2UiLCAicmVzcG9uc2VSb3ciLCAidGltZVNwYW4iLCAiaGVhbHRoUm93IiwgInVwdGltZUNoaXAiLCAidXB0aW1lTWluaUJhciIsICJ1cHRpbWVGaWxsIiwgImJ0blJvdyIsICJsb2dzQnRuIiwgInVwZGF0ZUJ0biIsICJleGVjQnRuIiwgImNyZWRzQnRuIiwgIm9wdEJ0biIsICJzaGFyZUJ0biIsICJzZXRCYWRnZSIsICJyZWZyZXNoQWxsIiwgInVwZGF0ZVN0YW1wIiwgImNoZWNrZWRBdCIsICJzdGFtcCIsICJhcHBseUJhdGNoUmVzdWx0cyIsICJzdGF0dXNlcyIsICJyZWZyZXNoRmFsbGJhY2siLCAidG9wQ2hlY2tzIiwgInRvcFJlc3VsdHMiLCAiaW50ZXJuZXRSZXN1bHQiLCAiYmF0Y2hFcnJvciIsICJmYWxsYmFja0Vycm9yIiwgIm9wZW5CdG4iLCAicmVzdGFydERuc1NlcnZpY2UiLCAicmVzdGFydEJ0biIsICJ1cGRhdGVEbnNTZXJ2ZXIiLCAic2VydmVySXAiLCAib3JpZ2luYWxUZXh0IiwgImNoZWNrUmVzdWx0IiwgInVwZGF0ZVJlc3VsdCIsICJkb3dubG9hZEluZm8iLCAiaW5zdHJ1Y3Rpb25zSW5mbyIsICJjdXJyZW50RG5zSWQiLCAib3BlbkRuc1NldHRpbmdzIiwgInNlcnZlciIsICJzYXZlRG5zU2V0dGluZ3MiLCAiaXAiLCAicG9ydCIsICJ1cGRhdGUiLCAiY2xvc2VEbnNTZXR0aW5ncyIsICJyZW1vdmVEbnNTZXJ2ZXIiLCAiY29uZmlnIiwgInNldHRpbmdzQnRuIiwgImN1cnJlbnREbnNTZXJ2aWNlIiwgImxvZ3NJbnRlcnZhbCIsICJsb2dzUGF1c2VkIiwgImN1cnJlbnRDb250YWluZXJJZCIsICJjdXJyZW50Q29udGFpbmVyTmFtZSIsICJjb250YWluZXJMb2dzTW9kZSIsICJjdXJyZW50TG9nUGF0aCIsICJjdXJyZW50TG9nU2VydmljZU5hbWUiLCAiZmlsZUxvZ3NNb2RlIiwgImxvZ0V2ZW50U291cmNlIiwgImlzU3RyZWFtaW5nIiwgImZldGNoRG5zTG9ncyIsICJsaW5lcyIsICJzZXJ2ZXJJUCIsICJnZXRSY29kZUNvbG9yIiwgInJjb2RlIiwgInJlbmRlckRuc0xvZ0VudHJ5IiwgImxvZyIsICJyY29kZUNvbG9yIiwgImlzQmxvY2tlZCIsICJ1cGRhdGVMb2dzRGlzcGxheSIsICJ1cGRhdGVGaWxlTG9nc0Rpc3BsYXkiLCAidXBkYXRlQ29udGFpbmVyTG9nc0Rpc3BsYXkiLCAibG9nc0NvbnRlbnQiLCAibG9nRWxlbWVudCIsICJvcGVuTG9nc01vZGFsIiwgInBhdXNlQnRuIiwgInN0cmVhbUJ0biIsICJjbG9zZUxvZ3NNb2RhbCIsICJzdG9wTG9nU3RyZWFtaW5nIiwgInN0YXJ0TG9nU3RyZWFtaW5nIiwgImNvbnRhaW5lcklkIiwgImlzRXJyb3IiLCAibGV2ZWxDb2xvciIsICJsZXZlbEJhZGdlIiwgImZldGNoQ29udGFpbmVyTG9ncyIsICJlbmRwb2ludCIsICJyZW5kZXJDb250YWluZXJMb2dFbnRyeSIsICJzdHJlYW1Db2xvciIsICJzdHJlYW1CYWRnZSIsICJvcGVuQ29udGFpbmVyTG9nc01vZGFsIiwgImNvbnRhaW5lck5hbWUiLCAiZmV0Y2hGaWxlTG9ncyIsICJsb2dQYXRoIiwgInJlbmRlckZpbGVMb2dFbnRyeSIsICJsb2dMZXZlbCIsICJvcGVuRmlsZUxvZ3NNb2RhbCIsICJzZXJ2aWNlTmFtZSIsICJsb2FkRXhpc3RpbmdDQXMiLCAiY2FkZHlmaWxlUGF0aCIsICJzZWxlY3QiLCAiY2EiLCAib3B0aW9uIiwgImdlbmVyYXRlQ2FkZHlDb25maWciLCAic3ViZG9tYWluIiwgInNzbFR5cGUiLCAiY2FOYW1lIiwgImV4aXN0aW5nQ2EiLCAiZW5hYmxlQXV0aCIsICJlbmFibGVDb3JzIiwgImN1c3RvbUhlYWRlcnMiLCAidXBzdHJlYW1QYXRoIiwgImhlYWx0aENoZWNrIiwgInRpbWVvdXQiLCAidGFpbHNjYWxlT25seSIsICJjYWRkeUNvbmZpZyIsICJoZWFkZXJzIiwgImNyZWF0ZURuc1JlY29yZCIsICJ0dGwiLCAiZG5zVG9rZW4iLCAiZG9tYWluIiwgImVycm9yVGV4dCIsICJhZGRTZXJ2aWNlVG9Db25maWciLCAic2VydmljZUNvbmZpZyIsICJuZXdTZXJ2aWNlIiwgImFkZFRvQ2FkZHlmaWxlIiwgImN1cnJlbnRFZGl0U2VydmljZSIsICJvcGVuU2VydmljZUVkaXRNb2RhbCIsICJjYXRlZ29yeVNlbGVjdCIsICJjbG9zZVNlcnZpY2VFZGl0TW9kYWwiLCAic2F2ZVNlcnZpY2VDaGFuZ2VzIiwgIm5ld1N1YmRvbWFpbiIsICJuZXdOYW1lIiwgIm5ld1BvcnQiLCAibmV3SXAiLCAibmV3TG9nbyIsICJuZXdDYXRlZ29yeSIsICJvbGRTdWJkb21haW4iLCAiYXBwSW5kZXgiLCAiZmlsZSIsICJyZWFkZXIiLCAiZGF0YVVybCIsICJzaG93RGVsZXRlTW9kYWwiLCAiaGFzQ29udGFpbmVyIiwgInJlc29sdmUiLCAiY29udGFpbmVySW5mbyIsICJoZWxwIiwgImNhbmNlbEJ0biIsICJyZW1vdmVCdG4iLCAiZGVsZXRlQnRuIiwgImNsZWFudXAiLCAiaGFuZGxlQ2FuY2VsIiwgImhhbmRsZVJlbW92ZSIsICJoYW5kbGVEZWxldGUiLCAiaGFuZGxlQmFja2Ryb3AiLCAidXBkYXRlQ29udGFpbmVyIiwgInNlcnZpY2VJZCIsICJkZWxldGVTZXJ2aWNlIiwgImRlbGV0ZUNvbnRhaW5lciIsICJyZXN1bHRzIiwgInNlcnZpY2VJUCIsICJkbnNSZXN1bHQiLCAiY2FkZHlSZXN1bHQiLCAiaW5kZXgiLCAiY3VzdG9tQXBwcyIsICJsb2NhbEluZGV4IiwgInNlcnZpY2VSZXN1bHQiLCAiaGFzRXJyb3JzIiwgImVycm9yTWVzc2FnZXMiLCAic3VjY2Vzc1N0YXRlcyIsICJpc1N1Y2Nlc3MiLCAiZGVyaXZlU3ViZG9tYWluIiwgImdldFNtYXJ0U3NsRGVmYXVsdCIsICJ1cGRhdGVTZXJ2aWNlUHJldmlldyIsICJRVUlDS19JUFMiLCAiZG5zUHJldmlldyIsICJ1cmxQcmV2aWV3IiwgImNvbmZpZ1ByZXZpZXciLCAiZGV0ZWN0TmV0d29ya0lQcyIsICJsYW5CdG4iLCAidHNCdG4iLCAiaXBJbnB1dCIsICJpbml0UXVpY2tJUEJ1dHRvbnMiLCAiY3VycmVudElQIiwgIm9wZW5BZGRTZXJ2aWNlTW9kYWwiLCAibW9kYWxDb250ZW50IiwgInNzbFNlbGVjdCIsICJ0YWlsc2NhbGVTdGF0dXMiLCAidGFpbHNjYWxlQ2hlY2tib3giLCAic2V0dXBTZXJ2aWNlVHlwZVN3aXRjaGluZyIsICJsb2NhbFJhZGlvIiwgImV4dGVybmFsUmFkaW8iLCAibG9jYWxDb25maWciLCAiZXh0ZXJuYWxDb25maWciLCAidGFiTG9jYWwiLCAidGFiRXh0ZXJuYWwiLCAic3dpdGNoU2VydmljZVR5cGUiLCAic2V0dXBBdXRvU3ViZG9tYWluIiwgIm5hbWVJbnB1dCIsICJzdWJkb21haW5JbnB1dCIsICJzdWJkb21haW5QcmV2aWV3IiwgInVzZXJFZGl0ZWRTdWJkb21haW4iLCAiZXh0TmFtZUlucHV0IiwgImV4dFN1YmRvbWFpbklucHV0IiwgImV4dFN1YmRvbWFpblByZXZpZXciLCAiZXh0RG9tYWluUHJldmlldyIsICJ1c2VyRWRpdGVkRXh0U3ViZG9tYWluIiwgImNyZWF0ZUV4dGVybmFsU2VydmljZSIsICJleHRlcm5hbFVybCIsICJsb2dvIiwgImljb24iLCAiY3JlYXRlRG5zIiwgImNyZWF0ZUNhZGR5IiwgInByb3h5SXAiLCAicHJlc2VydmVIb3N0IiwgImZvbGxvd1JlZGlyZWN0cyIsICJjYXRlZ29yeSIsICJkZWZhdWx0U2VydmljZXMiLCAiY3VzdG9tU2VydmljZXMiLCAiY2xvc2VBZGRTZXJ2aWNlTW9kYWwiLCAicGFydHMiLCAic3ViUHJldiIsICJleHRTdWJQcmV2IiwgImV4dE5hbWUiLCAiZXh0U3ViIiwgImV4dFVybCIsICJleHRMb2dvIiwgImV4dEljb24iLCAibG9jYWxPcHRzIiwgImV4dE9wdHMiLCAiY3JlYXRlTmV3U2VydmljZSIsICJzdGF0dXNQYXJ0cyIsICJleGlzdGluZ0NhQ29uZmlnIiwgImN1c3RvbUNhQ29uZmlnIiwgImJ1dHRvbiIsICJkbnNDb25maWciLCAiZWxlbWVudCIsICJsb2FkQ3VzdG9tU2VydmljZXMiLCAiZXMiLCAicmVjb25uZWN0RGVsYXkiLCAiTUFYX1JFQ09OTkVDVCIsICJjb25uZWN0IiwgInVwZGF0ZXNCdG4iLCAic2VhcmNoSW5wdXQiLCAic3RhdHVzU2VsZWN0IiwgImNvdW50U3BhbiIsICJnZXRDYXRlZ29yeUxpc3QiLCAic2VlbiIsICJmcm9tQ2FyZHMiLCAiY2F0IiwgImFwaUNhdHMiLCAicmVmcmVzaENhdGVnb3J5RHJvcGRvd24iLCAibGlzdCIsICJvIiwgInVwZGF0ZUZpbHRlciIsICJxdWVyeSIsICJzdGF0dXNGaWx0ZXIiLCAiY2F0ZWdvcnlGaWx0ZXIiLCAiY2FyZHMiLCAidmlzaWJsZUNvdW50IiwgInRvdGFsIiwgImRlYm91bmNlIiwgImRlbGF5IiwgImFyZ3MiLCAiYmF0Y2hCdG4iLCAiYmF0Y2hCYXIiLCAiYmF0Y2hDb3VudCIsICJzdGFydEJ0biIsICJzdG9wQnRuIiwgImJhdGNoTW9kZSIsICJzZWxlY3RlZENvbnRhaW5lcnMiLCAiZW50ZXJCYXRjaE1vZGUiLCAidXBkYXRlU2VsZWN0ZWRDb3VudCIsICJjaGVja2JveCIsICJleGl0QmF0Y2hNb2RlIiwgImNiIiwgImJhdGNoQWN0aW9uIiwgImFjdGlvbiIsICJjb250YWluZXJzIiwgImFjdGlvbkxhYmVsIiwgImJ0bnMiLCAic3VjY2VzcyIsICJmYWlsZWQiLCAiZXJyb3JzIl0KfQo=
|